Showing preview only (439K chars total). Download the full file or copy to clipboard to get everything.
Repository: JakeWharton/RxBinding
Branch: master
Commit: 78f7ebdeb9dc
Files: 235
Total size: 367.0 KB
Directory structure:
gitextract_m_pj7wzf/
├── .github/
│ └── workflows/
│ └── build.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE.txt
├── README.md
├── RELEASING.md
├── build.gradle
├── gradle/
│ ├── gradle-mvn-push.gradle
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── rxbinding/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jakewharton/
│ │ │ └── rxbinding4/
│ │ │ ├── internal/
│ │ │ │ └── MainThreadKtTest.java
│ │ │ ├── view/
│ │ │ │ ├── RxMenuItemTest.java
│ │ │ │ ├── RxViewAttachTest.java
│ │ │ │ ├── RxViewAttachTestActivity.java
│ │ │ │ ├── RxViewGroupTest.java
│ │ │ │ ├── RxViewSystemUiVisibilityTest.java
│ │ │ │ ├── RxViewSystemUiVisibilityTestActivity.java
│ │ │ │ └── RxViewTest.java
│ │ │ └── widget/
│ │ │ ├── RxAbsListViewTest.java
│ │ │ ├── RxAbsListViewTestActivity.java
│ │ │ ├── RxAdapterTest.java
│ │ │ ├── RxAdapterViewTest.java
│ │ │ ├── RxAdapterViewTestActivity.java
│ │ │ ├── RxAutoCompleteTextViewTest.java
│ │ │ ├── RxAutoCompleteTextViewTestActivity.java
│ │ │ ├── RxCompoundButtonTest.java
│ │ │ ├── RxPopupMenuTest.java
│ │ │ ├── RxPopupMenuTestActivity.java
│ │ │ ├── RxRadioGroupTest.java
│ │ │ ├── RxRatingBarTest.java
│ │ │ ├── RxRatingBarTestActivity.java
│ │ │ ├── RxSearchViewTest.java
│ │ │ ├── RxSearchViewTestActivity.java
│ │ │ ├── RxSeekBarTest.java
│ │ │ ├── RxSeekBarTestActivity.java
│ │ │ ├── RxTextViewTest.java
│ │ │ ├── RxToolbarTest.java
│ │ │ └── RxToolbarTestActivity.java
│ │ └── res/
│ │ ├── drawable/
│ │ │ └── icon.xml
│ │ └── values/
│ │ ├── ids.xml
│ │ └── strings.xml
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ ├── InitialValueObservable.kt
│ ├── internal/
│ │ ├── mainThread.kt
│ │ └── true.kt
│ ├── view/
│ │ ├── MenuItemActionViewEvent.kt
│ │ ├── MenuItemActionViewEventObservable.kt
│ │ ├── MenuItemClickObservable.kt
│ │ ├── ViewAttachEvent.kt
│ │ ├── ViewAttachEventObservable.kt
│ │ ├── ViewAttachesObservable.kt
│ │ ├── ViewClickObservable.kt
│ │ ├── ViewDragObservable.kt
│ │ ├── ViewFocusChangeObservable.kt
│ │ ├── ViewGroupHierarchyChangeEvent.kt
│ │ ├── ViewGroupHierarchyChangeEventObservable.kt
│ │ ├── ViewHoverObservable.kt
│ │ ├── ViewKeyObservable.kt
│ │ ├── ViewLayoutChangeEventObservable.kt
│ │ ├── ViewLayoutChangeObservable.kt
│ │ ├── ViewLongClickObservable.kt
│ │ ├── ViewScrollChangeEventObservable.kt
│ │ ├── ViewSystemUiVisibilityChangeObservable.kt
│ │ ├── ViewTouchObservable.kt
│ │ ├── ViewTreeObserverDrawObservable.kt
│ │ ├── ViewTreeObserverGlobalLayoutObservable.kt
│ │ ├── ViewTreeObserverPreDrawObservable.kt
│ │ └── ViewVisibilityConsumer.kt
│ └── widget/
│ ├── AbsListViewScrollEventObservable.kt
│ ├── AdapterDataChangeObservable.kt
│ ├── AdapterViewItemClickEventObservable.kt
│ ├── AdapterViewItemClickObservable.kt
│ ├── AdapterViewItemLongClickEventObservable.kt
│ ├── AdapterViewItemLongClickObservable.kt
│ ├── AdapterViewItemSelectionObservable.kt
│ ├── AdapterViewSelectionEvent.kt
│ ├── AdapterViewSelectionObservable.kt
│ ├── AutoCompleteTextViewItemClickEventObservable.kt
│ ├── CompoundButtonCheckedChangeObservable.kt
│ ├── PopupMenuDismissObservable.kt
│ ├── PopupMenuItemClickObservable.kt
│ ├── RadioGroupCheckedChangeObservable.kt
│ ├── RadioGroupToggleCheckedConsumer.kt
│ ├── RatingBarRatingChangeEventObservable.kt
│ ├── RatingBarRatingChangeObservable.kt
│ ├── SearchViewQueryConsumer.kt
│ ├── SearchViewQueryTextChangeEventsObservable.kt
│ ├── SearchViewQueryTextChangesObservable.kt
│ ├── SearchViewQueryTextEvent.kt
│ ├── SeekBarChangeEvent.kt
│ ├── SeekBarChangeEventObservable.kt
│ ├── SeekBarChangeObservable.kt
│ ├── TextViewAfterTextChangeEventObservable.kt
│ ├── TextViewBeforeTextChangeEventObservable.kt
│ ├── TextViewEditorActionEventObservable.kt
│ ├── TextViewEditorActionObservable.kt
│ ├── TextViewTextChangeEventObservable.kt
│ ├── TextViewTextChangesObservable.kt
│ ├── ToolbarItemClickObservable.kt
│ └── ToolbarNavigationClickObservable.kt
├── rxbinding-appcompat/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── appcompat/
│ │ ├── RxActionMenuViewTest.java
│ │ ├── RxPopupMenuTest.java
│ │ ├── RxPopupMenuTestActivity.java
│ │ ├── RxSearchViewTest.java
│ │ ├── RxSearchViewTestActivity.java
│ │ ├── RxToolbarTest.java
│ │ └── RxToolbarTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── appcompat/
│ ├── ActionMenuViewItemClickObservable.kt
│ ├── PopupMenuDismissObservable.kt
│ ├── PopupMenuItemClickObservable.kt
│ ├── SearchViewQueryTextChangeEventsObservable.kt
│ ├── SearchViewQueryTextChangesObservable.kt
│ ├── SearchViewQueryTextEvent.kt
│ ├── SearchViewSetQueryConsumer.kt
│ ├── ToolbarItemClickObservable.kt
│ └── ToolbarNavigationClickObservable.kt
├── rxbinding-core/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── core/
│ │ ├── RxNestedScrollViewTest.java
│ │ └── RxNestedScrollViewTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── core/
│ └── NestedScrollViewScrollChangeEventObservable.kt
├── rxbinding-drawerlayout/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── drawerlayout/
│ │ ├── RxDrawerLayoutTest.java
│ │ └── RxDrawerLayoutTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── drawerlayout/
│ ├── DrawerLayoutDrawerOpenedObservable.kt
│ └── DrawerLayoutOpenConsumer.kt
├── rxbinding-leanback/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── leanback/
│ │ ├── RxSearchBarTest.java
│ │ ├── RxSearchBarTestActivity.java
│ │ ├── RxSearchEditTextTest.java
│ │ └── RxSearchEditTextTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── leanback/
│ ├── SearchBarSearchQueryChangeEventsObservable.kt
│ ├── SearchBarSearchQueryChangesObservable.kt
│ ├── SearchBarSearchQueryEvent.kt
│ └── SearchEditTextKeyboardDismissObservable.kt
├── rxbinding-material/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jakewharton/
│ │ │ └── rxbinding4/
│ │ │ └── material/
│ │ │ ├── RxAppBarLayoutTest.java
│ │ │ ├── RxBottomNavigationViewTest.java
│ │ │ ├── RxChipTest.kt
│ │ │ ├── RxFloatingActionButtonTest.java
│ │ │ ├── RxNavigationViewTest.java
│ │ │ ├── RxSnackbarTest.java
│ │ │ ├── RxSwipeDismissBehaviorTest.java
│ │ │ ├── RxSwipeDismissBehaviorTestActivity.java
│ │ │ └── RxTabLayoutTest.java
│ │ └── res/
│ │ ├── menu/
│ │ │ └── menu.xml
│ │ └── values/
│ │ └── strings.xml
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── material/
│ ├── AppBarLayoutOffsetChangeObservable.kt
│ ├── BottomNavigationViewItemSelectionsObservable.kt
│ ├── ChipCloseIconClicksObservable.kt
│ ├── FloatingActionButtonVisibilityConsumer.kt
│ ├── NavigationViewItemSelectionsObservable.kt
│ ├── SnackbarDismissesObservable.kt
│ ├── SwipeDismissBehaviorObservable.kt
│ ├── TabLayoutSelectConsumer.kt
│ ├── TabLayoutSelectionEvent.kt
│ ├── TabLayoutSelectionEventObservable.kt
│ └── TabLayoutSelectionsObservable.kt
├── rxbinding-recyclerview/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── recyclerview/
│ │ ├── RxRecyclerViewAdapterTest.java
│ │ ├── RxRecyclerViewTest.java
│ │ └── RxRecyclerViewTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── recyclerview/
│ ├── RecyclerAdapterDataChangeObservable.kt
│ ├── RecyclerViewChildAttachStateChangeEventObservable.kt
│ ├── RecyclerViewChildAttachStateChangeEvents.kt
│ ├── RecyclerViewFlingEventObservable.kt
│ ├── RecyclerViewScrollEventObservable.kt
│ └── RecyclerViewScrollStateChangeObservable.kt
├── rxbinding-slidingpanelayout/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── slidingpanelayout/
│ │ ├── RxSlidingPaneLayoutTest.java
│ │ └── RxSlidingPaneLayoutTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── slidingpanelayout/
│ ├── SlidingPaneLayoutOpenConsumer.kt
│ ├── SlidingPaneLayoutPaneOpenedObservable.kt
│ └── SlidingPaneLayoutSlideObservable.kt
├── rxbinding-swiperefreshlayout/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jakewharton/
│ │ │ └── rxbinding4/
│ │ │ └── swiperefreshlayout/
│ │ │ ├── RxSwipeRefreshLayoutTest.java
│ │ │ └── RxSwipeRefreshLayoutTestActivity.java
│ │ └── res/
│ │ └── values/
│ │ └── ids.xml
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── swiperefreshlayout/
│ └── SwipeRefreshLayoutRefreshObservable.kt
├── rxbinding-viewpager/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── viewpager/
│ │ ├── RxViewPagerTest.java
│ │ └── RxViewPagerTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── viewpager/
│ ├── ViewPagerPageScrollStateChangedObservable.kt
│ ├── ViewPagerPageScrolledObservable.kt
│ └── ViewPagerPageSelectedObservable.kt
├── rxbinding-viewpager2/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── viewpager2/
│ │ ├── RxViewPager2Test.kt
│ │ └── RxViewPager2TestActivity.kt
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── viewpager2/
│ ├── PageScrollStateChangedObservable.kt
│ ├── PageScrolledObservable.kt
│ └── PageSelectedObservable.kt
├── settings.gradle
└── testing-utils/
├── build.gradle
└── src/
└── main/
├── AndroidManifest.xml
└── java/
└── com/
└── jakewharton/
└── rxbinding4/
├── MotionEventUtil.java
├── RecordingObserver.java
├── RxBindingTestRunner.java
├── TouchUtilsBackport.java
├── UnsafeRunnable.java
└── ViewDirtyIdlingResource.java
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/build.yml
================================================
name: build
on: [push, pull_request]
env:
GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4g -Dorg.gradle.daemon=false -Dkotlin.incremental=false"
jobs:
test:
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
module:
- rxbinding
- rxbinding-appcompat
- rxbinding-core
- rxbinding-drawerlayout
- rxbinding-leanback
- rxbinding-material
- rxbinding-recyclerview
- rxbinding-slidingpanelayout
- rxbinding-swiperefreshlayout
- rxbinding-viewpager
- rxbinding-viewpager2
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
- uses: actions/cache@v1
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-${{ hashFiles('**/build.gradle') }}-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties') }}
- name: Run Tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 18
script: ./gradlew ${{ matrix.module }}:connectedCheck --stacktrace
publish:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master'
needs: test
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure JDK
uses: actions/setup-java@v1
with:
java-version: 14
- name: Upload Artifacts
run: ./gradlew uploadArchives
env:
ORG_GRADLE_PROJECT_SONATYPE_NEXUS_USERNAME: ${{ secrets.SONATYPE_NEXUS_USERNAME }}
ORG_GRADLE_PROJECT_SONATYPE_NEXUS_PASSWORD: ${{ secrets.SONATYPE_NEXUS_PASSWORD }}
================================================
FILE: .gitignore
================================================
# IntelliJ IDEA
.idea
*.iml
annotations
# Gradle
.gradle
gradlew.bat
build
local.properties
reports
jacoco.exec
.DS_Store
================================================
FILE: CHANGELOG.md
================================================
Change Log
==========
Version 4.0.0 *(2020-05-19)*
----------------------------
This version updates to support RxJava 3. No functional changes.
The groupId and package name are now `com.jakewharton.rxbinding4`.
Version 3.1.0 *(2019-11-22)*
----------------------------
* New bindings!
* `rxbinding-viewpager2`:
* `ViewPager2`:
* `pageSelections`
* `pageScrollEvents`
* `pageScrollStateChanges`
Version 3.0.0 *(2019-07-23)*
----------------------------
* New: Maven coordinates are now `com.jakewharton.rxbinding3:rxbinding` (et al). Package name is now
`com.jakewharton.rxbinding3.*`.
* New: AndroidX support! The library is now AndroidX-only. For use with the old support libraries use version 2.2.0.
* New: Library is now Kotlin-first and `-kotlin` artifacts are gone. Java callers get the same API as before. Kotlin
callers get the extension-based API. Event classes are now Kotlin `data` classes instead of using AutoValue. RxJava's
`Predicate` and Java's `Callable` are no longer used and are replaced by Kotlin functional types. For Java callers
these can still be used as `Function1` but the use of lambdas is encouraged.
* New: Observables which signal an event without any information use `Unit` instead of `Object`. (Note: This was
always true for Kotlin extension users)
* All deprecated methods have been removed.
* Some trivial consumer factories have been removed. You can subscribe lambdas to the stream to replicate their functionality.
Changes from 3.0.0-alpha2:
* Fix: Correct binary compatibility with Material Design Components v1.1.0.
Version 3.0.0-alpha2 *(2018-12-18)*
-----------------------------------
* Fix: Correct nullability of adapter view callback's clicked view.
Version 3.0.0-alpha1 *(2018-10-17)*
-----------------------------------
* New: Maven coordinates are now `com.jakewharton.rxbinding3:rxbinding` (et al). Package name is now
`com.jakewharton.rxbinding3.*`.
* New: AndroidX support! The library is now AndroidX-only. For use with the old support libraries use version 2.2.0.
* New: Library is now Kotlin-first and `-kotlin` artifacts are gone. Java callers get the same API as before. Kotlin
callers get the extension-based API. Event classes are now Kotlin `data` classes instead of using AutoValue. RxJava's
`Predicate` and Java's `Callable` are no longer used and are replaced by Kotlin functional types. For Java callers
these can still be used as `Function1` but the use of lambdas is encouraged.
* New: Observables which signal an event without any information use `Unit` instead of `Object`. (Note: This was
always true for Kotlin extension users)
* All deprecated methods have been removed.
* Some trivial consumer factories have been removed. You can subscribe lambdas to the stream to replicate their functionality.
Version 2.2.0 *(2018-09-25)*
----------------------------
* New bindings!
* `rxbinding-support-v4`:
* `ViewPager`:
* `pageScrollEvents`
* `rxbinding-recyclerview-v7`:
* `RecyclerView`:
* `flingEvents`
* New: Target Java 8 bytecode. Use AGP 3.2 or newer and enable Java 8 source/target compatibility.
* Deprecate `RxMenuItemCompat` which is no longer needed. Use `RxMenuItem` directly.
* Deprecate more simple consumers which delegate directly to a method. You should use method references for these instead. For example, `RxView.enabled(view)` becomes `view::setEnabled`.
Version 2.1.1 *(2018-02-12)*
----------------------------
* Fix: Include consumer ProGuard rules to prevent warning about AutoValue annotation.
* Fix: Useless `BuildConfig` classes are no longer included.
* Fix: Eliminate Java interop checks for Kotlin extensions as they're only for Kotlin consumers and the checks exist in the Java code they delegate to anyway.
Version 2.1.0 *(2018-01-30)*
----------------------------
* New bindings!
* `rxbinding-design`:
* `FloatingActionButton`:
* `visibility`: Shows or hides FAB.
* Use add/remove callback for Snackbar dismisses.
* Deprecate simple consumers which delegate directly to a method. You should use method references for these instead. For example, `RxView.enabled(view)` becomes `view::setEnabled`.
* Fix: Propagate `@RequiresApi` annotations to Kotlin extensions.
Version 2.0.0 *(2017-03-06)*
----------------------------
This version only supports RxJava 2.
* New: Maven coordinates are now `com.jakewharton.rxbinding2:rxbinding` (et al). Package name is now
`com.jakewharton.rxbinding2.*`.
* New: Bindings which emit an initial value now return an `InitialValueObservable<T>` which offers a
type-safe way to skip that value via `skipInitialValue()`.
* Event objects which previously contained an enum now use an abstract event type and subclasses for
easier filtering using the `ofType(Class)` operator.
* Bindings which previously emitted null using the `Void` type now use `Object` and omit an opaque
item instance for which no guarantees are provided. You can neither rely on the emitted instance
being the same, equal, nor different for subsequent events.
Version 1.0.1 *(2017-02-28)*
----------------------------
* Fix: Reduce method count cost for Kotlin modules.
Version 1.0.0 *(2016-12-01)*
----------------------------
* New bindings!
* `rxbinding`:
* `Toolbar`:
* `title` - Toolbar title.
* `titleRes` - Toolbar title from resource.
* `subtitle` - Toolbar subtitle.
* `subtitleRes` - Toolbar subtitle from resource.
* `View`:
* `keys` - View key events.
* `rxbinding-appcompat-v7`:
* `Toolbar`:
* `title` - Toolbar title.
* `titleRes` - Toolbar title from resource.
* `subtitle` - Toolbar subtitle.
* `subtitleRes` - Toolbar subtitle from resource.
* `rxbinding-design`:
* `BottomNavigationView`:
* `itemSelections` - Navigation item selections.
* `rxbinding-support-v4`:
* `NestedScrollView`:
* `scrollChangeEvents` - Nested scrolling change events.
* `SlidingPaneLayout`:
* `open` - Opens the panel.
* `panelOpens` - Sliding panel opens.
* `panelSlides` - Sliding panel open offsets.
* `ViewPager`:
* `pageScrollStateChanges` - Page scrolling change events.
* `currentItem` - Sets the current page item.
* New: `rxbinding-support-v4` now only depends on `support-core-ui`.
* Fix: Kotlin `Action` generic types now properly allow nulls when applicable.
* Fix: Correct nullability of `TextViewAfterTextChangeEvent`'s `editable` property.
* Fix: Correct nullability of `TextViewEditorActionEvent`'s `keyEvent` property.
Version 0.4.0 *(2016-02-18)*
----------------------------
* New bindings!
* `rxbinding`:
* `RxAbsListView`:
* `scrollEvents` - List scroll events.
* `RxAutoCompleteTextView`:
* `completionHint` - Sets the hint text at the bottom of the suggestion list.
* `threshold` - Sets the minimum number of characters before suggestions are shown.
* `RxPopupMenu`:
* `itemClicks` - Menu item clicks.
* `dismisses` - Menu item dismissal.
* `rxbinding-appcompat-v7`:
* `RxActionMenuView`:
* `itemClicks` - Menu item clicks.
* `RxPopupMenu`:
* `itemClicks` - Menu item clicks.
* `dismisses` - Menu item dismissal.
* `rxbinding-design`:
* `RxTextInputLayout`:
* `error` - Sets the error text for the text input.
* `errorRes` - Sets the error text resource for the text input.
* `rxbinding-support-v4`:
* `RxMenuItemCompat`:
* `actionViewEvents`- Menu item action view events.
* Update Kotlin modules dependency to v1.0.0.
* Fix: Remove 76 needless synthetic accessor methods.
Version 0.3.0 *(2015-10-22)*
----------------------------
* New modules!
* `rxbinding-leanback-v17` (and `rxbinding-leanback-v17-kotlin`) for the 'Leanback Support Library':
* `RxSearchBar`:
* `searchQuery` - Sets the query text.
* `searchQueryChanges` - Query text changes.
* `searchQueryChangeEvents` - Query text change events.
* `RxSearchEditText`:
* `keyboardDismisses` - Keyboard dismisses.
* New bindings!
* `rxbinding`:
* `RxAutoCompleteTextView`:
* `itemClickEvents` - Suggestion item clicks.
* `RxCheckedTextView`:
* `checked` - Sets the checked state.
* `RxMenuItem`:
* `actionViewEvents` - Action view expand and collapse events.
* `checked` - Sets the checked state.
* `clicks` - Item clicks.
* `enabled` - Sets the enabled state.
* `icon` - Sets the icon.
* `iconRes` - Sets the icon using a resource.
* `title` - Sets the title.
* `titleRes` - Sets the title using a resources.
* `visible` - Sets the visible state.
* `RxSeekBar`:
* `userChanges` - Only user value changes.
* `systemChanges` - Only system value changes.
* `RxTextView`:
* `afterTextChangeEvents` - After text change events.
* `beforeTextChangeEvents` - Before text change events.
* `color` - Sets the text color.
* `error` - Sets the error text.
* `errorRes` - Sets the error text using a resource.
* `hint` - Sets the hint text.
* `hintRes` - Sets the hint text using a resource.
* `RxToolbar`:
* `navigationClicks` - Clicks on the navigation view.
* `RxView`:
* `draws` - ViewTreeObserver draw events.
* `globalLayouts` - ViewTreeObserver global layout events.
* `hovers` - View hover `MotionEvent`.
* `hoverEvents` - View hover `MotionEvent` events.
* `layoutChanges` - ViewTreeObserver layout changes.
* `layoutChangeEvents` - ViewTreeObserver layout change events.
* `preDraws` - ViewTreeObserver pre-draw events.
* `scrollChangeEvents` - Scroll offset change events.
* `systemUiVisibilityChanges` - System UI visibility changes.
* `RxViewGroup`:
* `changeEvents` - Child add and remove events.
* `rxbinding-appcompat-v7`:
* `RxToolbar`:
* `navigationClicks` - Clicks on the navigation view.
* `rxbinding-design`:
* `RxAppBarLayout`:
* `offsetChanges` - Offset value changes.
* `RxSwipeDismissBehavior`:
* `dismisses` - Dismiss events.
* `RxTextInputLayoutTest`:
* `counterEnabled` - Sets the enabled state of the counter.
* `counterMaxLength` - Sets the maximum length of the counter.
* `hint` - Sets the hint text.
* `hintRest` - Sets the hint text using a resource.
* `rxbinding-recyclerview-v7`:
* `RxRecyclerView`:
* `scrollStateChanges` - Scroll state changes (dragging, settling, idling).
* `RxRecyclerViewAdapter`:
* `childAttachStateChangeEvents` - Child attach and detach events.
* `dataChanges` - Adapter data changes.
* `rxbinding-support-v4`:
* `RxViewPager`:
* `pageSelections` - Page index selections.
* Update Kotlin modules dependency to v1.0.0-beta-1038.
* Update support library dependencies to v23.1.0.
* Fix: Bindings whose values are irrelevant now use `Void` instead of `Object` (and `Unit` in
Kotlin).
* Fix: Remove binding overloads which provided event objects that included no additional
information (aside from the source view). To include the source view for an event, add it with
the `map` operator (e.g., `RxFoo.bar(sourceView).map(data -> new Pair<>(sourceView, data))`).
* `RxCompoundButton.checkedChangeEvents`
* `RxRadioGroup.checkedChangeEvents`
* `RxRecyclerView.scrollStateChangeEvents`
* `RxView.clickEvents`
* `RxView.dragEvents`
* `RxView.focusChangeEvents`
* `RxView.hoverEvents`
* `RxView.longClickEvents`
* `RxView.touchEvents`
Version 0.2.0 *(2015-08-23)*
----------------------------
* New modules!
* `rxbinding-appcompat-v7` (and `rxbinding-appcompat-v7-kotlin`) for the 'AppCompat Support Library':
* `RxSearchView`:
* `queryTextChanges` - Query text changes.
* `queryTextChangeEvents` - Query text change events.
* `query` - Sets the query text.
* `RxToolbar`:
* `itemClicks` - Item clicks.
* `rxbinding-design` (and `rxbinding-design-kotlin`) for the 'Design Support Library':
* `RxNavigationView`:
* `itemSelections` - Item selections.
* `RxSnackbar`:
* `dismisses` - Dismiss events.
* `RxTabLayout`:
* `selections` - Tab selections.
* `selectionEvents` - Tab selection, reselection, and unselection events.
* `select` - Sets the selected tab.
* `rxbinding-recyclerview-v7` (and `rxbinding-recyclerview-v7-kotlin`) for the 'RecyclerView Support Library':
* `RxRecyclerView`:
* `scrollEvents` - Scroll events.
* `scrollStateChangeEvents` - Scroll state change events (dragging, settling, idling).
* New bindings!
* `rxbinding`:
* `RxSearchView`:
* `queryTextChanges` - Query text changes.
* `queryTextChangeEvents` - Query text change events.
* `query` - Sets the query text.
* `RxSwipeRefreshLayout`:
* `refreshes` - Refresh events.
* `refreshing` - Whether showing the refreshing indicator.
* `RxTextSwitcher`:
* `text` - Sets the text to display.
* `currentText` - Sets the current displayed text.
* `RxToolbar`:
* `itemClicks` - Item clicks.
* `RxView`:
* `attaches` - Attach indication.
* `attachEvents` - Attach and detach events.
* `detaches` - Detach indication.
* Added `@CheckResult` to methods which will generate lint warnings if the return value is ignored.
* Added `@NonNull` to methods to indicate to lint that they will never return null and added to parameters
to indicate to lint for which arguments is null not allowed. Explicit null checks have been removed.
* Update Kotlin modules to Kotlin v0.12.1230.
* Update support library dependencies to v23.0.0.
* Minimum SDK version is now 14 because reasons.
* Fix: Kotlin modules now have correct dependencies on the corresponding Java modules.
Version 0.1.0 *(2015-08-02)*
----------------------------
Initial release.
================================================
FILE: LICENSE.txt
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
RxBinding
=========
RxJava binding APIs for Android UI widgets from the platform and support libraries.
Download
--------
Platform bindings:
```groovy
implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0'
```
AndroidX library bindings:
```groovy
implementation 'com.jakewharton.rxbinding4:rxbinding-core:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-appcompat:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-drawerlayout:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-leanback:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-recyclerview:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-slidingpanelayout:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-swiperefreshlayout:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-viewpager:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-viewpager2:4.0.0'
```
Google 'material' library bindings:
```groovy
implementation 'com.jakewharton.rxbinding4:rxbinding-material:4.0.0'
```
Snapshots of the development version are available in [Sonatype's `snapshots` repository][snap].
License
-------
Copyright (C) 2015 Jake Wharton
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
[snap]: https://oss.sonatype.org/content/repositories/snapshots/
================================================
FILE: RELEASING.md
================================================
Releasing
========
1. Change the version in `gradle.properties` to a non-SNAPSHOT version.
2. Update the `CHANGELOG.md` for the impending release.
3. Update the `README.md` with the new version.
4. `git commit -am "Prepare for release X.Y.Z."` (where X.Y.Z is the new version)
5. `git tag -a X.Y.Z -m "Version X.Y.Z"` (where X.Y.Z is the new version)
6. `./gradlew clean uploadArchives`
7. Update the `gradle.properties` to the next SNAPSHOT version.
8. `git commit -am "Prepare next development version."`
9. `git push && git push --tags`
10. Visit [Sonatype Nexus](https://oss.sonatype.org/) and promote the artifact.
================================================
FILE: build.gradle
================================================
buildscript {
ext.buildConfig = [
'minSdkVersion': 14,
'compileSdkVersion': 29,
]
ext.versions = [
'kotlin': '1.3.72',
]
ext.deps = [
'kotlinStdlib': "org.jetbrains.kotlin:kotlin-stdlib:${versions.kotlin}",
'androidXAnnotations': 'androidx.annotation:annotation:1.0.0',
'androidXAppCompat': 'androidx.appcompat:appcompat:1.0.0',
'androidXCore': 'androidx.core:core:1.0.0',
'androidXDrawerLayout': 'androidx.drawerlayout:drawerlayout:1.0.0',
'androidXLeanback': 'androidx.leanback:leanback:1.0.0',
'androidXRecyclerView': 'androidx.recyclerview:recyclerview:1.0.0',
'androidXSlidingPaneLayout': 'androidx.slidingpanelayout:slidingpanelayout:1.0.0',
'androidXSwipeRefreshLayout': 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0',
'androidXViewPager': 'androidx.viewpager:viewpager:1.0.0',
'androidXViewPager2': 'androidx.viewpager2:viewpager2:1.0.0',
'androidXTestCore': 'androidx.test:core:1.1.0',
'androidXTestRunner': 'androidx.test:runner:1.1.1',
'androidXTestRules': 'androidx.test:rules:1.1.1',
'androidXTestEspresso': 'androidx.test.espresso:espresso-core:3.1.1',
'androidXTestEspressoContrib': 'androidx.test.espresso:espresso-contrib:3.1.1',
'googleMaterial': 'com.google.android.material:material:1.0.0',
'rxJava': 'io.reactivex.rxjava3:rxjava:3.0.3',
'rxAndroid': 'io.reactivex.rxjava3:rxandroid:3.0.0',
'junit': 'junit:junit:4.12',
]
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}"
}
repositories {
mavenCentral()
google()
jcenter()
}
}
subprojects {
repositories {
mavenCentral()
google()
jcenter()
}
group = GROUP
version = VERSION_NAME
afterEvaluate {
// The default 'assemble' task only applies to normal variants. Add test variants as well.
def assembleProvider = tasks.named('assemble')
android.testVariants.all { variant ->
assembleProvider.configure {
it.dependsOn(variant.assembleProvider)
}
}
// Disable BuildConfig generation.
// TODO replace with https://issuetracker.google.com/issues/72050365 once released.
android.libraryVariants.all {
it.generateBuildConfigProvider.configure {
enabled = false
}
}
tasks.withType(com.android.build.gradle.internal.tasks.AndroidTestTask) { task ->
task.doFirst {
logging.level = LogLevel.INFO
}
task.doLast {
logging.level = LogLevel.LIFECYCLE
}
}
}
}
================================================
FILE: gradle/gradle-mvn-push.gradle
================================================
/*
* Copyright 2013 Chris Banes
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
apply plugin: 'maven'
apply plugin: 'signing'
def isReleaseBuild() {
return VERSION_NAME.contains("SNAPSHOT") == false
}
def getRepositoryUsername() {
return hasProperty('SONATYPE_NEXUS_USERNAME') ? SONATYPE_NEXUS_USERNAME : ""
}
def getRepositoryPassword() {
return hasProperty('SONATYPE_NEXUS_PASSWORD') ? SONATYPE_NEXUS_PASSWORD : ""
}
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION_NAME
repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
pom.project {
name POM_NAME
packaging POM_PACKAGING
description POM_DESCRIPTION
url POM_URL
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
licenses {
license {
name POM_LICENCE_NAME
url POM_LICENCE_URL
distribution POM_LICENCE_DIST
}
}
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
}
}
}
}
}
}
signing {
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
task androidJavadocs(type: Javadoc) {
if (!project.plugins.hasPlugin('kotlin-android')) {
source = android.sourceSets.main.java.srcDirs
}
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
exclude '**/internal/*'
include '**/*.java'
if (JavaVersion.current().isJava8Compatible()) {
options.addStringOption('Xdoclint:none', '-quiet')
}
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.source
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
}
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
================================================
FILE: gradle.properties
================================================
GROUP=com.jakewharton.rxbinding4
VERSION_NAME=4.0.1-SNAPSHOT
POM_DESCRIPTION=RxJava binding APIs for Android's UI widgets.
POM_URL=https://github.com/JakeWharton/RxBinding/
POM_SCM_URL=https://github.com/JakeWharton/RxBinding/
POM_SCM_CONNECTION=scm:git:git://github.com/JakeWharton/RxBinding.git
POM_SCM_DEV_CONNECTION=scm:git:ssh://git@github.com/JakeWharton/RxBinding.git
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=jakewharton
POM_DEVELOPER_NAME=Jake Wharton
android.useAndroidX=true
================================================
FILE: gradlew
================================================
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
================================================
FILE: rxbinding/build.gradle
================================================
apply plugin: 'com.android.library'
apply plugin: 'org.jetbrains.kotlin.android'
dependencies {
api deps.androidXAnnotations
api deps.kotlinStdlib
api deps.rxJava
implementation deps.rxAndroid
androidTestImplementation project(':testing-utils')
androidTestImplementation deps.androidXTestCore
androidTestImplementation deps.androidXTestRunner
androidTestImplementation deps.androidXTestRules
}
android {
compileSdkVersion buildConfig.compileSdkVersion
defaultConfig {
minSdkVersion buildConfig.minSdkVersion
testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
lintOptions {
textReport true
textOutput 'stdout'
}
buildTypes {
debug {
testCoverageEnabled true
}
}
}
apply from: rootProject.file('gradle/gradle-mvn-push.gradle')
================================================
FILE: rxbinding/gradle.properties
================================================
POM_ARTIFACT_ID=rxbinding
POM_NAME=RxBinding
POM_PACKAGING=aar
================================================
FILE: rxbinding/src/androidTest/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jakewharton.rxbinding4">
<application>
<activity android:name=".view.RxViewAttachTestActivity"/>
<activity android:name=".view.RxViewSystemUiVisibilityTestActivity"/>
<activity android:name=".widget.RxAdapterViewTestActivity"/>
<activity android:name=".widget.RxAbsListViewTestActivity"/>
<activity android:name=".widget.RxAutoCompleteTextViewTestActivity"/>
<activity android:name=".widget.RxRatingBarTestActivity"/>
<activity android:name=".widget.RxSearchViewTestActivity"/>
<activity android:name=".widget.RxSeekBarTestActivity"/>
<activity android:name=".widget.RxPopupMenuTestActivity"/>
<activity
android:name=".widget.RxToolbarTestActivity"
android:theme="@android:style/Theme.Material"
/>
</application>
</manifest>
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/internal/MainThreadKtTest.java
================================================
package com.jakewharton.rxbinding4.internal;
import androidx.test.annotation.UiThreadTest;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public final class MainThreadKtTest {
@UiThreadTest
@Test public void checkMainOnMainDoesNotNotify() {
RecordingObserver<Object> o = new RecordingObserver<>();
assertTrue(Preconditions.checkMainThread(o));
o.assertNoMoreEvents();
}
@Test public void checkMainOnNotMainNotifies() {
RecordingObserver<Object> o = new RecordingObserver<>();
assertFalse(Preconditions.checkMainThread(o));
Throwable e = o.takeError();
assertTrue(e instanceof IllegalStateException);
assertTrue(e.getMessage().startsWith("Expected to be called on the main thread but was "));
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxMenuItemTest.java
================================================
package com.jakewharton.rxbinding4.view;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.view.ActionProvider;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import com.jakewharton.rxbinding4.RecordingObserver;
import kotlin.jvm.functions.Function1;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
public final class RxMenuItemTest {
private final Context context = ApplicationProvider.getApplicationContext();
private final TestMenuItem menuItem = new TestMenuItem(context);
@Test @UiThreadTest public void clicks() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxMenuItem.clicks(menuItem).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
menuItem.performClick();
assertNotNull(o.takeNext());
menuItem.performClick();
assertNotNull(o.takeNext());
o.dispose();
menuItem.performClick();
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void clicksAvoidHandling() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxMenuItem.clicks(menuItem, item -> false).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
menuItem.performClick();
o.assertNoMoreEvents();
menuItem.performClick();
o.assertNoMoreEvents();
o.dispose();
menuItem.performClick();
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void actionViewEvents() {
RecordingObserver<MenuItemActionViewEvent> o = new RecordingObserver<>();
RxMenuItem.actionViewEvents(menuItem).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
menuItem.expandActionView();
assertEquals(new MenuItemActionViewExpandEvent(menuItem), o.takeNext());
menuItem.collapseActionView();
assertEquals(new MenuItemActionViewCollapseEvent(menuItem), o.takeNext());
o.dispose();
menuItem.performClick();
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void actionViewEventsAvoidHandling() {
Function1<MenuItemActionViewEvent, Boolean> handled = menuItem -> false;
RecordingObserver<MenuItemActionViewEvent> o = new RecordingObserver<>();
RxMenuItem.actionViewEvents(menuItem, handled).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
menuItem.expandActionView();
assertFalse(menuItem.isActionViewExpanded()); // Should be prevented by handler
o.assertNoMoreEvents();
o.dispose();
menuItem.performClick();
o.assertNoMoreEvents();
}
// There is no accessible default implementation of MenuItem, so we have to create one
private static final class TestMenuItem implements MenuItem {
private final Context context;
private int itemId;
private int groupId;
private int order;
private CharSequence title;
private CharSequence titleCondensed;
private Drawable icon;
private Intent intent;
private char numericChar;
private char alphaChar;
private boolean checkable;
private boolean checked;
private boolean visible;
private boolean enabled;
private OnMenuItemClickListener menuItemClickListener;
private int actionEnum;
private View actionView;
private ActionProvider actionProvider;
private boolean isActionViewExpanded;
private OnActionExpandListener actionExpandListener;
public TestMenuItem(Context context) {
this.context = context;
}
public void performClick() {
if (menuItemClickListener != null) {
menuItemClickListener.onMenuItemClick(this);
}
}
@Override public int getItemId() {
return itemId;
}
@Override public int getGroupId() {
return groupId;
}
@Override public int getOrder() {
return order;
}
@Override public MenuItem setTitle(CharSequence title) {
this.title = title;
return this;
}
@Override public MenuItem setTitle(int title) {
this.title = context.getText(title);
return this;
}
@Override public CharSequence getTitle() {
return title;
}
@Override public MenuItem setTitleCondensed(CharSequence title) {
this.titleCondensed = title;
return this;
}
@Override public CharSequence getTitleCondensed() {
return titleCondensed;
}
@Override public MenuItem setIcon(Drawable icon) {
this.icon = icon;
return this;
}
@Override public MenuItem setIcon(int iconRes) {
this.icon = context.getResources().getDrawable(iconRes);
return this;
}
@Override public Drawable getIcon() {
return icon;
}
@Override public MenuItem setIntent(Intent intent) {
this.intent = intent;
return this;
}
@Override public Intent getIntent() {
return intent;
}
@Override public MenuItem setShortcut(char numericChar, char alphaChar) {
this.numericChar = numericChar;
this.alphaChar = alphaChar;
return this;
}
@Override public MenuItem setNumericShortcut(char numericChar) {
this.numericChar = numericChar;
return this;
}
@Override public char getNumericShortcut() {
return numericChar;
}
@Override public MenuItem setAlphabeticShortcut(char alphaChar) {
this.alphaChar = alphaChar;
return this;
}
@Override public char getAlphabeticShortcut() {
return alphaChar;
}
@Override public MenuItem setCheckable(boolean checkable) {
this.checkable = checkable;
return this;
}
@Override public boolean isCheckable() {
return checkable;
}
@Override public MenuItem setChecked(boolean checked) {
if (checkable) {
this.checked = checked;
}
return this;
}
@Override public boolean isChecked() {
return checked;
}
@Override public MenuItem setVisible(boolean visible) {
this.visible = visible;
return this;
}
@Override public boolean isVisible() {
return visible;
}
@Override public MenuItem setEnabled(boolean enabled) {
this.enabled = enabled;
return this;
}
@Override public boolean isEnabled() {
return enabled;
}
@Override public boolean hasSubMenu() {
return false;
}
@Override public SubMenu getSubMenu() {
return null;
}
@Override
public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {
this.menuItemClickListener = menuItemClickListener;
return this;
}
@Override public ContextMenu.ContextMenuInfo getMenuInfo() {
return null;
}
@Override public void setShowAsAction(int actionEnum) {
this.actionEnum = actionEnum;
}
@Override public MenuItem setShowAsActionFlags(int actionEnum) {
this.actionEnum = actionEnum;
return this;
}
@Override public MenuItem setActionView(View view) {
this.actionView = view;
return this;
}
@Override public MenuItem setActionView(int resId) {
this.actionView = LayoutInflater.from(context).inflate(resId, null);
return this;
}
@Override public View getActionView() {
return actionView;
}
@Override public MenuItem setActionProvider(ActionProvider actionProvider) {
this.actionProvider = actionProvider;
return this;
}
@Override public ActionProvider getActionProvider() {
return actionProvider;
}
@Override public boolean expandActionView() {
if (isActionViewExpanded) {
return false;
}
if (actionExpandListener != null && !actionExpandListener.onMenuItemActionExpand(this)) {
return false;
}
isActionViewExpanded = true;
return true;
}
@Override public boolean collapseActionView() {
if (!isActionViewExpanded) {
return false;
}
if (actionExpandListener != null && !actionExpandListener.onMenuItemActionCollapse(this)) {
return false;
}
isActionViewExpanded = false;
return true;
}
@Override public boolean isActionViewExpanded() {
return isActionViewExpanded;
}
@Override public MenuItem setOnActionExpandListener(OnActionExpandListener listener) {
this.actionExpandListener = listener;
return this;
}
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTest.java
================================================
package com.jakewharton.rxbinding4.view;
import android.app.Instrumentation;
import android.view.View;
import android.widget.FrameLayout;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public final class RxViewAttachTest {
@Rule public final ActivityTestRule<RxViewAttachTestActivity> activityRule =
new ActivityTestRule<>(RxViewAttachTestActivity.class);
private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
FrameLayout parent;
View child;
@Before public void setUp() {
RxViewAttachTestActivity activity = activityRule.getActivity();
parent = activity.parent;
child = activity.child;
}
@Test public void attaches() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxView.attaches(child)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
o.assertNoMoreEvents(); // No initial value.
instrumentation.runOnMainSync(() -> parent.addView(child));
assertNotNull(o.takeNext());
instrumentation.runOnMainSync(() -> parent.removeView(child));
o.assertNoMoreEvents();
o.dispose();
instrumentation.runOnMainSync(() -> {
parent.addView(child);
parent.removeView(child);
});
o.assertNoMoreEvents();
}
@Test public void attachEvents() {
RecordingObserver<ViewAttachEvent> o = new RecordingObserver<>();
RxView.attachEvents(child)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
o.assertNoMoreEvents(); // No initial value.
instrumentation.runOnMainSync(() -> parent.addView(child));
assertEquals(new ViewAttachAttachedEvent(child), o.takeNext());
instrumentation.runOnMainSync(() -> parent.removeView(child));
assertEquals(new ViewAttachDetachedEvent(child), o.takeNext());
o.dispose();
instrumentation.runOnMainSync(() -> {
parent.addView(child);
parent.removeView(child);
});
o.assertNoMoreEvents();
}
@Test public void detaches() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxView.detaches(child)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
o.assertNoMoreEvents(); // No initial value.
instrumentation.runOnMainSync(() -> parent.addView(child));
o.assertNoMoreEvents();
instrumentation.runOnMainSync(() -> parent.removeView(child));
assertNotNull(o.takeNext());
o.dispose();
instrumentation.runOnMainSync(() -> {
parent.addView(child);
parent.removeView(child);
});
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTestActivity.java
================================================
package com.jakewharton.rxbinding4.view;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
public final class RxViewAttachTestActivity extends Activity {
FrameLayout parent;
View child;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
parent = new FrameLayout(this);
child = new View(this);
setContentView(parent);
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewGroupTest.java
================================================
package com.jakewharton.rxbinding4.view;
import android.content.Context;
import android.view.View;
import android.widget.LinearLayout;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public final class RxViewGroupTest {
private final Context context = ApplicationProvider.getApplicationContext();
private final LinearLayout parent = new LinearLayout(context);
private final View child = new View(context);
@Test @UiThreadTest public void childViewEvents() {
RecordingObserver<ViewGroupHierarchyChangeEvent> o = new RecordingObserver<>();
RxViewGroup.changeEvents(parent).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
parent.addView(child);
assertEquals(new ViewGroupHierarchyChildViewAddEvent(parent, child), o.takeNext());
parent.removeView(child);
assertEquals(new ViewGroupHierarchyChildViewRemoveEvent(parent, child), o.takeNext());
o.dispose();
parent.addView(child);
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTest.java
================================================
package com.jakewharton.rxbinding4.view;
import android.app.Instrumentation;
import android.view.View;
import android.widget.FrameLayout;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public final class RxViewSystemUiVisibilityTest {
@Rule public final ActivityTestRule<RxViewSystemUiVisibilityTestActivity> activityRule =
new ActivityTestRule<>(RxViewSystemUiVisibilityTestActivity.class);
private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
FrameLayout root;
@Before public void setUp() {
RxViewSystemUiVisibilityTestActivity activity = activityRule.getActivity();
root = activity.root;
root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
@Test public void systemUiVisibilityChanges() {
RecordingObserver<Integer> o = new RecordingObserver<>();
RxView.systemUiVisibilityChanges(root)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
o.assertNoMoreEvents();
instrumentation.runOnMainSync(
() -> root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION));
assertEquals(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION, o.takeNext().intValue());
instrumentation.runOnMainSync(() -> root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE));
assertEquals(View.SYSTEM_UI_FLAG_VISIBLE, o.takeNext().intValue());
o.dispose();
instrumentation.runOnMainSync(
() -> root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION));
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTestActivity.java
================================================
package com.jakewharton.rxbinding4.view;
import android.app.Activity;
import android.os.Bundle;
import android.widget.FrameLayout;
public final class RxViewSystemUiVisibilityTestActivity extends Activity {
FrameLayout root;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
root = new FrameLayout(this);
setContentView(root);
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewTest.java
================================================
package com.jakewharton.rxbinding4.view;
import android.content.Context;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.filters.SdkSuppress;
import com.jakewharton.rxbinding4.RecordingObserver;
import com.jakewharton.rxbinding4.internal.AlwaysTrue;
import io.reactivex.rxjava3.functions.Consumer;
import org.junit.Test;
import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_HOVER_ENTER;
import static android.view.MotionEvent.ACTION_HOVER_EXIT;
import static android.view.MotionEvent.ACTION_HOVER_MOVE;
import static android.view.MotionEvent.ACTION_MOVE;
import static android.view.MotionEvent.ACTION_UP;
import static com.jakewharton.rxbinding4.MotionEventUtil.hoverMotionEventAtPosition;
import static com.jakewharton.rxbinding4.MotionEventUtil.motionEventAtPosition;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public final class RxViewTest {
private final Context context = ApplicationProvider.getApplicationContext();
private final View view = new View(context);
@Test @UiThreadTest public void clicks() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxView.clicks(view).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
view.performClick();
assertNotNull(o.takeNext());
view.performClick();
assertNotNull(o.takeNext());
o.dispose();
view.performClick();
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void drags() {
//RecordingObserver<ViewClickEvent> o = new RecordingObserver<>();
//RxView.clickEvents(view).subscribe(o);
//o.assertNoMoreEvents(); // No initial value.
//
//clock.advance(1, SECONDS);
//view.performClick();
//assertEquals(ViewClickEvent.create(view, 1000), o.takeNext());
//
//clock.advance(1, SECONDS);
//view.performClick();
//assertEquals(ViewClickEvent.create(view, 2000), o.takeNext());
//
//o.dispose();
//
//clock.advance(1, SECONDS);
//view.performClick();
//o.assertNoMoreEvents();
}
@SdkSuppress(minSdkVersion = 16)
@Test @UiThreadTest public void drawEvents() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxView.draws(view).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
view.getViewTreeObserver().dispatchOnDraw();
assertNotNull(o.takeNext());
o.dispose();
view.getViewTreeObserver().dispatchOnDraw();
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void focusChanges() {
// We need a parent which can take focus from our view when it attempts to clear.
LinearLayout parent = new LinearLayout(context);
parent.setFocusable(true);
parent.addView(view);
view.setFocusable(true);
RecordingObserver<Boolean> o = new RecordingObserver<>();
RxView.focusChanges(view).subscribe(o);
assertFalse(o.takeNext());
view.requestFocus();
assertTrue(o.takeNext());
view.clearFocus();
assertFalse(o.takeNext());
o.dispose();
view.requestFocus();
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void globalLayouts() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxView.globalLayouts(view).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
view.getViewTreeObserver().dispatchOnGlobalLayout();
assertNotNull(o.takeNext());
o.dispose();
view.getViewTreeObserver().dispatchOnGlobalLayout();
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void hovers() {
RecordingObserver<MotionEvent> o = new RecordingObserver<>();
RxView.hovers(view).subscribe(o);
o.assertNoMoreEvents();
view.dispatchGenericMotionEvent(hoverMotionEventAtPosition(view, ACTION_HOVER_ENTER, 0, 50));
MotionEvent event1 = o.takeNext();
assertEquals(ACTION_HOVER_ENTER, event1.getAction());
view.dispatchGenericMotionEvent(hoverMotionEventAtPosition(view, ACTION_HOVER_MOVE, 1, 50));
MotionEvent event2 = o.takeNext();
assertEquals(ACTION_HOVER_MOVE, event2.getAction());
o.dispose();
view.dispatchGenericMotionEvent(hoverMotionEventAtPosition(view, ACTION_HOVER_EXIT, 1, 50));
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void layoutChanges() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxView.layoutChanges(view).subscribe(o);
o.assertNoMoreEvents();
view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());
assertNotNull(o.takeNext());
view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
o.assertNoMoreEvents();
o.dispose();
view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void layoutChangeEvents() {
RecordingObserver<ViewLayoutChangeEvent> o = new RecordingObserver<>();
RxView.layoutChangeEvents(view).subscribe(o);
o.assertNoMoreEvents();
view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());
ViewLayoutChangeEvent event1 = o.takeNext();
assertSame(view, event1.getView());
assertNotSame(event1.getOldLeft(), event1.getLeft());
assertSame(event1.getOldRight(), event1.getRight());
view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
o.assertNoMoreEvents();
o.dispose();
view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void longClicks() {
// We need a parent because long presses delegate to the parent.
LinearLayout parent = new LinearLayout(context) {
@Override public boolean showContextMenuForChild(View originalView) {
return true;
}
};
parent.addView(view);
RecordingObserver<Object> o = new RecordingObserver<>();
RxView.longClicks(view).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
view.performLongClick();
assertNotNull(o.takeNext());
view.performLongClick();
assertNotNull(o.takeNext());
o.dispose();
view.performLongClick();
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void preDrawEvents() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxView.preDraws(view, AlwaysTrue.INSTANCE).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
view.getViewTreeObserver().dispatchOnPreDraw();
assertNotNull(o.takeNext());
o.dispose();
view.getViewTreeObserver().dispatchOnPreDraw();
o.assertNoMoreEvents();
}
@SdkSuppress(minSdkVersion = 23)
@Test @UiThreadTest public void scrollChangeEvents() {
RecordingObserver<ViewScrollChangeEvent> o = new RecordingObserver<>();
RxView.scrollChangeEvents(view).subscribe(o);
o.assertNoMoreEvents();
view.scrollTo(1, 1);
ViewScrollChangeEvent event0 = o.takeNext();
assertSame(view, event0.getView());
assertEquals(1, event0.getScrollX());
assertEquals(1, event0.getScrollY());
assertEquals(0, event0.getOldScrollX());
assertEquals(0, event0.getOldScrollY());
view.scrollTo(2, 2);
ViewScrollChangeEvent event1 = o.takeNext();
assertSame(view, event1.getView());
assertEquals(2, event1.getScrollX());
assertEquals(2, event1.getScrollY());
assertEquals(1, event1.getOldScrollX());
assertEquals(1, event1.getOldScrollY());
o.dispose();
view.scrollTo(3, 3);
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void touches() {
RecordingObserver<MotionEvent> o = new RecordingObserver<>();
RxView.touches(view).subscribe(o);
o.assertNoMoreEvents();
view.dispatchTouchEvent(motionEventAtPosition(view, ACTION_DOWN, 0, 50));
MotionEvent event1 = o.takeNext();
assertEquals(ACTION_DOWN, event1.getAction());
view.dispatchTouchEvent(motionEventAtPosition(view, ACTION_MOVE, 1, 50));
MotionEvent event2 = o.takeNext();
assertEquals(ACTION_MOVE, event2.getAction());
o.dispose();
view.dispatchTouchEvent(motionEventAtPosition(view, ACTION_UP, 1, 50));
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void keys() {
RecordingObserver<KeyEvent> o = new RecordingObserver<>();
RxView.keys(view).subscribe(o);
o.assertNoMoreEvents();
view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_R));
KeyEvent event1 = o.takeNext();
assertEquals(KeyEvent.ACTION_DOWN, event1.getAction());
view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_H));
KeyEvent event2 = o.takeNext();
assertEquals(KeyEvent.KEYCODE_H, event2.getKeyCode());
o.dispose();
view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_S));
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void visibility() throws Throwable {
view.setVisibility(View.VISIBLE);
Consumer<? super Boolean> action = RxView.visibility(view);
action.accept(false);
assertEquals(View.GONE, view.getVisibility());
action.accept(true);
assertEquals(View.VISIBLE, view.getVisibility());
}
@Test @UiThreadTest public void visibilityCustomFalse() throws Throwable {
view.setVisibility(View.VISIBLE);
Consumer<? super Boolean> action = RxView.visibility(view, View.INVISIBLE);
action.accept(false);
assertEquals(View.INVISIBLE, view.getVisibility());
action.accept(true);
assertEquals(View.VISIBLE, view.getVisibility());
}
@SuppressWarnings("ResourceType") @Test @UiThreadTest public void setVisibilityCustomFalseToVisibleThrows() {
try {
RxView.visibility(view, View.VISIBLE);
fail();
} catch (IllegalArgumentException e) {
assertEquals("Setting visibility to VISIBLE when false would have no effect.", e.getMessage());
}
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Instrumentation;
import android.widget.ListView;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public final class RxAbsListViewTest {
@Rule public final ActivityTestRule<RxAbsListViewTestActivity> activityRule =
new ActivityTestRule<>(RxAbsListViewTestActivity.class);
private Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
private RxAbsListViewTestActivity activity;
ListView listView;
@Before public void setUp() {
activity = activityRule.getActivity();
listView = activity.listView;
}
@Test public void scrollEvents() {
RecordingObserver<AbsListViewScrollEvent> o = new RecordingObserver<>();
RxAbsListView.scrollEvents(listView)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
AbsListViewScrollEvent event = o.takeNext();
assertEquals(100, event.getTotalItemCount());
assertEquals(0, event.getFirstVisibleItem());
assertEquals(0, event.getScrollState());
instrumentation.runOnMainSync(() -> listView.smoothScrollToPosition(50));
AbsListViewScrollEvent event1 = o.takeNext();
assertEquals(listView, event1.getView());
assertEquals(100, event1.getTotalItemCount());
o.dispose();
instrumentation.runOnMainSync(() -> listView.smoothScrollToPosition(100));
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public final class RxAbsListViewTestActivity extends Activity {
ListView listView;
List<String> values;
ArrayAdapter<String> adapter;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
values = createValues(100);
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, values);
listView = new ListView(this);
listView.setAdapter(adapter);
FrameLayout layout = new FrameLayout(this);
layout.addView(listView);
setContentView(layout);
}
private static List<String> createValues(int count) {
final List<String> values = new ArrayList<>(count);
for (int i = 0; i < count; i++) {
values.add(String.valueOf(i));
}
return values;
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import androidx.test.annotation.UiThreadTest;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Test;
import static org.junit.Assert.assertSame;
public final class RxAdapterTest {
private final TestAdapter adapter = new TestAdapter();
@Test @UiThreadTest public void dataChanges() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxAdapter.dataChanges(adapter).subscribe(o);
assertSame(adapter, o.takeNext());
adapter.notifyDataSetChanged();
assertSame(adapter, o.takeNext());
adapter.notifyDataSetChanged();
assertSame(adapter, o.takeNext());
o.dispose();
adapter.notifyDataSetChanged();
o.assertNoMoreEvents();
}
private static final class TestAdapter extends BaseAdapter {
TestAdapter() {
}
@Override public int getCount() {
return 0;
}
@Override public Object getItem(int position) {
return null;
}
@Override public long getItemId(int position) {
return 0;
}
@Override public View getView(int position, View convertView, ViewGroup parent) {
return null;
}
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Instrumentation;
import android.widget.ListView;
import android.widget.Spinner;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
public final class RxAdapterViewTest {
@Rule public final ActivityTestRule<RxAdapterViewTestActivity> activityRule =
new ActivityTestRule<>(RxAdapterViewTestActivity.class);
private Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
RxAdapterViewTestActivity activity;
Spinner spinner;
ListView listView;
@Before public void setUp() {
activity = activityRule.getActivity();
spinner = activity.spinner;
listView = activity.listView;
}
@Test public void itemSelections() {
RecordingObserver<Integer> o = new RecordingObserver<>();
RxAdapterView.itemSelections(spinner)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
assertEquals(0, o.takeNext().intValue());
instrumentation.runOnMainSync(() -> spinner.setSelection(2));
assertEquals(2, o.takeNext().intValue());
instrumentation.runOnMainSync(() -> spinner.setSelection(0));
assertEquals(0, o.takeNext().intValue());
o.dispose();
instrumentation.runOnMainSync(() -> spinner.setSelection(1));
o.assertNoMoreEvents();
}
@Test public void selectionEvents() {
RecordingObserver<AdapterViewSelectionEvent> o = new RecordingObserver<>();
RxAdapterView.selectionEvents(spinner)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
AdapterViewItemSelectionEvent event1 = (AdapterViewItemSelectionEvent) o.takeNext();
assertSame(spinner, event1.getView());
assertNotNull(event1.getSelectedView());
assertEquals(0, event1.getPosition());
assertEquals(0, event1.getId());
instrumentation.runOnMainSync(() -> spinner.setSelection(2));
AdapterViewItemSelectionEvent event2 = (AdapterViewItemSelectionEvent) o.takeNext();
assertSame(spinner, event2.getView());
assertNotNull(event2.getSelectedView());
assertEquals(2, event2.getPosition());
assertEquals(2, event2.getId());
instrumentation.runOnMainSync(() -> {
activity.values.clear();
activity.adapter.notifyDataSetChanged();
});
assertEquals(new AdapterViewNothingSelectionEvent(spinner), o.takeNext());
o.dispose();
instrumentation.runOnMainSync(() -> {
activity.values.add("Hello");
activity.adapter.notifyDataSetChanged();
});
o.assertNoMoreEvents();
}
@Test public void itemClicks() {
RecordingObserver<Integer> o = new RecordingObserver<>();
RxAdapterView.itemClicks(listView)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
o.assertNoMoreEvents();
instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(2), 2, 2));
assertEquals(2, o.takeNext().intValue());
instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(0), 0, 0));
assertEquals(0, o.takeNext().intValue());
o.dispose();
instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(1), 1, 1));
o.assertNoMoreEvents();
}
@Test public void itemClickEvents() {
RecordingObserver<AdapterViewItemClickEvent> o = new RecordingObserver<>();
RxAdapterView.itemClickEvents(listView)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
o.assertNoMoreEvents();
instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(2), 2, 2));
AdapterViewItemClickEvent event = o.takeNext();
assertEquals(listView, event.getView());
assertNotNull(event.getClickedView());
assertEquals(2, event.getPosition());
assertEquals(2, event.getId());
o.dispose();
instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(1), 1, 1));
o.assertNoMoreEvents();
}
@Test public void itemLongClicks() {
// TODO
}
@Test public void itemLongClickEvents() {
// TODO
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public final class RxAdapterViewTestActivity extends Activity {
Spinner spinner;
ListView listView;
List<String> values;
ArrayAdapter<String> adapter;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
values = new ArrayList<>(Arrays.asList("One", "Two", "Three"));
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, values);
spinner = new Spinner(this);
spinner.setAdapter(adapter);
listView = new ListView(this);
listView.setAdapter(adapter);
FrameLayout layout = new FrameLayout(this);
layout.addView(spinner);
layout.addView(listView);
setContentView(layout);
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Instrumentation;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import com.jakewharton.rxbinding4.test.R;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static androidx.test.espresso.Espresso.onData;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.clearText;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.matcher.RootMatchers.withDecorView;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.startsWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public final class RxAutoCompleteTextViewTest {
@Rule public final ActivityTestRule<RxAutoCompleteTextViewTestActivity> activityRule =
new ActivityTestRule<>(RxAutoCompleteTextViewTestActivity.class);
private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
private RxAutoCompleteTextViewTestActivity activity;
AutoCompleteTextView autoCompleteTextView;
@Before public void setUp() {
activity = activityRule.getActivity();
autoCompleteTextView = activity.autoCompleteTextView;
}
@Test public void itemClickEvents() {
instrumentation.runOnMainSync(() -> {
autoCompleteTextView.setThreshold(1);
List<String> values = Arrays.asList("Two", "Three", "Twenty");
ArrayAdapter<String> adapter = new ArrayAdapter<>(autoCompleteTextView.getContext(),
android.R.layout.simple_list_item_1, values);
autoCompleteTextView.setAdapter(adapter);
});
RecordingObserver<AdapterViewItemClickEvent> o = new RecordingObserver<>();
RxAutoCompleteTextView.itemClickEvents(autoCompleteTextView)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
o.assertNoMoreEvents();
onView(withId(R.id.auto_complete)).perform(typeText("Tw"));
onData(startsWith("Twenty"))
.inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))))
.perform(click());
AdapterViewItemClickEvent event = o.takeNext();
assertNotNull(event.getView());
assertNotNull(event.getClickedView());
assertEquals(1, event.getPosition()); // Second item in two-item filtered list.
assertEquals(1, event.getId()); // Second item in two-item filtered list.
o.dispose();
onView(withId(R.id.auto_complete)).perform(clearText(), typeText("Tw"));
onData(startsWith("Twenty"))
.inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))))
.perform(click());
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.AutoCompleteTextView;
import android.widget.LinearLayout;
import com.jakewharton.rxbinding4.test.R;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
public final class RxAutoCompleteTextViewTestActivity extends Activity {
AutoCompleteTextView autoCompleteTextView;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
setContentView(layout);
autoCompleteTextView = new AutoCompleteTextView(this);
autoCompleteTextView.setLayoutParams(new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
autoCompleteTextView.setId(R.id.auto_complete);
layout.addView(autoCompleteTextView);
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxCompoundButtonTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.content.Context;
import android.widget.CompoundButton;
import android.widget.ToggleButton;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public final class RxCompoundButtonTest {
private final Context context = ApplicationProvider.getApplicationContext();
private final CompoundButton view = new ToggleButton(context);
@Test @UiThreadTest public void checkedChanges() {
view.setChecked(false);
RecordingObserver<Boolean> o = new RecordingObserver<>();
RxCompoundButton.checkedChanges(view).subscribe(o);
assertFalse(o.takeNext());
view.setChecked(true);
assertTrue(o.takeNext());
view.setChecked(false);
assertFalse(o.takeNext());
o.dispose();
view.setChecked(true);
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Instrumentation;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.PopupMenu;
import androidx.test.annotation.UiThreadTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
public final class RxPopupMenuTest {
@Rule public final ActivityTestRule<RxPopupMenuTestActivity> activityRule =
new ActivityTestRule<>(RxPopupMenuTestActivity.class);
private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
PopupMenu view;
@Before public void setUp() {
view = activityRule.getActivity().popupMenu;
}
@Test @UiThreadTest public void itemClicks() {
Menu menu = view.getMenu();
MenuItem item1 = menu.add(0, 1, 0, "Hi");
MenuItem item2 = menu.add(0, 2, 0, "Hey");
RecordingObserver<MenuItem> o = new RecordingObserver<>();
RxPopupMenu.itemClicks(view).subscribe(o);
o.assertNoMoreEvents();
menu.performIdentifierAction(2, 0);
assertSame(item2, o.takeNext());
menu.performIdentifierAction(1, 0);
assertSame(item1, o.takeNext());
o.dispose();
menu.performIdentifierAction(2, 0);
o.assertNoMoreEvents();
}
@Test public void dismisses() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxPopupMenu.dismisses(view).subscribeOn(AndroidSchedulers.mainThread()).subscribe(o);
o.assertNoMoreEvents(); // No initial value.
instrumentation.runOnMainSync(() -> view.show());
o.assertNoMoreEvents();
instrumentation.runOnMainSync(() -> view.dismiss());
assertNotNull(o.takeNext());
o.dispose();
instrumentation.runOnMainSync(() -> view.show());
instrumentation.runOnMainSync(() -> view.dismiss());
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.PopupMenu;
public final class RxPopupMenuTestActivity extends Activity {
PopupMenu popupMenu;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View anchor = new View(this);
setContentView(anchor);
popupMenu = new PopupMenu(this, anchor);
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRadioGroupTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.content.Context;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.functions.Consumer;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
@SuppressWarnings("ResourceType") // Don't need real IDs for test case.
public final class RxRadioGroupTest {
private final Context context = ApplicationProvider.getApplicationContext();
private final RadioGroup view = new RadioGroup(context);
@Before public void setUp() {
RadioButton button1 = new RadioButton(context);
button1.setId(1);
view.addView(button1);
RadioButton button2 = new RadioButton(context);
button2.setId(2);
view.addView(button2);
}
@Test @UiThreadTest public void checkedChanges() {
RecordingObserver<Integer> o = new RecordingObserver<>();
RxRadioGroup.checkedChanges(view).subscribe(o);
assertEquals(-1, o.takeNext().intValue());
view.check(1);
assertEquals(1, o.takeNext().intValue());
view.clearCheck();
assertEquals(-1, o.takeNext().intValue());
view.check(2);
assertEquals(2, o.takeNext().intValue());
o.dispose();
view.check(1);
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void checked() throws Throwable {
Consumer<? super Integer> action = RxRadioGroup.checked(view);
assertEquals(-1, view.getCheckedRadioButtonId());
action.accept(1);
assertEquals(1, view.getCheckedRadioButtonId());
action.accept(-1);
assertEquals(-1, view.getCheckedRadioButtonId());
action.accept(2);
assertEquals(2, view.getCheckedRadioButtonId());
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Instrumentation;
import android.widget.RatingBar;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_UP;
import static com.jakewharton.rxbinding4.MotionEventUtil.motionEventAtPosition;
import static org.junit.Assert.assertEquals;
public final class RxRatingBarTest {
@Rule public final ActivityTestRule<RxRatingBarTestActivity> activityRule =
new ActivityTestRule<>(RxRatingBarTestActivity.class);
private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
RatingBar view;
@Before public void setUp() {
view = activityRule.getActivity().ratingBar;
}
@Test public void ratingChanges() {
RecordingObserver<Float> o = new RecordingObserver<>();
RxRatingBar.ratingChanges(view)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
assertEquals(0f, o.takeNext(), 0f);
instrumentation.runOnMainSync(() -> view.setRating(1f));
assertEquals(1f, o.takeNext(), 0f);
instrumentation.runOnMainSync(() -> view.setRating(2f));
assertEquals(2f, o.takeNext(), 0f);
o.dispose();
instrumentation.runOnMainSync(() -> view.setRating(1f));
o.assertNoMoreEvents();
}
@Test public void ratingChangeEvents() {
RecordingObserver<RatingBarChangeEvent> o = new RecordingObserver<>();
RxRatingBar.ratingChangeEvents(view) //
.subscribeOn(AndroidSchedulers.mainThread()) //
.subscribe(o);
assertEquals(new RatingBarChangeEvent(view, 0f, false), o.takeNext());
instrumentation.runOnMainSync(() -> view.setRating(5f));
assertEquals(new RatingBarChangeEvent(view, 5f, false), o.takeNext());
instrumentation.sendPointerSync(motionEventAtPosition(view, ACTION_DOWN, 0, 50));
instrumentation.sendPointerSync(motionEventAtPosition(view, ACTION_UP, 0, 50));
instrumentation.waitForIdleSync();
assertEquals(new RatingBarChangeEvent(view, 1f, true), o.takeNext());
o.dispose();
instrumentation.runOnMainSync(() -> view.setRating(1f));
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RatingBar;
public final class RxRatingBarTestActivity extends Activity {
RatingBar ratingBar;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ratingBar = new RatingBar(this);
ratingBar.setMax(10);
ratingBar.setStepSize(1f);
setContentView(ratingBar);
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.widget.SearchView;
import androidx.test.annotation.UiThreadTest;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public final class RxSearchViewTest {
@Rule
public final ActivityTestRule<RxSearchViewTestActivity> activityRule =
new ActivityTestRule<>(RxSearchViewTestActivity.class);
private SearchView searchView;
@Before public void setUp() {
searchView = activityRule.getActivity().searchView;
}
@Test @UiThreadTest public void queryTextChanges() {
searchView.setQuery("Initial", false);
RecordingObserver<CharSequence> o = new RecordingObserver<>();
RxSearchView.queryTextChanges(searchView).subscribe(o);
assertEquals("Initial", o.takeNext().toString());
searchView.setQuery("H", false);
assertEquals("H", o.takeNext().toString());
searchView.setQuery("He", false);
assertEquals("He", o.takeNext().toString());
searchView.setQuery(null, false); // Internally coerced to empty string.
assertEquals("", o.takeNext().toString());
o.dispose();
searchView.setQuery("Silent", false);
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void query() throws Throwable {
RxSearchView.query(searchView, false).accept("Hey");
assertEquals("Hey", searchView.getQuery().toString());
RxSearchView.query(searchView, true).accept("Bye");
assertEquals("Bye", searchView.getQuery().toString());
}
@Test @UiThreadTest public void queryTextEventNotSubmitted() {
RecordingObserver<SearchViewQueryTextEvent> o = new RecordingObserver<>();
RxSearchView.queryTextChangeEvents(searchView).subscribe(o);
assertEquals("", o.takeNext().getQueryText().toString());
searchView.setQuery("q", false);
SearchViewQueryTextEvent event = o.takeNext();
assertEquals("q", event.getQueryText().toString());
assertFalse(event.isSubmitted());
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void queryTextEventSubmitted() {
RecordingObserver<SearchViewQueryTextEvent> o = new RecordingObserver<>();
RxSearchView.queryTextChangeEvents(searchView).subscribe(o);
assertEquals("", o.takeNext().getQueryText().toString());
searchView.setQuery("q", true);
// Text change event:
SearchViewQueryTextEvent event = o.takeNext();
assertEquals("q", event.getQueryText().toString());
assertFalse(event.isSubmitted());
// Submission event:
SearchViewQueryTextEvent event1 = o.takeNext();
assertEquals("q", event1.getQueryText().toString());
assertTrue(event1.isSubmitted());
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Activity;
import android.os.Bundle;
import android.widget.SearchView;
public final class RxSearchViewTestActivity extends Activity {
SearchView searchView;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
searchView = new SearchView(this);
setContentView(searchView);
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Instrumentation;
import android.widget.SeekBar;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_MOVE;
import static android.view.MotionEvent.ACTION_UP;
import static com.jakewharton.rxbinding4.MotionEventUtil.motionEventAtPosition;
import static org.junit.Assert.assertEquals;
public final class RxSeekBarTest {
@Rule public final ActivityTestRule<RxSeekBarTestActivity> activityRule =
new ActivityTestRule<>(RxSeekBarTestActivity.class);
private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
SeekBar seekBar;
@Before public void setUp() {
seekBar = activityRule.getActivity().seekBar;
}
@Test public void changes() {
RecordingObserver<Integer> o = new RecordingObserver<>();
RxSeekBar.changes(seekBar) //
.subscribeOn(AndroidSchedulers.mainThread()) //
.subscribe(o);
assertEquals(0, o.takeNext().intValue());
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
instrumentation.waitForIdleSync();
assertEquals(100, o.takeNext().intValue());
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 0, 50));
instrumentation.waitForIdleSync();
assertEquals(0, o.takeNext().intValue());
instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
instrumentation.waitForIdleSync();
assertEquals(85, o.takeNext().intValue());
o.dispose();
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
}
@Test public void systemChanges() {
RecordingObserver<Integer> o = new RecordingObserver<>();
RxSeekBar.systemChanges(seekBar) //
.subscribeOn(AndroidSchedulers.mainThread()) //
.subscribe(o);
assertEquals(0, o.takeNext().intValue());
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
instrumentation.waitForIdleSync();
assertEquals(85, o.takeNext().intValue());
o.dispose();
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
}
@Test public void userChanges() {
RecordingObserver<Integer> o = new RecordingObserver<>();
RxSeekBar.userChanges(seekBar) //
.subscribeOn(AndroidSchedulers.mainThread()) //
.subscribe(o);
assertEquals(0, o.takeNext().intValue());
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
instrumentation.waitForIdleSync();
assertEquals(100, o.takeNext().intValue());
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 0, 50));
instrumentation.waitForIdleSync();
assertEquals(0, o.takeNext().intValue());
instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
o.dispose();
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
}
@Test public void changeEvents() {
RecordingObserver<SeekBarChangeEvent> o = new RecordingObserver<>();
RxSeekBar.changeEvents(seekBar) //
.subscribeOn(AndroidSchedulers.mainThread()) //
.subscribe(o);
assertEquals(new SeekBarProgressChangeEvent(seekBar, 0, false), o.takeNext());
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));
instrumentation.waitForIdleSync();
assertEquals(new SeekBarStartChangeEvent(seekBar), o.takeNext());
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
instrumentation.waitForIdleSync();
assertEquals(new SeekBarProgressChangeEvent(seekBar, 100, true), o.takeNext());
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_UP, 100, 50));
instrumentation.waitForIdleSync();
assertEquals(new SeekBarStopChangeEvent(seekBar), o.takeNext());
instrumentation.runOnMainSync(() -> seekBar.setProgress(0));
instrumentation.waitForIdleSync();
assertEquals(new SeekBarProgressChangeEvent(seekBar, 0, false), o.takeNext());
o.dispose();
instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));
instrumentation.waitForIdleSync();
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.app.Activity;
import android.os.Bundle;
import android.widget.SeekBar;
public final class RxSeekBarTestActivity extends Activity {
SeekBar seekBar;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
seekBar = new SeekBar(this);
setContentView(seekBar);
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxTextViewTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.content.Context;
import android.widget.TextView;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Test;
import static android.view.inputmethod.EditorInfo.IME_ACTION_GO;
import static android.view.inputmethod.EditorInfo.IME_ACTION_NEXT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
public final class RxTextViewTest {
private final Context context = ApplicationProvider.getApplicationContext();
private final TextView view = new TextView(context);
@Test @UiThreadTest public void editorActions() {
RecordingObserver<Integer> o = new RecordingObserver<>();
RxTextView.editorActions(view).subscribe(o);
o.assertNoMoreEvents();
view.onEditorAction(IME_ACTION_GO);
assertEquals(IME_ACTION_GO, o.takeNext().intValue());
view.onEditorAction(IME_ACTION_NEXT);
assertEquals(IME_ACTION_NEXT, o.takeNext().intValue());
o.dispose();
view.onEditorAction(IME_ACTION_GO);
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void editorActionEvents() {
RecordingObserver<TextViewEditorActionEvent> o = new RecordingObserver<>();
RxTextView.editorActionEvents(view).subscribe(o);
o.assertNoMoreEvents();
view.onEditorAction(IME_ACTION_GO);
TextViewEditorActionEvent event1 = o.takeNext();
assertSame(view, event1.getView());
assertEquals(IME_ACTION_GO, event1.getActionId());
assertNull(event1.getKeyEvent());
view.onEditorAction(IME_ACTION_NEXT);
TextViewEditorActionEvent event2 = o.takeNext();
assertSame(view, event2.getView());
assertEquals(IME_ACTION_NEXT, event2.getActionId());
assertNull(event2.getKeyEvent()); // TODO figure out a user event?
o.dispose();
view.onEditorAction(IME_ACTION_GO);
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void textChanges() {
view.setText("Initial");
RecordingObserver<CharSequence> o = new RecordingObserver<>();
RxTextView.textChanges(view).subscribe(o);
assertEquals("Initial", o.takeNext().toString());
view.setText("H");
assertEquals("H", o.takeNext().toString());
view.setText("He");
assertEquals("He", o.takeNext().toString());
view.setText(null); // Internally coerced to empty string.
assertEquals("", o.takeNext().toString());
o.dispose();
view.setText("Silent");
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void textChangeEvents() {
view.setText("Initial");
RecordingObserver<TextViewTextChangeEvent> o = new RecordingObserver<>();
RxTextView.textChangeEvents(view).subscribe(o);
TextViewTextChangeEvent event0 = o.takeNext();
assertSame(view, event0.getView());
assertEquals("Initial", event0.getText().toString());
assertEquals(0, event0.getStart());
assertEquals(0, event0.getBefore());
assertEquals(0, event0.getCount());
view.setText("H");
TextViewTextChangeEvent event1 = o.takeNext();
assertSame(view, event1.getView());
assertEquals("H", event1.getText().toString());
assertEquals(0, event1.getStart());
assertEquals(7, event1.getBefore());
assertEquals(1, event1.getCount());
view.setText("He");
TextViewTextChangeEvent event2 = o.takeNext();
assertSame(view, event2.getView());
assertEquals("He", event2.getText().toString());
assertEquals(0, event2.getStart());
assertEquals(1, event2.getBefore());
assertEquals(2, event2.getCount());
o.dispose();
view.setText("Silent");
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void beforeTextChangeEvents() {
view.setText("Initial");
RecordingObserver<TextViewBeforeTextChangeEvent> o = new RecordingObserver<>();
RxTextView.beforeTextChangeEvents(view).subscribe(o);
TextViewBeforeTextChangeEvent event0 = o.takeNext();
assertSame(view, event0.getView());
assertEquals("Initial", event0.getText().toString());
assertEquals(0, event0.getStart());
assertEquals(0, event0.getCount());
assertEquals(0, event0.getAfter());
view.setText("H");
TextViewBeforeTextChangeEvent event1 = o.takeNext();
assertSame(view, event1.getView());
assertEquals("Initial", event1.getText().toString());
assertEquals(0, event1.getStart());
assertEquals(7, event1.getCount());
assertEquals(1, event1.getAfter());
view.setText("He");
TextViewBeforeTextChangeEvent event2 = o.takeNext();
assertSame(view, event2.getView());
assertEquals("H", event2.getText().toString());
assertEquals(0, event2.getStart());
assertEquals(1, event2.getCount());
assertEquals(2, event2.getAfter());
o.dispose();
view.setText("Silent");
o.assertNoMoreEvents();
}
@Test @UiThreadTest public void afterTextChangeEvents() {
view.setText("Initial");
RecordingObserver<TextViewAfterTextChangeEvent> o = new RecordingObserver<>();
RxTextView.afterTextChangeEvents(view).subscribe(o);
TextViewAfterTextChangeEvent event0 = o.takeNext();
assertSame(view, event0.getView());
assertEquals(null, event0.getEditable());
view.setText("H");
TextViewAfterTextChangeEvent event1 = o.takeNext();
assertSame(view, event1.getView());
assertEquals("H", event1.getEditable().toString());
view.setText("He");
TextViewAfterTextChangeEvent event2 = o.takeNext();
assertSame(view, event2.getView());
assertEquals("He", event2.getEditable().toString());
o.dispose();
view.setText("Silent");
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTest.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toolbar;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.SdkSuppress;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
import static com.jakewharton.rxbinding4.widget.RxToolbarTestActivity.NAVIGATION_CONTENT_DESCRIPTION;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
@SdkSuppress(minSdkVersion = 21)
public final class RxToolbarTest {
@Rule public final ActivityTestRule<RxToolbarTestActivity> activityRule =
new ActivityTestRule<>(RxToolbarTestActivity.class);
private Toolbar view;
@Before public void setUp() {
RxToolbarTestActivity activity = activityRule.getActivity();
view = activity.toolbar;
}
@Test @UiThreadTest public void itemClicks() {
Menu menu = view.getMenu();
MenuItem item1 = menu.add(0, 1, 0, "Hi");
MenuItem item2 = menu.add(0, 2, 0, "Hey");
RecordingObserver<MenuItem> o = new RecordingObserver<>();
RxToolbar.itemClicks(view).subscribe(o);
o.assertNoMoreEvents();
menu.performIdentifierAction(2, 0);
assertSame(item2, o.takeNext());
menu.performIdentifierAction(1, 0);
assertSame(item1, o.takeNext());
o.dispose();
menu.performIdentifierAction(2, 0);
o.assertNoMoreEvents();
}
@Test public void navigationClicks() {
RecordingObserver<Object> o = new RecordingObserver<>();
RxToolbar.navigationClicks(view)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(o);
o.assertNoMoreEvents(); // No initial value.
onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());
assertNotNull(o.takeNext());
onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());
assertNotNull(o.takeNext());
o.dispose();
onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());
o.assertNoMoreEvents();
}
}
================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toolbar;
@TargetApi(21)
public final class RxToolbarTestActivity extends Activity {
static final String NAVIGATION_CONTENT_DESCRIPTION = "click me!";
Toolbar toolbar;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
toolbar = new Toolbar(this);
toolbar.setNavigationContentDescription(NAVIGATION_CONTENT_DESCRIPTION);
toolbar.setNavigationIcon(android.R.drawable.sym_def_app_icon);
setContentView(toolbar);
}
}
================================================
FILE: rxbinding/src/androidTest/res/drawable/icon.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<color
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#008800"
/>
================================================
FILE: rxbinding/src/androidTest/res/values/ids.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="auto_complete"/>
</resources>
================================================
FILE: rxbinding/src/androidTest/res/values/strings.xml
================================================
<resources>
<string name="hey">Hey</string>
<string name="ouch">Ouch</string>
<string name="hint">Your name here</string>
</resources>
================================================
FILE: rxbinding/src/main/AndroidManifest.xml
================================================
<manifest package="com.jakewharton.rxbinding4"/>
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/InitialValueObservable.kt
================================================
package com.jakewharton.rxbinding4
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
abstract class InitialValueObservable<T> : Observable<T>() {
protected abstract val initialValue: T
override fun subscribeActual(observer: Observer<in T>) {
subscribeListener(observer)
observer.onNext(initialValue)
}
protected abstract fun subscribeListener(observer: Observer<in T>)
fun skipInitialValue(): Observable<T> = Skipped()
private inner class Skipped : Observable<T>() {
override fun subscribeActual(observer: Observer<in T>) {
subscribeListener(observer)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/mainThread.kt
================================================
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@file:JvmName("Preconditions")
package com.jakewharton.rxbinding4.internal
import android.os.Looper
import androidx.annotation.RestrictTo
import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.disposables.Disposable
@RestrictTo(LIBRARY_GROUP)
fun checkMainThread(observer: Observer<*>): Boolean {
if (Looper.myLooper() != Looper.getMainLooper()) {
observer.onSubscribe(Disposable.empty())
observer.onError(IllegalStateException(
"Expected to be called on the main thread but was " + Thread.currentThread().name))
return false
}
return true
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/true.kt
================================================
package com.jakewharton.rxbinding4.internal
import androidx.annotation.RestrictTo
import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
@RestrictTo(LIBRARY_GROUP)
object AlwaysTrue : () -> Boolean, (Any) -> Boolean {
override fun invoke() = true
override fun invoke(ignored: Any) = true
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemActionViewEvent.kt
================================================
package com.jakewharton.rxbinding4.view
import android.content.Context
import android.view.MenuItem
/**
* An action view event on a menu item.
*
* **Warning:** Instances keep a strong reference to the menu item. Operators that
* cache instances have the potential to leak the associated [Context].
*/
sealed class MenuItemActionViewEvent {
/** The menu item from which this event occurred. */
abstract val menuItem: MenuItem
}
data class MenuItemActionViewCollapseEvent(
override val menuItem: MenuItem
) : MenuItemActionViewEvent()
data class MenuItemActionViewExpandEvent(
override val menuItem: MenuItem
) : MenuItemActionViewEvent()
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemActionViewEventObservable.kt
================================================
@file:JvmName("RxMenuItem")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.MenuItem
import android.view.MenuItem.OnActionExpandListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of action view events for `menuItem`.
*
* *Warning:* The created observable keeps a strong reference to `menuItem`.
* Unsubscribe to free this reference.
*
* *Warning:* The created observable uses [MenuItem.setOnActionExpandListener] to
* observe action view events. Only one observable can be used for a menu item at a time.
*
* @param handled Function invoked with each value to determine the return value of the
* underlying [MenuItem.OnActionExpandListener].
*/
@CheckResult
@JvmOverloads
fun MenuItem.actionViewEvents(
handled: (MenuItemActionViewEvent) -> Boolean = AlwaysTrue
): Observable<MenuItemActionViewEvent> {
return MenuItemActionViewEventObservable(this, handled)
}
private class MenuItemActionViewEventObservable(
private val menuItem: MenuItem,
private val handled: (MenuItemActionViewEvent) -> Boolean
) : Observable<MenuItemActionViewEvent>() {
override fun subscribeActual(observer: Observer<in MenuItemActionViewEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(menuItem, handled, observer)
observer.onSubscribe(listener)
menuItem.setOnActionExpandListener(listener)
}
private class Listener(
private val menuItem: MenuItem,
private val handled: (MenuItemActionViewEvent) -> Boolean,
private val observer: Observer<in MenuItemActionViewEvent>
) : MainThreadDisposable(), OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
return onEvent(MenuItemActionViewExpandEvent(item))
}
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
return onEvent(MenuItemActionViewCollapseEvent(item))
}
private fun onEvent(event: MenuItemActionViewEvent): Boolean {
if (!isDisposed) {
try {
if (handled(event)) {
observer.onNext(event)
return true
}
} catch (e: Exception) {
observer.onError(e)
dispose()
}
}
return false
}
override fun onDispose() {
menuItem.setOnActionExpandListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemClickObservable.kt
================================================
@file:JvmName("RxMenuItem")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.MenuItem
import android.view.MenuItem.OnMenuItemClickListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable which emits on `menuItem` click events. The emitted value is
* unspecified and should only be used as notification.
*
* *Warning:* The created observable keeps a strong reference to `menuItem`.
* Unsubscribe to free this reference.
*
* *Warning:* The created observable uses [MenuItem.setOnMenuItemClickListener] to
* observe clicks. Only one observable can be used for a menu item at a time.
*
* @param handled Function invoked with each value to determine the return value of the
* underlying [MenuItem.OnMenuItemClickListener].
*/
@CheckResult
@JvmOverloads
fun MenuItem.clicks(handled: (MenuItem) -> Boolean = AlwaysTrue): Observable<Unit> {
return MenuItemClickObservable(this, handled)
}
private class MenuItemClickObservable(
private val menuItem: MenuItem,
private val handled: (MenuItem) -> Boolean
) : Observable<Unit>() {
override fun subscribeActual(observer: Observer<in Unit>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(menuItem, handled, observer)
observer.onSubscribe(listener)
menuItem.setOnMenuItemClickListener(listener)
}
private class Listener(
private val menuItem: MenuItem,
private val handled: (MenuItem) -> Boolean,
private val observer: Observer<in Unit>
) : MainThreadDisposable(), OnMenuItemClickListener {
override fun onMenuItemClick(item: MenuItem): Boolean {
if (!isDisposed) {
try {
if (handled(menuItem)) {
observer.onNext(Unit)
return true
}
} catch (e: Exception) {
observer.onError(e)
dispose()
}
}
return false
}
override fun onDispose() {
menuItem.setOnMenuItemClickListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachEvent.kt
================================================
package com.jakewharton.rxbinding4.view
import android.content.Context
import android.view.View
/**
* A view attach event on a view.
*
* **Warning:** Instances keep a strong reference to the view. Operators that
* cache instances have the potential to leak the associated [Context].
*/
sealed class ViewAttachEvent {
/** The view from which this event occurred. */
abstract val view: View
}
/**
* A view attached event on a view.
*
* **Warning:** Instances keep a strong reference to the view. Operators that cache
* instances have the potential to leak the associated [Context].
*/
data class ViewAttachAttachedEvent(
override val view: View
) : ViewAttachEvent()
/**
* A view detached event on a view.
*
* **Warning:** Instances keep a strong reference to the view. Operators that cache
* instances have the potential to leak the associated [Context].
*/
data class ViewAttachDetachedEvent(
override val view: View
) : ViewAttachEvent()
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachEventObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.View.OnAttachStateChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of attach and detach events on `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*/
@CheckResult
fun View.attachEvents(): Observable<ViewAttachEvent> {
return ViewAttachEventObservable(this)
}
private class ViewAttachEventObservable(
private val view: View
) : Observable<ViewAttachEvent>() {
override fun subscribeActual(observer: Observer<in ViewAttachEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.addOnAttachStateChangeListener(listener)
}
private class Listener(
private val view: View,
private val observer: Observer<in ViewAttachEvent>
) : MainThreadDisposable(), OnAttachStateChangeListener {
override fun onViewAttachedToWindow(v: View) {
if (!isDisposed) {
observer.onNext(ViewAttachAttachedEvent(view))
}
}
override fun onViewDetachedFromWindow(v: View) {
if (!isDisposed) {
observer.onNext(ViewAttachDetachedEvent(view))
}
}
override fun onDispose() {
view.removeOnAttachStateChangeListener(this)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachesObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.View.OnAttachStateChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable which emits on `view` attach events. The emitted value is
* unspecified and should only be used as notification.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*/
@CheckResult
fun View.attaches(): Observable<Unit> {
return ViewAttachesObservable(this, true)
}
/**
* Create an observable which emits on `view` detach events. The emitted value is
* unspecified and should only be used as notification.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*/
@CheckResult
fun View.detaches(): Observable<Unit> {
return ViewAttachesObservable(this, false)
}
private class ViewAttachesObservable(
private val view: View,
private val callOnAttach: Boolean
) : Observable<Unit>() {
override fun subscribeActual(observer: Observer<in Unit>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, callOnAttach, observer)
observer.onSubscribe(listener)
view.addOnAttachStateChangeListener(listener)
}
private class Listener(
private val view: View,
private val callOnAttach: Boolean,
private val observer: Observer<in Unit>
) : MainThreadDisposable(), OnAttachStateChangeListener {
override fun onViewAttachedToWindow(v: View) {
if (callOnAttach && !isDisposed) {
observer.onNext(Unit)
}
}
override fun onViewDetachedFromWindow(v: View) {
if (!callOnAttach && !isDisposed) {
observer.onNext(Unit)
}
}
override fun onDispose() {
view.removeOnAttachStateChangeListener(this)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewClickObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.View.OnClickListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable which emits on `view` click events. The emitted value is
* unspecified and should only be used as notification.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses [View.setOnClickListener] to observe
* clicks. Only one observable can be used for a view at a time.
*/
@CheckResult
fun View.clicks(): Observable<Unit> {
return ViewClickObservable(this)
}
private class ViewClickObservable(
private val view: View
) : Observable<Unit>() {
override fun subscribeActual(observer: Observer<in Unit>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.setOnClickListener(listener)
}
private class Listener(
private val view: View,
private val observer: Observer<in Unit>
) : MainThreadDisposable(), OnClickListener {
override fun onClick(v: View) {
if (!isDisposed) {
observer.onNext(Unit)
}
}
override fun onDispose() {
view.setOnClickListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewDragObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.DragEvent
import android.view.View
import android.view.View.OnDragListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of [DragEvent] for `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses [View.setOnDragListener] to observe
* drags. Only one observable can be used for a view at a time.
*
* @param handled Predicate invoked with each value to determine the return value of the
* underlying [View.OnDragListener].
*/
@CheckResult
@JvmOverloads
fun View.drags(handled: (DragEvent) -> Boolean = AlwaysTrue): Observable<DragEvent> {
return ViewDragObservable(this, handled)
}
private class ViewDragObservable(
private val view: View,
private val handled: (DragEvent) -> Boolean
) : Observable<DragEvent>() {
override fun subscribeActual(observer: Observer<in DragEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, handled, observer)
observer.onSubscribe(listener)
view.setOnDragListener(listener)
}
private class Listener(
private val view: View,
private val handled: (DragEvent) -> Boolean,
private val observer: Observer<in DragEvent>
) : MainThreadDisposable(), OnDragListener {
override fun onDrag(v: View, event: DragEvent): Boolean {
if (!isDisposed) {
try {
if (handled(event)) {
observer.onNext(event)
return true
}
} catch (e: Exception) {
observer.onError(e)
dispose()
}
}
return false
}
override fun onDispose() {
view.setOnDragListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewFocusChangeObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.View.OnFocusChangeListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
/**
* Create an observable of booleans representing the focus of `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses [View.setOnFocusChangeListener] to observe
* focus change. Only one observable can be used for a view at a time.
*
* *Note:* A value will be emitted immediately on subscribe.
*/
@CheckResult
fun View.focusChanges(): InitialValueObservable<Boolean> {
return ViewFocusChangeObservable(this)
}
private class ViewFocusChangeObservable(
private val view: View
) : InitialValueObservable<Boolean>() {
override val initialValue: Boolean
get() = view.hasFocus()
override fun subscribeListener(observer: Observer<in Boolean>) {
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.onFocusChangeListener = listener
}
private class Listener(
private val view: View,
private val observer: Observer<in Boolean>
) : MainThreadDisposable(), OnFocusChangeListener {
override fun onFocusChange(v: View, hasFocus: Boolean) {
if (!isDisposed) {
observer.onNext(hasFocus)
}
}
override fun onDispose() {
view.onFocusChangeListener = null
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewGroupHierarchyChangeEvent.kt
================================================
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.ViewGroup
sealed class ViewGroupHierarchyChangeEvent {
/** The view from which this event occurred. */
abstract val view: ViewGroup
/** The child from which this event occurred. */
abstract val child: View
}
/**
* A child view add event on a [ViewGroup].
*
* **Warning:** Instances keep a strong reference to the view. Operators that cache
* instances have the potential to leak the associated [android.content.Context].
*/
data class ViewGroupHierarchyChildViewAddEvent(
override val view: ViewGroup,
override val child: View
) : ViewGroupHierarchyChangeEvent()
/**
* A child view remove event on a [ViewGroup].
*
* **Warning:** Instances keep a strong reference to the view. Operators that cache
* instances have the potential to leak the associated [android.content.Context].
*/
data class ViewGroupHierarchyChildViewRemoveEvent(
override val view: ViewGroup,
override val child: View
) : ViewGroupHierarchyChangeEvent()
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewGroupHierarchyChangeEventObservable.kt
================================================
@file:JvmName("RxViewGroup")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.OnHierarchyChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of hierarchy change events for `viewGroup`.
*
* *Warning:* The created observable keeps a strong reference to `viewGroup`.
* Unsubscribe to free this reference.
*/
@CheckResult
fun ViewGroup.changeEvents(): Observable<ViewGroupHierarchyChangeEvent> {
return ViewGroupHierarchyChangeEventObservable(this)
}
private class ViewGroupHierarchyChangeEventObservable(
private val viewGroup: ViewGroup
) : Observable<ViewGroupHierarchyChangeEvent>() {
override fun subscribeActual(observer: Observer<in ViewGroupHierarchyChangeEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(viewGroup, observer)
observer.onSubscribe(listener)
viewGroup.setOnHierarchyChangeListener(listener)
}
private class Listener(
private val viewGroup: ViewGroup,
private val observer: Observer<in ViewGroupHierarchyChangeEvent>
) : MainThreadDisposable(), OnHierarchyChangeListener {
override fun onChildViewAdded(parent: View, child: View) {
if (!isDisposed) {
observer.onNext(ViewGroupHierarchyChildViewAddEvent(viewGroup, child))
}
}
override fun onChildViewRemoved(parent: View, child: View) {
if (!isDisposed) {
observer.onNext(ViewGroupHierarchyChildViewRemoveEvent(viewGroup, child))
}
}
override fun onDispose() {
viewGroup.setOnHierarchyChangeListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewHoverObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.MotionEvent
import android.view.View
import android.view.View.OnHoverListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import com.jakewharton.rxbinding4.internal.checkMainThread
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
/**
* Create an observable of hover events for `view`.
*
* *Warning:* Values emitted by this observable are **mutable** and part of a shared
* object pool and thus are **not safe** to cache or delay reading (such as by observing
* on a different thread). If you want to cache or delay reading the items emitted then you must
* map values through a function which calls [MotionEvent.obtain] or
* [MotionEvent.obtainNoHistory] to create a copy.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses [View.setOnHoverListener] to observe
* touches. Only one observable can be used for a view at a time.
*
* @param handled Predicate invoked with each value to determine the return value of the
* underlying [View.OnHoverListener].
*/
@CheckResult
@JvmOverloads
fun View.hovers(
handled: (MotionEvent) -> Boolean = AlwaysTrue
): Observable<MotionEvent> {
return ViewHoverObservable(this, handled)
}
private class ViewHoverObservable(
private val view: View,
private val handled: (MotionEvent) -> Boolean
) : Observable<MotionEvent>() {
override fun subscribeActual(observer: Observer<in MotionEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, handled, observer)
observer.onSubscribe(listener)
view.setOnHoverListener(listener)
}
private class Listener(
private val view: View, private val handled: (MotionEvent) -> Boolean,
private val observer: Observer<in MotionEvent>
) : MainThreadDisposable(), OnHoverListener {
override fun onHover(v: View, event: MotionEvent): Boolean {
if (!isDisposed) {
try {
if (handled(event)) {
observer.onNext(event)
return true
}
} catch (e: Exception) {
observer.onError(e)
dispose()
}
}
return false
}
override fun onDispose() {
view.setOnHoverListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewKeyObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.KeyEvent
import android.view.View
import android.view.View.OnKeyListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of key events for `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
* *Warning:* The created observable uses [View.setOnKeyListener] to observe
* key events. Only one observable can be used for a view at a time.
*
* @param handled Predicate invoked each occurrence to determine the return value of the
* underlying [View.OnKeyListener].
*/
@CheckResult
@JvmOverloads
fun View.keys(handled: (KeyEvent) -> Boolean = AlwaysTrue): Observable<KeyEvent> {
return ViewKeyObservable(this, handled)
}
private class ViewKeyObservable(
private val view: View,
private val handled: (KeyEvent) -> Boolean
) : Observable<KeyEvent>() {
override fun subscribeActual(observer: Observer<in KeyEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, handled, observer)
observer.onSubscribe(listener)
view.setOnKeyListener(listener)
}
private class Listener(
private val view: View,
private val handled: (KeyEvent) -> Boolean,
private val observer: Observer<in KeyEvent>
) : MainThreadDisposable(), OnKeyListener {
override fun onKey(v: View, keyCode: Int, event: KeyEvent): Boolean {
if (!isDisposed) {
try {
if (handled(event)) {
observer.onNext(event)
return true
}
} catch (e: Exception) {
observer.onError(e)
dispose()
}
}
return false
}
override fun onDispose() {
view.setOnKeyListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLayoutChangeEventObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.content.Context
import android.view.View
import android.view.View.OnLayoutChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of layout-change events for `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*/
@CheckResult
fun View.layoutChangeEvents(): Observable<ViewLayoutChangeEvent> {
return ViewLayoutChangeEventObservable(this)
}
/**
* A layout-change event on a view.
*
* **Warning:** Instances keep a strong reference to the view. Operators that cache
* instances have the potential to leak the associated [Context].
*/
data class ViewLayoutChangeEvent(
/** The view from which this event occurred. */
val view: View,
val left: Int,
val top: Int,
val right: Int,
val bottom: Int,
val oldLeft: Int,
val oldTop: Int,
val oldRight: Int,
val oldBottom: Int
)
/**
* A scroll-change event on a view.
*
* **Warning:** Instances keep a strong reference to the view. Operators that cache
* instances have the potential to leak the associated [android.content.Context].
*/
data class ViewScrollChangeEvent(
/** The view from which this event occurred. */
val view: View,
val scrollX: Int,
val scrollY: Int,
val oldScrollX: Int,
val oldScrollY: Int
)
private class ViewLayoutChangeEventObservable(
private val view: View
) : Observable<ViewLayoutChangeEvent>() {
override fun subscribeActual(observer: Observer<in ViewLayoutChangeEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.addOnLayoutChangeListener(listener)
}
private class Listener(
private val view: View,
private val observer: Observer<in ViewLayoutChangeEvent>
) : MainThreadDisposable(), OnLayoutChangeListener {
override fun onLayoutChange(
v: View, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int,
oldTop: Int, oldRight: Int, oldBottom: Int
) {
if (!isDisposed) {
observer.onNext(
ViewLayoutChangeEvent(v, left, top, right, bottom, oldLeft, oldTop, oldRight,
oldBottom))
}
}
override fun onDispose() {
view.removeOnLayoutChangeListener(this)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLayoutChangeObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.View.OnLayoutChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable which emits on `view` layout changes. The emitted value is
* unspecified and should only be used as notification.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*/
@CheckResult
fun View.layoutChanges(): Observable<Unit> {
return ViewLayoutChangeObservable(this)
}
private class ViewLayoutChangeObservable(
private val view: View
) : Observable<Unit>() {
override fun subscribeActual(observer: Observer<in Unit>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.addOnLayoutChangeListener(listener)
}
private class Listener(
private val view: View,
private val observer: Observer<in Unit>
) : MainThreadDisposable(), OnLayoutChangeListener {
override fun onLayoutChange(
v: View, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int,
oldTop: Int, oldRight: Int, oldBottom: Int
) {
if (!isDisposed) {
observer.onNext(Unit)
}
}
override fun onDispose() {
view.removeOnLayoutChangeListener(this)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLongClickObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.View.OnLongClickListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import java.util.concurrent.Callable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable which emits on `view` long-click events. The emitted value is
* unspecified and should only be used as notification.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses [View.setOnLongClickListener] to observe
* long clicks. Only one observable can be used for a view at a time.
*
* @param handled Predicate invoked each occurrence to determine the return value of the
* underlying [View.OnLongClickListener].
*/
@CheckResult
@JvmOverloads
fun View.longClicks(handled: () -> Boolean = AlwaysTrue): Observable<Unit> {
return ViewLongClickObservable(this, handled)
}
private class ViewLongClickObservable(
private val view: View,
private val handled: () -> Boolean
) : Observable<Unit>() {
override fun subscribeActual(observer: Observer<in Unit>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, handled, observer)
observer.onSubscribe(listener)
view.setOnLongClickListener(listener)
}
private class Listener(
private val view: View,
private val handled: () -> Boolean,
private val observer: Observer<in Unit>
) : MainThreadDisposable(), OnLongClickListener {
override fun onLongClick(v: View): Boolean {
if (!isDisposed) {
try {
if (handled()) {
observer.onNext(Unit)
return true
}
} catch (e: Exception) {
observer.onError(e)
dispose()
}
}
return false
}
override fun onDispose() {
view.setOnLongClickListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewScrollChangeEventObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import androidx.annotation.RequiresApi
import android.view.View
import android.view.View.OnScrollChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of scroll-change events for `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*/
@RequiresApi(23)
@CheckResult
fun View.scrollChangeEvents(): Observable<ViewScrollChangeEvent> {
return ViewScrollChangeEventObservable(this)
}
@RequiresApi(23)
private class ViewScrollChangeEventObservable(
private val view: View
) : Observable<ViewScrollChangeEvent>() {
override fun subscribeActual(observer: Observer<in ViewScrollChangeEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.setOnScrollChangeListener(listener)
}
private class Listener(
private val view: View,
private val observer: Observer<in ViewScrollChangeEvent>
) : MainThreadDisposable(), OnScrollChangeListener {
override fun onScrollChange(
v: View,
scrollX: Int,
scrollY: Int,
oldScrollX: Int,
oldScrollY: Int
) {
if (!isDisposed) {
observer.onNext(ViewScrollChangeEvent(v, scrollX, scrollY, oldScrollX, oldScrollY))
}
}
override fun onDispose() {
view.setOnScrollChangeListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewSystemUiVisibilityChangeObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.View.OnSystemUiVisibilityChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of integers representing a new system UI visibility for `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses
* [View.setOnSystemUiVisibilityChangeListener] to observe system UI visibility changes.
* Only one observable can be used for a view at a time.
*/
@CheckResult
fun View.systemUiVisibilityChanges(): Observable<Int> {
return ViewSystemUiVisibilityChangeObservable(this)
}
private class ViewSystemUiVisibilityChangeObservable(
private val view: View
) : Observable<Int>() {
override fun subscribeActual(observer: Observer<in Int>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.setOnSystemUiVisibilityChangeListener(listener)
}
private class Listener(
private val view: View,
private val observer: Observer<in Int>
) : MainThreadDisposable(), OnSystemUiVisibilityChangeListener {
override fun onSystemUiVisibilityChange(visibility: Int) {
if (!isDisposed) {
observer.onNext(visibility)
}
}
override fun onDispose() {
view.setOnSystemUiVisibilityChangeListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTouchObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.MotionEvent
import android.view.View
import android.view.View.OnTouchListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of touch events for `view`.
*
*
* *Warning:* Values emitted by this observable are **mutable** and part of a shared
* object pool and thus are **not safe** to cache or delay reading (such as by observing
* on a different thread). If you want to cache or delay reading the items emitted then you must
* map values through a function which calls [MotionEvent.obtain] or
* [MotionEvent.obtainNoHistory] to create a copy.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses [View.setOnTouchListener] to observe
* touches. Only one observable can be used for a view at a time.
*
* @param handled Predicate invoked with each value to determine the return value of the
* underlying [View.OnTouchListener].
*/
@CheckResult
@JvmOverloads
fun View.touches(
handled: (MotionEvent) -> Boolean = AlwaysTrue
): Observable<MotionEvent> {
return ViewTouchObservable(this, handled)
}
private class ViewTouchObservable(
private val view: View,
private val handled: (MotionEvent) -> Boolean
) : Observable<MotionEvent>() {
override fun subscribeActual(observer: Observer<in MotionEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, handled, observer)
observer.onSubscribe(listener)
view.setOnTouchListener(listener)
}
private class Listener(
private val view: View,
private val handled: (MotionEvent) -> Boolean,
private val observer: Observer<in MotionEvent>
) : MainThreadDisposable(), OnTouchListener {
override fun onTouch(v: View, event: MotionEvent): Boolean {
if (!isDisposed) {
try {
if (handled(event)) {
observer.onNext(event)
return true
}
} catch (e: Exception) {
observer.onError(e)
dispose()
}
}
return false
}
override fun onDispose() {
view.setOnTouchListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverDrawObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import androidx.annotation.RequiresApi
import android.view.View
import android.view.ViewTreeObserver
import android.view.ViewTreeObserver.OnDrawListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable for draws on `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses [ViewTreeObserver.addOnDrawListener] to
* observe draws. Multiple observables can be used for a view at a time.
*/
@RequiresApi(16)
@CheckResult
fun View.draws(): Observable<Unit> {
return ViewTreeObserverDrawObservable(this)
}
@RequiresApi(16)
private class ViewTreeObserverDrawObservable(
private val view: View
) : Observable<Unit>() {
override fun subscribeActual(observer: Observer<in Unit>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.viewTreeObserver
.addOnDrawListener(listener)
}
private class Listener(
private val view: View,
private val observer: Observer<in Unit>
) : MainThreadDisposable(), OnDrawListener {
override fun onDraw() {
if (!isDisposed) {
observer.onNext(Unit)
}
}
override fun onDispose() {
view.viewTreeObserver.removeOnDrawListener(this)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverGlobalLayoutObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.ViewTreeObserver
import android.view.ViewTreeObserver.OnGlobalLayoutListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable which emits on `view` globalLayout events. The emitted value is
* unspecified and should only be used as notification.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses [ ][ViewTreeObserver.addOnGlobalLayoutListener] to observe global layouts. Multiple observables
* can be used for a view at a time.
*/
@CheckResult
fun View.globalLayouts(): Observable<Unit> {
return ViewTreeObserverGlobalLayoutObservable(this)
}
private class ViewTreeObserverGlobalLayoutObservable(
private val view: View
) : Observable<Unit>() {
override fun subscribeActual(observer: Observer<in Unit>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.viewTreeObserver
.addOnGlobalLayoutListener(listener)
}
private class Listener(
private val view: View,
private val observer: Observer<in Unit>
) : MainThreadDisposable(), OnGlobalLayoutListener {
override fun onGlobalLayout() {
if (!isDisposed) {
observer.onNext(Unit)
}
}
override fun onDispose() {
@Suppress("DEPRECATION") // Correct when minSdk 16.
view.viewTreeObserver.removeGlobalOnLayoutListener(this)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverPreDrawObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import android.view.View
import android.view.ViewTreeObserver
import android.view.ViewTreeObserver.OnPreDrawListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import java.util.concurrent.Callable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable for pre-draws on `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses [ViewTreeObserver.addOnPreDrawListener] to
* observe pre-draws. Multiple observables can be used for a view at a time.
*/
@CheckResult
fun View.preDraws(proceedDrawingPass: () -> Boolean): Observable<Unit> {
return ViewTreeObserverPreDrawObservable(this, proceedDrawingPass)
}
private class ViewTreeObserverPreDrawObservable(
private val view: View,
private val proceedDrawingPass: () -> Boolean
) : Observable<Unit>() {
override fun subscribeActual(observer: Observer<in Unit>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, proceedDrawingPass, observer)
observer.onSubscribe(listener)
view.viewTreeObserver
.addOnPreDrawListener(listener)
}
private class Listener(
private val view: View,
private val proceedDrawingPass: () -> Boolean,
private val observer: Observer<in Unit>
) : MainThreadDisposable(), OnPreDrawListener {
override fun onPreDraw(): Boolean {
if (!isDisposed) {
observer.onNext(Unit)
try {
return proceedDrawingPass()
} catch (e: Exception) {
observer.onError(e)
dispose()
}
}
return true
}
override fun onDispose() {
view.viewTreeObserver.removeOnPreDrawListener(this)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewVisibilityConsumer.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.view
import androidx.annotation.CheckResult
import android.view.View
import io.reactivex.rxjava3.functions.Consumer
/**
* An action which sets the visibility property of `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe to free this
* reference.
*
* @param visibilityWhenFalse Visibility to set on a `false` value (`View.INVISIBLE` or
* `View.GONE`).
*/
@CheckResult
@JvmOverloads
fun View.visibility(visibilityWhenFalse: Int = View.GONE): Consumer<in Boolean> {
require(visibilityWhenFalse != View.VISIBLE) {
"Setting visibility to VISIBLE when false would have no effect."
}
require(visibilityWhenFalse == View.INVISIBLE || visibilityWhenFalse == View.GONE) {
"Must set visibility to INVISIBLE or GONE when false."
}
return Consumer { value -> visibility = if (value) View.VISIBLE else visibilityWhenFalse }
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AbsListViewScrollEventObservable.kt
================================================
@file:JvmName("RxAbsListView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.widget.AbsListView
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of scroll events on `absListView`.
*
* *Warning:* The created observable keeps a strong reference to `absListView`.
* Unsubscribe to free this reference.
*
* *Warning:* The created observable uses
* [AbsListView.setOnScrollListener] to observe scroll
* changes. Only one observable can be used for a view at a time.
*/
@CheckResult
fun AbsListView.scrollEvents(): Observable<AbsListViewScrollEvent> {
return AbsListViewScrollEventObservable(this)
}
data class AbsListViewScrollEvent(
/** The view from which this event occurred. */
val view: AbsListView,
val scrollState: Int,
val firstVisibleItem: Int,
val visibleItemCount: Int,
val totalItemCount: Int
)
private class AbsListViewScrollEventObservable(
private val view: AbsListView
) : Observable<AbsListViewScrollEvent>() {
override fun subscribeActual(observer: Observer<in AbsListViewScrollEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.setOnScrollListener(listener)
}
private class Listener(
private val view: AbsListView,
private val observer: Observer<in AbsListViewScrollEvent>
) : MainThreadDisposable(), AbsListView.OnScrollListener {
private var currentScrollState = AbsListView.OnScrollListener.SCROLL_STATE_IDLE
override fun onScrollStateChanged(absListView: AbsListView, scrollState: Int) {
currentScrollState = scrollState
if (!isDisposed) {
val event = AbsListViewScrollEvent(view, scrollState, view.firstVisiblePosition,
view.childCount, view.count)
observer.onNext(event)
}
}
override fun onScroll(
absListView: AbsListView, firstVisibleItem: Int, visibleItemCount: Int,
totalItemCount: Int
) {
if (!isDisposed) {
val event = AbsListViewScrollEvent(view, currentScrollState, firstVisibleItem,
visibleItemCount, totalItemCount)
observer.onNext(event)
}
}
override fun onDispose() {
view.setOnScrollListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterDataChangeObservable.kt
================================================
@file:JvmName("RxAdapter")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.database.DataSetObserver
import android.widget.Adapter
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of data change events for `adapter`.
*
* *Note:* A value will be emitted immediately on subscribe.
*/
@CheckResult
fun <T : Adapter> T.dataChanges(): InitialValueObservable<T> {
return AdapterDataChangeObservable(this)
}
private class AdapterDataChangeObservable<T : Adapter>(
private val adapter: T
) : InitialValueObservable<T>() {
override fun subscribeListener(observer: Observer<in T>) {
if (!checkMainThread(observer)) {
return
}
val disposableDataSetObserver = ObserverDisposable(initialValue, observer)
initialValue.registerDataSetObserver(disposableDataSetObserver.dataSetObserver)
observer.onSubscribe(disposableDataSetObserver)
}
override val initialValue get() = adapter
private class ObserverDisposable<T : Adapter>(
private val adapter: T,
observer: Observer<in T>
) : MainThreadDisposable() {
@JvmField val dataSetObserver = object : DataSetObserver() {
override fun onChanged() {
if (!isDisposed) {
observer.onNext(adapter)
}
}
}
override fun onDispose() {
adapter.unregisterDataSetObserver(dataSetObserver)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemClickEventObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemClickListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of the item click events for `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*/
@CheckResult
fun <T : Adapter> AdapterView<T>.itemClickEvents(): Observable<AdapterViewItemClickEvent> {
return AdapterViewItemClickEventObservable(this)
}
data class AdapterViewItemClickEvent(
/** The view from which this event occurred. */
val view: AdapterView<*>,
val clickedView: View?,
val position: Int,
val id: Long
)
private class AdapterViewItemClickEventObservable(
private val view: AdapterView<*>
) : Observable<AdapterViewItemClickEvent>() {
override fun subscribeActual(observer: Observer<in AdapterViewItemClickEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.onItemClickListener = listener
}
private class Listener(
private val view: AdapterView<*>,
private val observer: Observer<in AdapterViewItemClickEvent>
) : MainThreadDisposable(), OnItemClickListener {
override fun onItemClick(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
if (!isDisposed) {
observer.onNext(AdapterViewItemClickEvent(parent, view, position, id))
}
}
override fun onDispose() {
view.onItemClickListener = null
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemClickObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemClickListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of the position of item clicks for `view`.
*
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*/
@CheckResult
fun <T : Adapter> AdapterView<T>.itemClicks(): Observable<Int> {
return AdapterViewItemClickObservable(this)
}
private class AdapterViewItemClickObservable(
private val view: AdapterView<*>
) : Observable<Int>() {
override fun subscribeActual(observer: Observer<in Int>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.onItemClickListener = listener
}
private class Listener(
private val view: AdapterView<*>,
private val observer: Observer<in Int>
) : MainThreadDisposable(), OnItemClickListener {
override fun onItemClick(adapterView: AdapterView<*>, view: View?, position: Int, id: Long) {
if (!isDisposed) {
observer.onNext(position)
}
}
override fun onDispose() {
view.onItemClickListener = null
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemLongClickEventObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemLongClickListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of the item long-click events for `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* @param handled Function invoked with each value to determine the return value of the
* underlying [AdapterView.OnItemLongClickListener].
*/
@CheckResult
@JvmOverloads
fun <T : Adapter> AdapterView<T>.itemLongClickEvents(
handled: (AdapterViewItemLongClickEvent) -> Boolean = AlwaysTrue
): Observable<AdapterViewItemLongClickEvent> {
return AdapterViewItemLongClickEventObservable(this, handled)
}
data class AdapterViewItemLongClickEvent(
/** The view from which this event occurred. */
val view: AdapterView<*>,
val clickedView: View?,
val position: Int,
val id: Long
)
private class AdapterViewItemLongClickEventObservable(
private val view: AdapterView<*>,
private val handled: (AdapterViewItemLongClickEvent) -> Boolean
) : Observable<AdapterViewItemLongClickEvent>() {
override fun subscribeActual(observer: Observer<in AdapterViewItemLongClickEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer, handled)
observer.onSubscribe(listener)
view.onItemLongClickListener = listener
}
private class Listener(
private val view: AdapterView<*>,
private val observer: Observer<in AdapterViewItemLongClickEvent>,
private val handled: (AdapterViewItemLongClickEvent) -> Boolean
) : MainThreadDisposable(), OnItemLongClickListener {
override fun onItemLongClick(
parent: AdapterView<*>,
view: View?,
position: Int,
id: Long
): Boolean {
if (!isDisposed) {
val event = AdapterViewItemLongClickEvent(parent, view, position, id)
try {
if (handled(event)) {
observer.onNext(event)
return true
}
} catch (e: Exception) {
observer.onError(e)
dispose()
}
}
return false
}
override fun onDispose() {
view.onItemLongClickListener = null
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemLongClickObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemLongClickListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import java.util.concurrent.Callable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of the position of item long-clicks for `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* @param handled Function invoked each occurrence to determine the return value of the
* underlying [AdapterView.OnItemLongClickListener].
*/
@CheckResult
@JvmOverloads
fun <T : Adapter> AdapterView<T>.itemLongClicks(
handled: () -> Boolean = AlwaysTrue
): Observable<Int> {
return AdapterViewItemLongClickObservable(this, handled)
}
private class AdapterViewItemLongClickObservable(
private val view: AdapterView<*>,
private val handled: () -> Boolean
) : Observable<Int>() {
override fun subscribeActual(observer: Observer<in Int>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer, handled)
observer.onSubscribe(listener)
view.onItemLongClickListener = listener
}
private class Listener(
private val view: AdapterView<*>,
private val observer: Observer<in Int>,
private val handled: () -> Boolean
) : MainThreadDisposable(), OnItemLongClickListener {
override fun onItemLongClick(
parent: AdapterView<*>,
view: View?,
position: Int,
id: Long
): Boolean {
if (!isDisposed) {
try {
if (handled()) {
observer.onNext(position)
return true
}
} catch (e: Exception) {
observer.onError(e)
dispose()
}
}
return false
}
override fun onDispose() {
view.onItemLongClickListener = null
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemSelectionObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemSelectedListener
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import android.widget.AdapterView.INVALID_POSITION
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of the selected position of `view`. If nothing is selected,
* [AdapterView.INVALID_POSITION] will be emitted.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Note:* A value will be emitted immediately on subscribe.
*/
@CheckResult
fun <T : Adapter> AdapterView<T>.itemSelections(): InitialValueObservable<Int> {
return AdapterViewItemSelectionObservable(this)
}
private class AdapterViewItemSelectionObservable(
private val view: AdapterView<*>
) : InitialValueObservable<Int>() {
override fun subscribeListener(observer: Observer<in Int>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
view.onItemSelectedListener = listener
observer.onSubscribe(listener)
}
override val initialValue get() = view.selectedItemPosition
private class Listener(
private val view: AdapterView<*>,
private val observer: Observer<in Int>
) : MainThreadDisposable(), OnItemSelectedListener {
override fun onItemSelected(adapterView: AdapterView<*>, view: View?, position: Int, id: Long) {
if (!isDisposed) {
observer.onNext(position)
}
}
override fun onNothingSelected(adapterView: AdapterView<*>) {
if (!isDisposed) {
observer.onNext(INVALID_POSITION)
}
}
override fun onDispose() {
view.onItemSelectedListener = null
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewSelectionEvent.kt
================================================
package com.jakewharton.rxbinding4.widget
import android.view.View
import android.widget.AdapterView
sealed class AdapterViewSelectionEvent {
/** The view from which this event occurred. */
abstract val view: AdapterView<*>
}
data class AdapterViewItemSelectionEvent(
override val view: AdapterView<*>,
val selectedView: View?,
val position: Int,
val id: Long
) : AdapterViewSelectionEvent()
data class AdapterViewNothingSelectionEvent(
override val view: AdapterView<*>
) : AdapterViewSelectionEvent()
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewSelectionObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemSelectedListener
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import android.widget.AdapterView.INVALID_POSITION
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of selection events for `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Note:* A value will be emitted immediately on subscribe.
*/
@CheckResult
fun <T : Adapter> AdapterView<T>.selectionEvents(): InitialValueObservable<AdapterViewSelectionEvent> {
return AdapterViewSelectionObservable(this)
}
private class AdapterViewSelectionObservable(
private val view: AdapterView<*>
) : InitialValueObservable<AdapterViewSelectionEvent>() {
override fun subscribeListener(observer: Observer<in AdapterViewSelectionEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
view.onItemSelectedListener = listener
observer.onSubscribe(listener)
}
override val initialValue: AdapterViewSelectionEvent
get() {
val selectedPosition = view.selectedItemPosition
return if (selectedPosition == INVALID_POSITION) {
AdapterViewNothingSelectionEvent(view)
} else {
val selectedView = view.selectedView
val selectedId = view.selectedItemId
AdapterViewItemSelectionEvent(view, selectedView, selectedPosition, selectedId)
}
}
private class Listener(
private val view: AdapterView<*>,
private val observer: Observer<in AdapterViewSelectionEvent>
) : MainThreadDisposable(), OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
if (!isDisposed) {
observer.onNext(AdapterViewItemSelectionEvent(parent, view, position, id))
}
}
override fun onNothingSelected(parent: AdapterView<*>) {
if (!isDisposed) {
observer.onNext(AdapterViewNothingSelectionEvent(parent))
}
}
override fun onDispose() {
view.onItemSelectedListener = null
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AutoCompleteTextViewItemClickEventObservable.kt
================================================
@file:JvmName("RxAutoCompleteTextView")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.view.View
import android.widget.AdapterView
import android.widget.AdapterView.OnItemClickListener
import android.widget.AutoCompleteTextView
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of item click events on `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*/
@CheckResult
fun AutoCompleteTextView.itemClickEvents(): Observable<AdapterViewItemClickEvent> {
return AutoCompleteTextViewItemClickEventObservable(this)
}
private class AutoCompleteTextViewItemClickEventObservable(
private val view: AutoCompleteTextView
) : Observable<AdapterViewItemClickEvent>() {
override fun subscribeActual(observer: Observer<in AdapterViewItemClickEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.onItemClickListener = listener
}
private class Listener(
private val view: AutoCompleteTextView,
private val observer: Observer<in AdapterViewItemClickEvent>
) : MainThreadDisposable(), OnItemClickListener {
override fun onItemClick(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
if (!isDisposed) {
observer.onNext(AdapterViewItemClickEvent(parent, view, position, id))
}
}
override fun onDispose() {
view.onItemClickListener = null
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/CompoundButtonCheckedChangeObservable.kt
================================================
@file:JvmName("RxCompoundButton")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.widget.CompoundButton
import android.widget.CompoundButton.OnCheckedChangeListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of booleans representing the checked state of `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Warning:* The created observable uses [CompoundButton.setOnCheckedChangeListener]
* to observe checked changes. Only one observable can be used for a view at a time.
*
* *Note:* A value will be emitted immediately on subscribe.
*/
@CheckResult
fun CompoundButton.checkedChanges(): InitialValueObservable<Boolean> {
return CompoundButtonCheckedChangeObservable(this)
}
private class CompoundButtonCheckedChangeObservable(
private val view: CompoundButton
) : InitialValueObservable<Boolean>() {
override fun subscribeListener(observer: Observer<in Boolean>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.setOnCheckedChangeListener(listener)
}
override val initialValue get() = view.isChecked
private class Listener(
private val view: CompoundButton,
private val observer: Observer<in Boolean>
) : MainThreadDisposable(), OnCheckedChangeListener {
override fun onCheckedChanged(compoundButton: CompoundButton, isChecked: Boolean) {
if (!isDisposed) {
observer.onNext(isChecked)
}
}
override fun onDispose() {
view.setOnCheckedChangeListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/PopupMenuDismissObservable.kt
================================================
@file:JvmName("RxPopupMenu")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.widget.PopupMenu
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable which emits on `view` dismiss events. The emitted value is
* unspecified and should only be used as notification.
*
* *Warning:* The created observable keeps a strong reference to `view`.
* Unsubscribe to free this reference.
*
* *Warning:* The created observable uses [PopupMenu.setOnDismissListener] to
* observe dismiss change. Only one observable can be used for a view at a time.
*/
@CheckResult
fun PopupMenu.dismisses(): Observable<Unit> {
return PopupMenuDismissObservable(this)
}
private class PopupMenuDismissObservable(
private val view: PopupMenu
) : Observable<Unit>() {
override fun subscribeActual(observer: Observer<in Unit>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
view.setOnDismissListener(listener)
observer.onSubscribe(listener)
}
private class Listener(
private val view: PopupMenu,
private val observer: Observer<in Unit>
) : MainThreadDisposable(), PopupMenu.OnDismissListener {
override fun onDismiss(popupMenu: PopupMenu) {
if (!isDisposed) {
observer.onNext(Unit)
}
}
override fun onDispose() {
view.setOnDismissListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/PopupMenuItemClickObservable.kt
================================================
@file:JvmName("RxPopupMenu")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.view.MenuItem
import android.widget.PopupMenu
import android.widget.PopupMenu.OnMenuItemClickListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable which emits the clicked item in `view`'s menu.
*
* *Warning:* The created observable keeps a strong reference to `view`.
* Unsubscribe to free this reference.
*
* *Warning:* The created observable uses [PopupMenu.setOnMenuItemClickListener]
* to observe dismiss change. Only one observable can be used for a view at a time.
*/
@CheckResult
fun PopupMenu.itemClicks(): Observable<MenuItem> {
return PopupMenuItemClickObservable(this)
}
private class PopupMenuItemClickObservable(
private val view: PopupMenu
) : Observable<MenuItem>() {
override fun subscribeActual(observer: Observer<in MenuItem>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
view.setOnMenuItemClickListener(listener)
observer.onSubscribe(listener)
}
private class Listener(
private val view: PopupMenu,
private val observer: Observer<in MenuItem>
) : MainThreadDisposable(), OnMenuItemClickListener {
override fun onMenuItemClick(menuItem: MenuItem): Boolean {
if (!isDisposed) {
observer.onNext(menuItem)
return true
}
return false
}
override fun onDispose() {
view.setOnMenuItemClickListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RadioGroupCheckedChangeObservable.kt
================================================
@file:JvmName("RxRadioGroup")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.widget.RadioGroup
import android.widget.RadioGroup.OnCheckedChangeListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of the checked view ID changes in `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Note:* A value will be emitted immediately on subscribe.
*/
@CheckResult
fun RadioGroup.checkedChanges(): InitialValueObservable<Int> {
return RadioGroupCheckedChangeObservable(this)
}
private class RadioGroupCheckedChangeObservable(
private val view: RadioGroup
) : InitialValueObservable<Int>() {
override fun subscribeListener(observer: Observer<in Int>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
view.setOnCheckedChangeListener(listener)
observer.onSubscribe(listener)
}
override val initialValue get() = view.checkedRadioButtonId
private class Listener(
private val view: RadioGroup,
private val observer: Observer<in Int>
) : MainThreadDisposable(), OnCheckedChangeListener {
private var lastChecked = -1
override fun onCheckedChanged(radioGroup: RadioGroup, checkedId: Int) {
if (!isDisposed && checkedId != lastChecked) {
lastChecked = checkedId
observer.onNext(checkedId)
}
}
override fun onDispose() {
view.setOnCheckedChangeListener(null)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RadioGroupToggleCheckedConsumer.kt
================================================
@file:JvmName("RxRadioGroup")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import androidx.annotation.CheckResult
import android.widget.RadioGroup
import io.reactivex.rxjava3.functions.Consumer
/**
* An action which sets the checked child of `view` with ID. Passing `-1` will clear
* any checked view.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*/
@CheckResult
fun RadioGroup.checked(): Consumer<in Int> {
return Consumer { value ->
if (value == -1) {
clearCheck()
} else {
check(value!!)
}
}
}
================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RatingBarRatingChangeEventObservable.kt
================================================
@file:JvmName("RxRatingBar")
@file:JvmMultifileClass
package com.jakewharton.rxbinding4.widget
import android.widget.RatingBar
import android.widget.RatingBar.OnRatingBarChangeListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import com.jakewharton.rxbinding4.internal.checkMainThread
/**
* Create an observable of the rating change events on `view`.
*
* *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
* to free this reference.
*
* *Note:* A value will be emitted immediately on subscribe.
*/
@CheckResult
fun RatingBar.ratingChangeEvents(): InitialValueObservable<RatingBarChangeEvent> {
return RatingBarRatingChangeEventObservable(this)
}
data class RatingBarChangeEvent(
/** The view from which this event occurred. */
val view: RatingBar,
val rating: Float,
val fromUser: Boolean
)
private class RatingBarRatingChangeEventObservable(
private val view: RatingBar
) : InitialValueObservable<RatingBarChangeEvent>() {
override fun subscribeListener(observer: Observer<in RatingBarChangeEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
view.onRatingBarChangeListener = listener
observer.onSubscribe(listener)
}
override val initialValue get() = RatingBarChangeEvent(view, view.rating, false)
private class Listener(
private val view: RatingBar,
private val observer: Observer<in RatingBarChangeEvent>
) : MainThreadDisposable(), OnRatingBarChangeListener {
override fun onRatingChanged(ratingBar: RatingBar, rating: Float, fromUser: Boolean) {
if (!isDisposed) {
observer.onNext(RatingBarChangeEvent(ratingBar, rating, fromUser))
}
}
override fun onDispose() {
view.onRatingBarChangeListener = null
}
}
}
===============
gitextract_m_pj7wzf/
├── .github/
│ └── workflows/
│ └── build.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE.txt
├── README.md
├── RELEASING.md
├── build.gradle
├── gradle/
│ ├── gradle-mvn-push.gradle
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── rxbinding/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jakewharton/
│ │ │ └── rxbinding4/
│ │ │ ├── internal/
│ │ │ │ └── MainThreadKtTest.java
│ │ │ ├── view/
│ │ │ │ ├── RxMenuItemTest.java
│ │ │ │ ├── RxViewAttachTest.java
│ │ │ │ ├── RxViewAttachTestActivity.java
│ │ │ │ ├── RxViewGroupTest.java
│ │ │ │ ├── RxViewSystemUiVisibilityTest.java
│ │ │ │ ├── RxViewSystemUiVisibilityTestActivity.java
│ │ │ │ └── RxViewTest.java
│ │ │ └── widget/
│ │ │ ├── RxAbsListViewTest.java
│ │ │ ├── RxAbsListViewTestActivity.java
│ │ │ ├── RxAdapterTest.java
│ │ │ ├── RxAdapterViewTest.java
│ │ │ ├── RxAdapterViewTestActivity.java
│ │ │ ├── RxAutoCompleteTextViewTest.java
│ │ │ ├── RxAutoCompleteTextViewTestActivity.java
│ │ │ ├── RxCompoundButtonTest.java
│ │ │ ├── RxPopupMenuTest.java
│ │ │ ├── RxPopupMenuTestActivity.java
│ │ │ ├── RxRadioGroupTest.java
│ │ │ ├── RxRatingBarTest.java
│ │ │ ├── RxRatingBarTestActivity.java
│ │ │ ├── RxSearchViewTest.java
│ │ │ ├── RxSearchViewTestActivity.java
│ │ │ ├── RxSeekBarTest.java
│ │ │ ├── RxSeekBarTestActivity.java
│ │ │ ├── RxTextViewTest.java
│ │ │ ├── RxToolbarTest.java
│ │ │ └── RxToolbarTestActivity.java
│ │ └── res/
│ │ ├── drawable/
│ │ │ └── icon.xml
│ │ └── values/
│ │ ├── ids.xml
│ │ └── strings.xml
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ ├── InitialValueObservable.kt
│ ├── internal/
│ │ ├── mainThread.kt
│ │ └── true.kt
│ ├── view/
│ │ ├── MenuItemActionViewEvent.kt
│ │ ├── MenuItemActionViewEventObservable.kt
│ │ ├── MenuItemClickObservable.kt
│ │ ├── ViewAttachEvent.kt
│ │ ├── ViewAttachEventObservable.kt
│ │ ├── ViewAttachesObservable.kt
│ │ ├── ViewClickObservable.kt
│ │ ├── ViewDragObservable.kt
│ │ ├── ViewFocusChangeObservable.kt
│ │ ├── ViewGroupHierarchyChangeEvent.kt
│ │ ├── ViewGroupHierarchyChangeEventObservable.kt
│ │ ├── ViewHoverObservable.kt
│ │ ├── ViewKeyObservable.kt
│ │ ├── ViewLayoutChangeEventObservable.kt
│ │ ├── ViewLayoutChangeObservable.kt
│ │ ├── ViewLongClickObservable.kt
│ │ ├── ViewScrollChangeEventObservable.kt
│ │ ├── ViewSystemUiVisibilityChangeObservable.kt
│ │ ├── ViewTouchObservable.kt
│ │ ├── ViewTreeObserverDrawObservable.kt
│ │ ├── ViewTreeObserverGlobalLayoutObservable.kt
│ │ ├── ViewTreeObserverPreDrawObservable.kt
│ │ └── ViewVisibilityConsumer.kt
│ └── widget/
│ ├── AbsListViewScrollEventObservable.kt
│ ├── AdapterDataChangeObservable.kt
│ ├── AdapterViewItemClickEventObservable.kt
│ ├── AdapterViewItemClickObservable.kt
│ ├── AdapterViewItemLongClickEventObservable.kt
│ ├── AdapterViewItemLongClickObservable.kt
│ ├── AdapterViewItemSelectionObservable.kt
│ ├── AdapterViewSelectionEvent.kt
│ ├── AdapterViewSelectionObservable.kt
│ ├── AutoCompleteTextViewItemClickEventObservable.kt
│ ├── CompoundButtonCheckedChangeObservable.kt
│ ├── PopupMenuDismissObservable.kt
│ ├── PopupMenuItemClickObservable.kt
│ ├── RadioGroupCheckedChangeObservable.kt
│ ├── RadioGroupToggleCheckedConsumer.kt
│ ├── RatingBarRatingChangeEventObservable.kt
│ ├── RatingBarRatingChangeObservable.kt
│ ├── SearchViewQueryConsumer.kt
│ ├── SearchViewQueryTextChangeEventsObservable.kt
│ ├── SearchViewQueryTextChangesObservable.kt
│ ├── SearchViewQueryTextEvent.kt
│ ├── SeekBarChangeEvent.kt
│ ├── SeekBarChangeEventObservable.kt
│ ├── SeekBarChangeObservable.kt
│ ├── TextViewAfterTextChangeEventObservable.kt
│ ├── TextViewBeforeTextChangeEventObservable.kt
│ ├── TextViewEditorActionEventObservable.kt
│ ├── TextViewEditorActionObservable.kt
│ ├── TextViewTextChangeEventObservable.kt
│ ├── TextViewTextChangesObservable.kt
│ ├── ToolbarItemClickObservable.kt
│ └── ToolbarNavigationClickObservable.kt
├── rxbinding-appcompat/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── appcompat/
│ │ ├── RxActionMenuViewTest.java
│ │ ├── RxPopupMenuTest.java
│ │ ├── RxPopupMenuTestActivity.java
│ │ ├── RxSearchViewTest.java
│ │ ├── RxSearchViewTestActivity.java
│ │ ├── RxToolbarTest.java
│ │ └── RxToolbarTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── appcompat/
│ ├── ActionMenuViewItemClickObservable.kt
│ ├── PopupMenuDismissObservable.kt
│ ├── PopupMenuItemClickObservable.kt
│ ├── SearchViewQueryTextChangeEventsObservable.kt
│ ├── SearchViewQueryTextChangesObservable.kt
│ ├── SearchViewQueryTextEvent.kt
│ ├── SearchViewSetQueryConsumer.kt
│ ├── ToolbarItemClickObservable.kt
│ └── ToolbarNavigationClickObservable.kt
├── rxbinding-core/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── core/
│ │ ├── RxNestedScrollViewTest.java
│ │ └── RxNestedScrollViewTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── core/
│ └── NestedScrollViewScrollChangeEventObservable.kt
├── rxbinding-drawerlayout/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── drawerlayout/
│ │ ├── RxDrawerLayoutTest.java
│ │ └── RxDrawerLayoutTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── drawerlayout/
│ ├── DrawerLayoutDrawerOpenedObservable.kt
│ └── DrawerLayoutOpenConsumer.kt
├── rxbinding-leanback/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── leanback/
│ │ ├── RxSearchBarTest.java
│ │ ├── RxSearchBarTestActivity.java
│ │ ├── RxSearchEditTextTest.java
│ │ └── RxSearchEditTextTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── leanback/
│ ├── SearchBarSearchQueryChangeEventsObservable.kt
│ ├── SearchBarSearchQueryChangesObservable.kt
│ ├── SearchBarSearchQueryEvent.kt
│ └── SearchEditTextKeyboardDismissObservable.kt
├── rxbinding-material/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jakewharton/
│ │ │ └── rxbinding4/
│ │ │ └── material/
│ │ │ ├── RxAppBarLayoutTest.java
│ │ │ ├── RxBottomNavigationViewTest.java
│ │ │ ├── RxChipTest.kt
│ │ │ ├── RxFloatingActionButtonTest.java
│ │ │ ├── RxNavigationViewTest.java
│ │ │ ├── RxSnackbarTest.java
│ │ │ ├── RxSwipeDismissBehaviorTest.java
│ │ │ ├── RxSwipeDismissBehaviorTestActivity.java
│ │ │ └── RxTabLayoutTest.java
│ │ └── res/
│ │ ├── menu/
│ │ │ └── menu.xml
│ │ └── values/
│ │ └── strings.xml
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── material/
│ ├── AppBarLayoutOffsetChangeObservable.kt
│ ├── BottomNavigationViewItemSelectionsObservable.kt
│ ├── ChipCloseIconClicksObservable.kt
│ ├── FloatingActionButtonVisibilityConsumer.kt
│ ├── NavigationViewItemSelectionsObservable.kt
│ ├── SnackbarDismissesObservable.kt
│ ├── SwipeDismissBehaviorObservable.kt
│ ├── TabLayoutSelectConsumer.kt
│ ├── TabLayoutSelectionEvent.kt
│ ├── TabLayoutSelectionEventObservable.kt
│ └── TabLayoutSelectionsObservable.kt
├── rxbinding-recyclerview/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── recyclerview/
│ │ ├── RxRecyclerViewAdapterTest.java
│ │ ├── RxRecyclerViewTest.java
│ │ └── RxRecyclerViewTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── recyclerview/
│ ├── RecyclerAdapterDataChangeObservable.kt
│ ├── RecyclerViewChildAttachStateChangeEventObservable.kt
│ ├── RecyclerViewChildAttachStateChangeEvents.kt
│ ├── RecyclerViewFlingEventObservable.kt
│ ├── RecyclerViewScrollEventObservable.kt
│ └── RecyclerViewScrollStateChangeObservable.kt
├── rxbinding-slidingpanelayout/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── slidingpanelayout/
│ │ ├── RxSlidingPaneLayoutTest.java
│ │ └── RxSlidingPaneLayoutTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── slidingpanelayout/
│ ├── SlidingPaneLayoutOpenConsumer.kt
│ ├── SlidingPaneLayoutPaneOpenedObservable.kt
│ └── SlidingPaneLayoutSlideObservable.kt
├── rxbinding-swiperefreshlayout/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── jakewharton/
│ │ │ └── rxbinding4/
│ │ │ └── swiperefreshlayout/
│ │ │ ├── RxSwipeRefreshLayoutTest.java
│ │ │ └── RxSwipeRefreshLayoutTestActivity.java
│ │ └── res/
│ │ └── values/
│ │ └── ids.xml
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── swiperefreshlayout/
│ └── SwipeRefreshLayoutRefreshObservable.kt
├── rxbinding-viewpager/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── viewpager/
│ │ ├── RxViewPagerTest.java
│ │ └── RxViewPagerTestActivity.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── viewpager/
│ ├── ViewPagerPageScrollStateChangedObservable.kt
│ ├── ViewPagerPageScrolledObservable.kt
│ └── ViewPagerPageSelectedObservable.kt
├── rxbinding-viewpager2/
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── jakewharton/
│ │ └── rxbinding4/
│ │ └── viewpager2/
│ │ ├── RxViewPager2Test.kt
│ │ └── RxViewPager2TestActivity.kt
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── jakewharton/
│ └── rxbinding4/
│ └── viewpager2/
│ ├── PageScrollStateChangedObservable.kt
│ ├── PageScrolledObservable.kt
│ └── PageSelectedObservable.kt
├── settings.gradle
└── testing-utils/
├── build.gradle
└── src/
└── main/
├── AndroidManifest.xml
└── java/
└── com/
└── jakewharton/
└── rxbinding4/
├── MotionEventUtil.java
├── RecordingObserver.java
├── RxBindingTestRunner.java
├── TouchUtilsBackport.java
├── UnsafeRunnable.java
└── ViewDirtyIdlingResource.java
SYMBOL INDEX (336 symbols across 66 files)
FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxActionMenuViewTest.java
class RxActionMenuViewTest (line 16) | public final class RxActionMenuViewTest {
method setUp (line 22) | @Before public void setUp() {
method itemClicks (line 26) | @Test @UiThreadTest public void itemClicks() {
FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxPopupMenuTest.java
class RxPopupMenuTest (line 19) | public final class RxPopupMenuTest {
method setUp (line 27) | @Before public void setUp() {
method itemClicks (line 31) | @Test @UiThreadTest public void itemClicks() {
method dismisses (line 52) | @Test public void dismisses() {
FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxPopupMenuTestActivity.java
class RxPopupMenuTestActivity (line 8) | public final class RxPopupMenuTestActivity extends Activity {
method onCreate (line 12) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxSearchViewTest.java
class RxSearchViewTest (line 15) | public final class RxSearchViewTest {
method setUp (line 22) | @Before public void setUp() {
method queryTextChanges (line 26) | @Test @UiThreadTest public void queryTextChanges() {
method query (line 46) | @Test @UiThreadTest public void query() throws Throwable {
method queryTextEventNotSubmitted (line 54) | @Test @UiThreadTest public void queryTextEventNotSubmitted() {
method queryTextEventSubmitted (line 67) | @Test @UiThreadTest public void queryTextEventSubmitted() {
FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxSearchViewTestActivity.java
class RxSearchViewTestActivity (line 8) | public final class RxSearchViewTestActivity extends Activity {
method onCreate (line 11) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxToolbarTest.java
class RxToolbarTest (line 21) | public final class RxToolbarTest {
method setUp (line 27) | @Before public void setUp() {
method itemClicks (line 32) | @Test @UiThreadTest public void itemClicks() {
method navigationClicks (line 53) | @Test public void navigationClicks() {
FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxToolbarTestActivity.java
class RxToolbarTestActivity (line 7) | public final class RxToolbarTestActivity extends Activity {
method onCreate (line 12) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding-core/src/androidTest/java/com/jakewharton/rxbinding4/core/RxNestedScrollViewTest.java
class RxNestedScrollViewTest (line 15) | public final class RxNestedScrollViewTest {
method setUp (line 21) | @Before public void setUp() {
method scrollChangeEvents (line 26) | @Test @UiThreadTest public void scrollChangeEvents() {
FILE: rxbinding-core/src/androidTest/java/com/jakewharton/rxbinding4/core/RxNestedScrollViewTestActivity.java
class RxNestedScrollViewTestActivity (line 12) | public final class RxNestedScrollViewTestActivity extends Activity {
method onCreate (line 16) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding-drawerlayout/src/androidTest/java/com/jakewharton/rxbinding4/drawerlayout/RxDrawerLayoutTest.java
class RxDrawerLayoutTest (line 27) | public final class RxDrawerLayoutTest {
method setUp (line 37) | @Before public void setUp() {
method tearDown (line 45) | @After public void tearDown() {
method drawerOpen (line 49) | @Test public void drawerOpen() {
method open (line 68) | @Test public void open() {
FILE: rxbinding-drawerlayout/src/androidTest/java/com/jakewharton/rxbinding4/drawerlayout/RxDrawerLayoutTestActivity.java
class RxDrawerLayoutTestActivity (line 13) | public final class RxDrawerLayoutTestActivity extends Activity {
method onCreate (line 16) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchBarTest.java
class RxSearchBarTest (line 15) | public final class RxSearchBarTest {
method setUp (line 22) | @Before public void setUp() {
method searchQueryChanges (line 28) | @Test @UiThreadTest public void searchQueryChanges() {
method searchQueryChangeEvents (line 44) | @Test @UiThreadTest public void searchQueryChangeEvents() {
method searchQueryChangeEventsKeyboardDismissed (line 58) | @Test @UiThreadTest public void searchQueryChangeEventsKeyboardDismiss...
FILE: rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchBarTestActivity.java
class RxSearchBarTestActivity (line 9) | public final class RxSearchBarTestActivity extends Activity {
method onCreate (line 13) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchEditTextTest.java
class RxSearchEditTextTest (line 14) | public final class RxSearchEditTextTest {
method setUp (line 19) | @Before public void setUp() {
method keyboardDismisses (line 23) | @Test @UiThreadTest public void keyboardDismisses() {
FILE: rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchEditTextTestActivity.java
class RxSearchEditTextTestActivity (line 7) | public final class RxSearchEditTextTestActivity extends Activity {
method onCreate (line 10) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxAppBarLayoutTest.java
class RxAppBarLayoutTest (line 17) | public class RxAppBarLayoutTest {
method setUp (line 23) | @Before public void setUp() {
method offsetChanges (line 27) | @SdkSuppress(minSdkVersion = 17)
FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxBottomNavigationViewTest.java
class RxBottomNavigationViewTest (line 18) | public final class RxBottomNavigationViewTest {
method setUp (line 24) | @Before public void setUp() {
method teardown (line 28) | @After public void teardown() {
method itemSelections (line 32) | @Test @UiThreadTest public void itemSelections() {
FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxFloatingActionButtonTest.java
class RxFloatingActionButtonTest (line 14) | public class RxFloatingActionButtonTest {
method visibility (line 19) | @Test
FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxNavigationViewTest.java
class RxNavigationViewTest (line 16) | public final class RxNavigationViewTest {
method setUp (line 24) | @Before public void setUp() {
method itemSelections (line 28) | @Test @UiThreadTest public void itemSelections() {
method itemSelectionsInitialValue (line 45) | @Test @UiThreadTest public void itemSelectionsInitialValue() {
FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSnackbarTest.java
class RxSnackbarTest (line 18) | public final class RxSnackbarTest {
method dismisses (line 24) | @Test public void dismisses() {
FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSwipeDismissBehaviorTest.java
class RxSwipeDismissBehaviorTest (line 22) | public final class RxSwipeDismissBehaviorTest {
method setUp (line 28) | @Before public void setUp() {
method dismisses (line 33) | @Test public void dismisses() {
method swipeRight (line 52) | private static ViewAction swipeRight() {
FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSwipeDismissBehaviorTestActivity.java
class RxSwipeDismissBehaviorTestActivity (line 8) | public class RxSwipeDismissBehaviorTestActivity extends Activity {
method onCreate (line 12) | @SuppressWarnings("ResourceType")
FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxTabLayoutTest.java
class RxTabLayoutTest (line 17) | public final class RxTabLayoutTest {
method setUp (line 24) | @Before public void setUp() {
method selectionEvents (line 29) | @Test @UiThreadTest public void selectionEvents() {
method selectionEventsNoInitial (line 51) | @Test @UiThreadTest public void selectionEventsNoInitial() {
method selections (line 59) | @Test @UiThreadTest public void selections() {
method selectionsNoInitial (line 79) | @Test @UiThreadTest public void selectionsNoInitial() {
method select (line 87) | @Test @UiThreadTest public void select() throws Throwable {
method selectInvalidValueThrows (line 96) | @Test @UiThreadTest public void selectInvalidValueThrows() throws Thro...
FILE: rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewAdapterTest.java
class RxRecyclerViewAdapterTest (line 12) | public final class RxRecyclerViewAdapterTest {
method dataChanges (line 15) | @Test @UiThreadTest public void dataChanges() {
class TestRecyclerAdapter (line 31) | private static final class TestRecyclerAdapter extends RecyclerView.Ad...
method TestRecyclerAdapter (line 32) | TestRecyclerAdapter() {
method onCreateViewHolder (line 35) | @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int...
method onBindViewHolder (line 39) | @Override public void onBindViewHolder(ViewHolder holder, int positi...
method getItemCount (line 42) | @Override public int getItemCount() {
FILE: rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewTest.java
class RxRecyclerViewTest (line 24) | public final class RxRecyclerViewTest {
method setUp (line 35) | @Before public void setUp() {
method tearDown (line 43) | @After public void tearDown() {
method childAttachEvents (line 47) | @Test public void childAttachEvents() {
method childDetachEvents (line 66) | @Test public void childDetachEvents() {
method scrollEventsVertical (line 87) | @Test public void scrollEventsVertical() {
method scrollEventsHorizontal (line 119) | @Test public void scrollEventsHorizontal() {
method flingEventsVertical (line 155) | @Test public void flingEventsVertical() {
method flingEventsHorizontal (line 183) | @Test public void flingEventsHorizontal() {
class SimpleAdapter (line 215) | private class SimpleAdapter extends RecyclerView.Adapter {
method SimpleAdapter (line 218) | SimpleAdapter(View child) {
method onCreateViewHolder (line 222) | @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGrou...
method onBindViewHolder (line 227) | @Override public void onBindViewHolder(RecyclerView.ViewHolder holde...
method getItemCount (line 230) | @Override public int getItemCount() {
class Adapter (line 235) | private static class Adapter extends RecyclerView.Adapter<ViewHolder> {
method Adapter (line 236) | public Adapter() {
method onCreateViewHolder (line 240) | @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int...
method onBindViewHolder (line 245) | @Override public void onBindViewHolder(ViewHolder holder, int positi...
method getItemCount (line 249) | @Override public int getItemCount() {
method getItemId (line 253) | @Override public long getItemId(int position) {
class ViewHolder (line 258) | private static class ViewHolder extends RecyclerView.ViewHolder {
method ViewHolder (line 262) | ViewHolder(TextView itemView) {
FILE: rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewTestActivity.java
class RxRecyclerViewTestActivity (line 8) | public final class RxRecyclerViewTestActivity extends Activity {
method onCreate (line 11) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding-slidingpanelayout/src/androidTest/java/com/jakewharton/rxbinding4/slidingpanelayout/RxSlidingPaneLayoutTest.java
class RxSlidingPaneLayoutTest (line 28) | public class RxSlidingPaneLayoutTest {
method setUp (line 39) | @Before public void setUp() {
method teardown (line 47) | @After public void teardown() {
method paneOpen (line 51) | @Test public void paneOpen() {
method slides (line 70) | @Test public void slides() {
method open (line 98) | @Test public void open() {
method isOpen (line 132) | private static Matcher<View> isOpen() {
method isClosed (line 144) | private static Matcher<View> isClosed() {
FILE: rxbinding-slidingpanelayout/src/androidTest/java/com/jakewharton/rxbinding4/slidingpanelayout/RxSlidingPaneLayoutTestActivity.java
class RxSlidingPaneLayoutTestActivity (line 12) | public final class RxSlidingPaneLayoutTestActivity extends Activity {
method onCreate (line 15) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding-swiperefreshlayout/src/androidTest/java/com/jakewharton/rxbinding4/swiperefreshlayout/RxSwipeRefreshLayoutTest.java
class RxSwipeRefreshLayoutTest (line 20) | public final class RxSwipeRefreshLayoutTest {
method setUp (line 26) | @Before public void setUp() {
method refreshes (line 31) | @Test public void refreshes() throws InterruptedException {
method swipeDown (line 46) | private static ViewAction swipeDown() {
FILE: rxbinding-swiperefreshlayout/src/androidTest/java/com/jakewharton/rxbinding4/swiperefreshlayout/RxSwipeRefreshLayoutTestActivity.java
class RxSwipeRefreshLayoutTestActivity (line 16) | public final class RxSwipeRefreshLayoutTestActivity extends Activity {
method run (line 21) | @Override public void run() {
method onCreate (line 26) | @Override protected void onCreate(Bundle savedInstanceState) {
method onPause (line 50) | @Override protected void onPause() {
FILE: rxbinding-viewpager/src/androidTest/java/com/jakewharton/rxbinding4/viewpager/RxViewPagerTest.java
class RxViewPagerTest (line 24) | public final class RxViewPagerTest {
method setUp (line 32) | @Before public void setUp() {
method pageScrollEvents (line 37) | @Test public void pageScrollEvents() {
method pageScrollStateChanges (line 61) | @Test public void pageScrollStateChanges() {
method pageSelections (line 81) | @Test @UiThreadTest public void pageSelections() {
method swipeLeft (line 98) | private static ViewAction swipeLeft() {
FILE: rxbinding-viewpager/src/androidTest/java/com/jakewharton/rxbinding4/viewpager/RxViewPagerTestActivity.java
class RxViewPagerTestActivity (line 11) | public final class RxViewPagerTestActivity extends Activity {
method onCreate (line 14) | @SuppressWarnings("ResourceType")
class Adapter (line 25) | private static class Adapter extends PagerAdapter {
method Adapter (line 26) | Adapter() {
method getCount (line 29) | @Override public int getCount() {
method isViewFromObject (line 33) | @Override public boolean isViewFromObject(View view, Object object) {
method instantiateItem (line 37) | @Override public Object instantiateItem(ViewGroup container, int pos...
method destroyItem (line 43) | @Override public void destroyItem(ViewGroup container, int position,...
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/internal/MainThreadKtTest.java
class MainThreadKtTest (line 10) | public final class MainThreadKtTest {
method checkMainOnMainDoesNotNotify (line 11) | @UiThreadTest
method checkMainOnNotMainNotifies (line 18) | @Test public void checkMainOnNotMainNotifies() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxMenuItemTest.java
class RxMenuItemTest (line 22) | public final class RxMenuItemTest {
method clicks (line 26) | @Test @UiThreadTest public void clicks() {
method clicksAvoidHandling (line 43) | @Test @UiThreadTest public void clicksAvoidHandling() {
method actionViewEvents (line 60) | @Test @UiThreadTest public void actionViewEvents() {
method actionViewEventsAvoidHandling (line 77) | @Test @UiThreadTest public void actionViewEventsAvoidHandling() {
class TestMenuItem (line 95) | private static final class TestMenuItem implements MenuItem {
method TestMenuItem (line 119) | public TestMenuItem(Context context) {
method performClick (line 123) | public void performClick() {
method getItemId (line 129) | @Override public int getItemId() {
method getGroupId (line 133) | @Override public int getGroupId() {
method getOrder (line 137) | @Override public int getOrder() {
method setTitle (line 141) | @Override public MenuItem setTitle(CharSequence title) {
method setTitle (line 146) | @Override public MenuItem setTitle(int title) {
method getTitle (line 151) | @Override public CharSequence getTitle() {
method setTitleCondensed (line 155) | @Override public MenuItem setTitleCondensed(CharSequence title) {
method getTitleCondensed (line 160) | @Override public CharSequence getTitleCondensed() {
method setIcon (line 164) | @Override public MenuItem setIcon(Drawable icon) {
method setIcon (line 169) | @Override public MenuItem setIcon(int iconRes) {
method getIcon (line 174) | @Override public Drawable getIcon() {
method setIntent (line 178) | @Override public MenuItem setIntent(Intent intent) {
method getIntent (line 183) | @Override public Intent getIntent() {
method setShortcut (line 187) | @Override public MenuItem setShortcut(char numericChar, char alphaCh...
method setNumericShortcut (line 193) | @Override public MenuItem setNumericShortcut(char numericChar) {
method getNumericShortcut (line 198) | @Override public char getNumericShortcut() {
method setAlphabeticShortcut (line 202) | @Override public MenuItem setAlphabeticShortcut(char alphaChar) {
method getAlphabeticShortcut (line 207) | @Override public char getAlphabeticShortcut() {
method setCheckable (line 211) | @Override public MenuItem setCheckable(boolean checkable) {
method isCheckable (line 216) | @Override public boolean isCheckable() {
method setChecked (line 220) | @Override public MenuItem setChecked(boolean checked) {
method isChecked (line 227) | @Override public boolean isChecked() {
method setVisible (line 231) | @Override public MenuItem setVisible(boolean visible) {
method isVisible (line 236) | @Override public boolean isVisible() {
method setEnabled (line 240) | @Override public MenuItem setEnabled(boolean enabled) {
method isEnabled (line 245) | @Override public boolean isEnabled() {
method hasSubMenu (line 249) | @Override public boolean hasSubMenu() {
method getSubMenu (line 253) | @Override public SubMenu getSubMenu() {
method setOnMenuItemClickListener (line 257) | @Override
method getMenuInfo (line 263) | @Override public ContextMenu.ContextMenuInfo getMenuInfo() {
method setShowAsAction (line 267) | @Override public void setShowAsAction(int actionEnum) {
method setShowAsActionFlags (line 271) | @Override public MenuItem setShowAsActionFlags(int actionEnum) {
method setActionView (line 276) | @Override public MenuItem setActionView(View view) {
method setActionView (line 281) | @Override public MenuItem setActionView(int resId) {
method getActionView (line 286) | @Override public View getActionView() {
method setActionProvider (line 290) | @Override public MenuItem setActionProvider(ActionProvider actionPro...
method getActionProvider (line 295) | @Override public ActionProvider getActionProvider() {
method expandActionView (line 299) | @Override public boolean expandActionView() {
method collapseActionView (line 312) | @Override public boolean collapseActionView() {
method isActionViewExpanded (line 325) | @Override public boolean isActionViewExpanded() {
method setOnActionExpandListener (line 329) | @Override public MenuItem setOnActionExpandListener(OnActionExpandLi...
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTest.java
class RxViewAttachTest (line 17) | public final class RxViewAttachTest {
method setUp (line 25) | @Before public void setUp() {
method attaches (line 31) | @Test public void attaches() {
method attachEvents (line 52) | @Test public void attachEvents() {
method detaches (line 73) | @Test public void detaches() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTestActivity.java
class RxViewAttachTestActivity (line 8) | public final class RxViewAttachTestActivity extends Activity {
method onCreate (line 12) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewGroupTest.java
class RxViewGroupTest (line 13) | public final class RxViewGroupTest {
method childViewEvents (line 18) | @Test @UiThreadTest public void childViewEvents() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTest.java
class RxViewSystemUiVisibilityTest (line 16) | public final class RxViewSystemUiVisibilityTest {
method setUp (line 23) | @Before public void setUp() {
method systemUiVisibilityChanges (line 29) | @Test public void systemUiVisibilityChanges() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTestActivity.java
class RxViewSystemUiVisibilityTestActivity (line 7) | public final class RxViewSystemUiVisibilityTestActivity extends Activity {
method onCreate (line 10) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewTest.java
class RxViewTest (line 32) | public final class RxViewTest {
method clicks (line 36) | @Test @UiThreadTest public void clicks() {
method drags (line 53) | @Test @UiThreadTest public void drags() {
method drawEvents (line 73) | @SdkSuppress(minSdkVersion = 16)
method focusChanges (line 88) | @Test @UiThreadTest public void focusChanges() {
method globalLayouts (line 112) | @Test @UiThreadTest public void globalLayouts() {
method hovers (line 126) | @Test @UiThreadTest public void hovers() {
method layoutChanges (line 145) | @Test @UiThreadTest public void layoutChanges() {
method layoutChangeEvents (line 161) | @Test @UiThreadTest public void layoutChangeEvents() {
method longClicks (line 180) | @Test @UiThreadTest public void longClicks() {
method preDrawEvents (line 205) | @Test @UiThreadTest public void preDrawEvents() {
method scrollChangeEvents (line 219) | @SdkSuppress(minSdkVersion = 23)
method touches (line 246) | @Test @UiThreadTest public void touches() {
method keys (line 265) | @Test @UiThreadTest public void keys() {
method visibility (line 284) | @Test @UiThreadTest public void visibility() throws Throwable {
method visibilityCustomFalse (line 293) | @Test @UiThreadTest public void visibilityCustomFalse() throws Throwab...
method setVisibilityCustomFalseToVisibleThrows (line 302) | @SuppressWarnings("ResourceType") @Test @UiThreadTest public void setV...
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTest.java
class RxAbsListViewTest (line 15) | public final class RxAbsListViewTest {
method setUp (line 24) | @Before public void setUp() {
method scrollEvents (line 29) | @Test public void scrollEvents() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTestActivity.java
class RxAbsListViewTestActivity (line 11) | public final class RxAbsListViewTestActivity extends Activity {
method onCreate (line 17) | @Override protected void onCreate(Bundle savedInstanceState) {
method createValues (line 31) | private static List<String> createValues(int count) {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterTest.java
class RxAdapterTest (line 12) | public final class RxAdapterTest {
method dataChanges (line 15) | @Test @UiThreadTest public void dataChanges() {
class TestAdapter (line 31) | private static final class TestAdapter extends BaseAdapter {
method TestAdapter (line 32) | TestAdapter() {
method getCount (line 35) | @Override public int getCount() {
method getItem (line 39) | @Override public Object getItem(int position) {
method getItemId (line 43) | @Override public long getItemId(int position) {
method getView (line 47) | @Override public View getView(int position, View convertView, ViewGr...
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTest.java
class RxAdapterViewTest (line 18) | public final class RxAdapterViewTest {
method setUp (line 28) | @Before public void setUp() {
method itemSelections (line 34) | @Test public void itemSelections() {
method selectionEvents (line 53) | @Test public void selectionEvents() {
method itemClicks (line 86) | @Test public void itemClicks() {
method itemClickEvents (line 105) | @Test public void itemClickEvents() {
method itemLongClicks (line 125) | @Test public void itemLongClicks() {
method itemLongClickEvents (line 129) | @Test public void itemLongClickEvents() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTestActivity.java
class RxAdapterViewTestActivity (line 13) | public final class RxAdapterViewTestActivity extends Activity {
method onCreate (line 20) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTest.java
class RxAutoCompleteTextViewTest (line 30) | public final class RxAutoCompleteTextViewTest {
method setUp (line 39) | @Before public void setUp() {
method itemClickEvents (line 44) | @Test public void itemClickEvents() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTestActivity.java
class RxAutoCompleteTextViewTestActivity (line 13) | public final class RxAutoCompleteTextViewTestActivity extends Activity {
method onCreate (line 16) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxCompoundButtonTest.java
class RxCompoundButtonTest (line 14) | public final class RxCompoundButtonTest {
method checkedChanges (line 18) | @Test @UiThreadTest public void checkedChanges() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTest.java
class RxPopupMenuTest (line 19) | public final class RxPopupMenuTest {
method setUp (line 27) | @Before public void setUp() {
method itemClicks (line 31) | @Test @UiThreadTest public void itemClicks() {
method dismisses (line 52) | @Test public void dismisses() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTestActivity.java
class RxPopupMenuTestActivity (line 8) | public final class RxPopupMenuTestActivity extends Activity {
method onCreate (line 12) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRadioGroupTest.java
class RxRadioGroupTest (line 15) | @SuppressWarnings("ResourceType") // Don't need real IDs for test case.
method setUp (line 20) | @Before public void setUp() {
method checkedChanges (line 29) | @Test @UiThreadTest public void checkedChanges() {
method checked (line 49) | @Test @UiThreadTest public void checked() throws Throwable {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTest.java
class RxRatingBarTest (line 18) | public final class RxRatingBarTest {
method setUp (line 26) | @Before public void setUp() {
method ratingChanges (line 30) | @Test public void ratingChanges() {
method ratingChangeEvents (line 49) | @Test public void ratingChangeEvents() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTestActivity.java
class RxRatingBarTestActivity (line 7) | public final class RxRatingBarTestActivity extends Activity {
method onCreate (line 10) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTest.java
class RxSearchViewTest (line 15) | public final class RxSearchViewTest {
method setUp (line 22) | @Before public void setUp() {
method queryTextChanges (line 26) | @Test @UiThreadTest public void queryTextChanges() {
method query (line 46) | @Test @UiThreadTest public void query() throws Throwable {
method queryTextEventNotSubmitted (line 54) | @Test @UiThreadTest public void queryTextEventNotSubmitted() {
method queryTextEventSubmitted (line 67) | @Test @UiThreadTest public void queryTextEventSubmitted() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTestActivity.java
class RxSearchViewTestActivity (line 7) | public final class RxSearchViewTestActivity extends Activity {
method onCreate (line 10) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTest.java
class RxSeekBarTest (line 19) | public final class RxSeekBarTest {
method setUp (line 27) | @Before public void setUp() {
method changes (line 31) | @Test public void changes() {
method systemChanges (line 65) | @Test public void systemChanges() {
method userChanges (line 91) | @Test public void userChanges() {
method changeEvents (line 125) | @Test public void changeEvents() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTestActivity.java
class RxSeekBarTestActivity (line 7) | public final class RxSeekBarTestActivity extends Activity {
method onCreate (line 10) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxTextViewTest.java
class RxTextViewTest (line 16) | public final class RxTextViewTest {
method editorActions (line 20) | @Test @UiThreadTest public void editorActions() {
method editorActionEvents (line 37) | @Test @UiThreadTest public void editorActionEvents() {
method textChanges (line 60) | @Test @UiThreadTest public void textChanges() {
method textChangeEvents (line 81) | @Test @UiThreadTest public void textChangeEvents() {
method beforeTextChangeEvents (line 115) | @Test @UiThreadTest public void beforeTextChangeEvents() {
method afterTextChangeEvents (line 149) | @Test @UiThreadTest public void afterTextChangeEvents() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTest.java
class RxToolbarTest (line 22) | @SdkSuppress(minSdkVersion = 21)
method setUp (line 29) | @Before public void setUp() {
method itemClicks (line 34) | @Test @UiThreadTest public void itemClicks() {
method navigationClicks (line 55) | @Test public void navigationClicks() {
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTestActivity.java
class RxToolbarTestActivity (line 8) | @TargetApi(21)
method onCreate (line 14) | @Override protected void onCreate(Bundle savedInstanceState) {
FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/MotionEventUtil.java
class MotionEventUtil (line 8) | public final class MotionEventUtil {
method motionEventAtPosition (line 9) | public static MotionEvent motionEventAtPosition(View view, int action,...
method hoverMotionEventAtPosition (line 36) | public static MotionEvent hoverMotionEventAtPosition(View view, int ac...
method MotionEventUtil (line 54) | private MotionEventUtil() {
FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/RecordingObserver.java
class RecordingObserver (line 12) | public final class RecordingObserver<T> extends DisposableObserver<T> {
method onComplete (line 17) | @Override public void onComplete() {
method onError (line 22) | @Override public void onError(Throwable e) {
method onNext (line 27) | @Override public void onNext(T t) {
method takeEvent (line 32) | private <E> E takeEvent(Class<E> wanted) {
method takeNext (line 47) | public T takeNext() {
method takeError (line 52) | public Throwable takeError() {
method clearEvents (line 56) | public void clearEvents() {
method assertOnCompleted (line 62) | public void assertOnCompleted() {
method assertNoMoreEvents (line 66) | public void assertNoMoreEvents() {
class OnNext (line 74) | private final class OnNext {
method OnNext (line 77) | private OnNext(T value) {
method toString (line 81) | @Override public String toString() {
class OnCompleted (line 86) | private final class OnCompleted {
method toString (line 87) | @Override public String toString() {
class OnError (line 92) | private final class OnError {
method OnError (line 95) | private OnError(Throwable throwable) {
method toString (line 99) | @Override public String toString() {
FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/RxBindingTestRunner.java
class RxBindingTestRunner (line 14) | public final class RxBindingTestRunner extends AndroidJUnitRunner {
method onStart (line 17) | @Override public void onStart() {
method onDestroy (line 32) | @Override public void onDestroy() {
FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/TouchUtilsBackport.java
class TouchUtilsBackport (line 10) | public final class TouchUtilsBackport {
method dragViewTo (line 21) | public static int dragViewTo(View v, int gravity, int toX, int toY) {
method drag (line 47) | public static void drag(float fromX, float toX, float fromY, float toY...
method getStartLocation (line 84) | private static void getStartLocation(View v, int gravity, int[] xy) {
method TouchUtilsBackport (line 117) | private TouchUtilsBackport() {
FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/UnsafeRunnable.java
class UnsafeRunnable (line 3) | public abstract class UnsafeRunnable implements Runnable {
method run (line 5) | @Override
method unsafeRun (line 14) | protected abstract void unsafeRun() throws Throwable;
FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/ViewDirtyIdlingResource.java
class ViewDirtyIdlingResource (line 7) | public final class ViewDirtyIdlingResource implements IdlingResource {
method ViewDirtyIdlingResource (line 11) | public ViewDirtyIdlingResource(Activity activity) {
method getName (line 15) | @Override public String getName() {
method isIdleNow (line 19) | @Override public boolean isIdleNow() {
method registerIdleTransitionCallback (line 27) | @Override public void registerIdleTransitionCallback(ResourceCallback ...
Condensed preview — 235 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (415K chars).
[
{
"path": ".github/workflows/build.yml",
"chars": 1713,
"preview": "name: build\n\non: [push, pull_request]\n\nenv:\n GRADLE_OPTS: \"-Dorg.gradle.jvmargs=-Xmx4g -Dorg.gradle.daemon=false -Dkotl"
},
{
"path": ".gitignore",
"chars": 125,
"preview": "# IntelliJ IDEA\n.idea\n*.iml\nannotations\n\n# Gradle\n.gradle\ngradlew.bat\nbuild\nlocal.properties\nreports\njacoco.exec\n\n.DS_St"
},
{
"path": "CHANGELOG.md",
"chars": 14627,
"preview": "Change Log\n==========\n\nVersion 4.0.0 *(2020-05-19)*\n----------------------------\n\nThis version updates to support RxJava"
},
{
"path": "LICENSE.txt",
"chars": 11358,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 1813,
"preview": "RxBinding\n=========\n\nRxJava binding APIs for Android UI widgets from the platform and support libraries.\n\n\nDownload\n----"
},
{
"path": "RELEASING.md",
"chars": 631,
"preview": "Releasing\n========\n\n 1. Change the version in `gradle.properties` to a non-SNAPSHOT version.\n 2. Update the `CHANGELOG.m"
},
{
"path": "build.gradle",
"chars": 2593,
"preview": "buildscript {\n ext.buildConfig = [\n 'minSdkVersion': 14,\n 'compileSdkVersion': 29,\n ]\n ext.versions = [\n 'ko"
},
{
"path": "gradle/gradle-mvn-push.gradle",
"chars": 3629,
"preview": "/*\n * Copyright 2013 Chris Banes\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not us"
},
{
"path": "gradle/wrapper/gradle-wrapper.properties",
"chars": 202,
"preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
},
{
"path": "gradle.properties",
"chars": 609,
"preview": "GROUP=com.jakewharton.rxbinding4\nVERSION_NAME=4.0.1-SNAPSHOT\n\nPOM_DESCRIPTION=RxJava binding APIs for Android's UI widge"
},
{
"path": "gradlew",
"chars": 5296,
"preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n## Gradle start up"
},
{
"path": "rxbinding/build.gradle",
"chars": 984,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n api deps.androidXAnno"
},
{
"path": "rxbinding/gradle.properties",
"chars": 63,
"preview": "POM_ARTIFACT_ID=rxbinding\nPOM_NAME=RxBinding\nPOM_PACKAGING=aar\n"
},
{
"path": "rxbinding/src/androidTest/AndroidManifest.xml",
"chars": 919,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package="
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/internal/MainThreadKtTest.java",
"chars": 858,
"preview": "package com.jakewharton.rxbinding4.internal;\n\nimport androidx.test.annotation.UiThreadTest;\nimport com.jakewharton.rxbin"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxMenuItemTest.java",
"chars": 8617,
"preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android."
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTest.java",
"chars": 2900,
"preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Instrumentation;\nimport android.view.View;\nimport android.w"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTestActivity.java",
"chars": 462,
"preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.Vie"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewGroupTest.java",
"chars": 1142,
"preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.content.Context;\nimport android.view.View;\nimport android.widge"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTest.java",
"chars": 1810,
"preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Instrumentation;\nimport android.view.View;\nimport android.w"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTestActivity.java",
"chars": 400,
"preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget.F"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewTest.java",
"chars": 10262,
"preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.content.Context;\nimport android.view.KeyEvent;\nimport android.v"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTest.java",
"chars": 1691,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.ListView;\nimport a"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTestActivity.java",
"chars": 1019,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterTest.java",
"chars": 1255,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widg"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTest.java",
"chars": 4426,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.ListView;\nimport a"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTestActivity.java",
"chars": 1009,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTest.java",
"chars": 3175,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.ArrayAdapter;\nimpo"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTestActivity.java",
"chars": 946,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.V"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxCompoundButtonTest.java",
"chars": 1027,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.content.Context;\nimport android.widget.CompoundButton;\nimport"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTest.java",
"chars": 2111,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.view.Menu;\nimport android"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTestActivity.java",
"chars": 465,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.V"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRadioGroupTest.java",
"chars": 1831,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.content.Context;\nimport android.widget.RadioButton;\nimport an"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTest.java",
"chars": 2432,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.RatingBar;\nimport "
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTestActivity.java",
"chars": 456,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTest.java",
"chars": 2851,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.widget.SearchView;\nimport androidx.test.annotation.UiThreadTe"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTestActivity.java",
"chars": 406,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTest.java",
"chars": 5716,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.SeekBar;\nimport an"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTestActivity.java",
"chars": 385,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxTextViewTest.java",
"chars": 5719,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.content.Context;\nimport android.widget.TextView;\nimport andro"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTest.java",
"chars": 2404,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.widge"
},
{
"path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTestActivity.java",
"chars": 651,
"preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport and"
},
{
"path": "rxbinding/src/androidTest/res/drawable/icon.xml",
"chars": 138,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<color\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:col"
},
{
"path": "rxbinding/src/androidTest/res/values/ids.xml",
"chars": 105,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <item type=\"id\" name=\"auto_complete\"/>\n</resources>\n"
},
{
"path": "rxbinding/src/androidTest/res/values/strings.xml",
"chars": 141,
"preview": "<resources>\n <string name=\"hey\">Hey</string>\n <string name=\"ouch\">Ouch</string>\n <string name=\"hint\">Your name here</"
},
{
"path": "rxbinding/src/main/AndroidManifest.xml",
"chars": 49,
"preview": "<manifest package=\"com.jakewharton.rxbinding4\"/>\n"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/InitialValueObservable.kt",
"chars": 636,
"preview": "package com.jakewharton.rxbinding4\n\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observe"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/mainThread.kt",
"chars": 1202,
"preview": "/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance "
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/true.kt",
"chars": 299,
"preview": "package com.jakewharton.rxbinding4.internal\n\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.RestrictTo"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemActionViewEvent.kt",
"chars": 655,
"preview": "package com.jakewharton.rxbinding4.view\n\nimport android.content.Context\nimport android.view.MenuItem\n\n/**\n * An action v"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemActionViewEventObservable.kt",
"chars": 2608,
"preview": "@file:JvmName(\"RxMenuItem\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MenuIt"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemClickObservable.kt",
"chars": 2253,
"preview": "@file:JvmName(\"RxMenuItem\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MenuIt"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachEvent.kt",
"chars": 967,
"preview": "package com.jakewharton.rxbinding4.view\n\nimport android.content.Context\nimport android.view.View\n\n/**\n * A view attach e"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachEventObservable.kt",
"chars": 1634,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachesObservable.kt",
"chars": 2096,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewClickObservable.kt",
"chars": 1554,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewDragObservable.kt",
"chars": 2090,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.DragEvent\n"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewFocusChangeObservable.kt",
"chars": 1630,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewGroupHierarchyChangeEvent.kt",
"chars": 1042,
"preview": "package com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.ViewGroup\n\nsealed class ViewGroupH"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewGroupHierarchyChangeEventObservable.kt",
"chars": 1872,
"preview": "@file:JvmName(\"RxViewGroup\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\n"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewHoverObservable.kt",
"chars": 2514,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MotionEven"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewKeyObservable.kt",
"chars": 2086,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.KeyEvent\ni"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLayoutChangeEventObservable.kt",
"chars": 2595,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.content.Context"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLayoutChangeObservable.kt",
"chars": 1590,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLongClickObservable.kt",
"chars": 2173,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewScrollChangeEventObservable.kt",
"chars": 1702,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport androidx.annotation.Req"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewSystemUiVisibilityChangeObservable.kt",
"chars": 1711,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTouchObservable.kt",
"chars": 2523,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MotionEven"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverDrawObservable.kt",
"chars": 1650,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport androidx.annotation.Req"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverGlobalLayoutObservable.kt",
"chars": 1818,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverPreDrawObservable.kt",
"chars": 1995,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewVisibilityConsumer.kt",
"chars": 968,
"preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport androidx.annotation.Che"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AbsListViewScrollEventObservable.kt",
"chars": 2486,
"preview": "@file:JvmName(\"RxAbsListView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterDataChangeObservable.kt",
"chars": 1597,
"preview": "@file:JvmName(\"RxAdapter\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.database.D"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemClickEventObservable.kt",
"chars": 1882,
"preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemClickObservable.kt",
"chars": 1566,
"preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemLongClickEventObservable.kt",
"chars": 2641,
"preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemLongClickObservable.kt",
"chars": 2212,
"preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemSelectionObservable.kt",
"chars": 2023,
"preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewSelectionEvent.kt",
"chars": 522,
"preview": "package com.jakewharton.rxbinding4.widget\n\nimport android.view.View\nimport android.widget.AdapterView\n\nsealed class Adap"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewSelectionObservable.kt",
"chars": 2459,
"preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AutoCompleteTextViewItemClickEventObservable.kt",
"chars": 1739,
"preview": "@file:JvmName(\"RxAutoCompleteTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport andro"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/CompoundButtonCheckedChangeObservable.kt",
"chars": 1888,
"preview": "@file:JvmName(\"RxCompoundButton\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.wid"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/PopupMenuDismissObservable.kt",
"chars": 1607,
"preview": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.P"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/PopupMenuItemClickObservable.kt",
"chars": 1715,
"preview": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.Men"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RadioGroupCheckedChangeObservable.kt",
"chars": 1746,
"preview": "@file:JvmName(\"RxRadioGroup\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget."
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RadioGroupToggleCheckedConsumer.kt",
"chars": 622,
"preview": "@file:JvmName(\"RxRadioGroup\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annota"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RatingBarRatingChangeEventObservable.kt",
"chars": 1957,
"preview": "@file:JvmName(\"RxRatingBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.R"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RatingBarRatingChangeObservable.kt",
"chars": 1643,
"preview": "@file:JvmName(\"RxRatingBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.R"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryConsumer.kt",
"chars": 631,
"preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annota"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryTextChangeEventsObservable.kt",
"chars": 2046,
"preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget."
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryTextChangesObservable.kt",
"chars": 1752,
"preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget."
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryTextEvent.kt",
"chars": 249,
"preview": "package com.jakewharton.rxbinding4.widget\n\nimport android.widget.SearchView\n\ndata class SearchViewQueryTextEvent(\n /** "
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SeekBarChangeEvent.kt",
"chars": 511,
"preview": "package com.jakewharton.rxbinding4.widget\n\nimport android.widget.SeekBar\n\nsealed class SeekBarChangeEvent {\n /** The vi"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SeekBarChangeEventObservable.kt",
"chars": 2077,
"preview": "@file:JvmName(\"RxSeekBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.See"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SeekBarChangeObservable.kt",
"chars": 2705,
"preview": "@file:JvmName(\"RxSeekBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.See"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewAfterTextChangeEventObservable.kt",
"chars": 2277,
"preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.content.C"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewBeforeTextChangeEventObservable.kt",
"chars": 2321,
"preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.content.C"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewEditorActionEventObservable.kt",
"chars": 2577,
"preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.KeyE"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewEditorActionObservable.kt",
"chars": 2168,
"preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.KeyE"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewTextChangeEventObservable.kt",
"chars": 2659,
"preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.content.C"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewTextChangesObservable.kt",
"chars": 2087,
"preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.text.Edit"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/ToolbarItemClickObservable.kt",
"chars": 1596,
"preview": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annotatio"
},
{
"path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/ToolbarNavigationClickObservable.kt",
"chars": 1752,
"preview": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annotatio"
},
{
"path": "rxbinding-appcompat/build.gradle",
"chars": 1089,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n api project(':rxbindi"
},
{
"path": "rxbinding-appcompat/gradle.properties",
"chars": 85,
"preview": "POM_ARTIFACT_ID=rxbinding-appcompat\nPOM_NAME=RxBinding (appcompat)\nPOM_PACKAGING=aar\n"
},
{
"path": "rxbinding-appcompat/src/androidTest/AndroidManifest.xml",
"chars": 566,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package"
},
{
"path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxActionMenuViewTest.java",
"chars": 1366,
"preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\n"
},
{
"path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxPopupMenuTest.java",
"chars": 2180,
"preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Instrumentation;\nimport android.view.Menu;\nimport andr"
},
{
"path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxPopupMenuTestActivity.java",
"chars": 479,
"preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.vie"
},
{
"path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxSearchViewTest.java",
"chars": 2976,
"preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport androidx.appcompat.widget.SearchView;\nimport androidx.test.annotat"
},
{
"path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxSearchViewTestActivity.java",
"chars": 421,
"preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\nimport androidx.a"
},
{
"path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxToolbarTest.java",
"chars": 2383,
"preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport androidx.a"
},
{
"path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxToolbarTestActivity.java",
"chars": 613,
"preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx.ap"
},
{
"path": "rxbinding-appcompat/src/main/AndroidManifest.xml",
"chars": 59,
"preview": "<manifest package=\"com.jakewharton.rxbinding4.appcompat\"/>\n"
},
{
"path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/ActionMenuViewItemClickObservable.kt",
"chars": 1601,
"preview": "@file:JvmName(\"RxActionMenuView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android."
},
{
"path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/PopupMenuDismissObservable.kt",
"chars": 1625,
"preview": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.anno"
},
{
"path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/PopupMenuItemClickObservable.kt",
"chars": 1720,
"preview": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android.view."
},
{
"path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewQueryTextChangeEventsObservable.kt",
"chars": 2014,
"preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.ann"
},
{
"path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewQueryTextChangesObservable.kt",
"chars": 1763,
"preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.ann"
},
{
"path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewQueryTextEvent.kt",
"chars": 263,
"preview": "package com.jakewharton.rxbinding4.appcompat\n\nimport androidx.appcompat.widget.SearchView\n\ndata class SearchViewQueryTex"
},
{
"path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewSetQueryConsumer.kt",
"chars": 645,
"preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.ann"
},
{
"path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/ToolbarItemClickObservable.kt",
"chars": 1532,
"preview": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android.view.Me"
},
{
"path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/ToolbarNavigationClickObservable.kt",
"chars": 1664,
"preview": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android.view.Vi"
},
{
"path": "rxbinding-core/build.gradle",
"chars": 1034,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n api project(':rxbindi"
},
{
"path": "rxbinding-core/gradle.properties",
"chars": 75,
"preview": "POM_ARTIFACT_ID=rxbinding-core\nPOM_NAME=RxBinding (core)\nPOM_PACKAGING=aar\n"
},
{
"path": "rxbinding-core/src/androidTest/AndroidManifest.xml",
"chars": 264,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package"
},
{
"path": "rxbinding-core/src/androidTest/java/com/jakewharton/rxbinding4/core/RxNestedScrollViewTest.java",
"chars": 1427,
"preview": "package com.jakewharton.rxbinding4.core;\n\nimport androidx.core.widget.NestedScrollView;\nimport androidx.test.annotation."
},
{
"path": "rxbinding-core/src/androidTest/java/com/jakewharton/rxbinding4/core/RxNestedScrollViewTestActivity.java",
"chars": 1004,
"preview": "package com.jakewharton.rxbinding4.core;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.Vie"
},
{
"path": "rxbinding-core/src/main/AndroidManifest.xml",
"chars": 54,
"preview": "<manifest package=\"com.jakewharton.rxbinding4.core\"/>\n"
},
{
"path": "rxbinding-core/src/main/java/com/jakewharton/rxbinding4/core/NestedScrollViewScrollChangeEventObservable.kt",
"chars": 1826,
"preview": "@file:JvmName(\"RxNestedScrollView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.core\n\nimport androidx.an"
},
{
"path": "rxbinding-drawerlayout/build.gradle",
"chars": 1103,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n api project(':rxbindi"
},
{
"path": "rxbinding-drawerlayout/gradle.properties",
"chars": 91,
"preview": "POM_ARTIFACT_ID=rxbinding-drawerlayout\nPOM_NAME=RxBinding (drawerlayout)\nPOM_PACKAGING=aar\n"
},
{
"path": "rxbinding-drawerlayout/src/androidTest/AndroidManifest.xml",
"chars": 268,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package"
},
{
"path": "rxbinding-drawerlayout/src/androidTest/java/com/jakewharton/rxbinding4/drawerlayout/RxDrawerLayoutTest.java",
"chars": 3016,
"preview": "package com.jakewharton.rxbinding4.drawerlayout;\n\nimport android.app.Instrumentation;\nimport androidx.drawerlayout.widge"
},
{
"path": "rxbinding-drawerlayout/src/androidTest/java/com/jakewharton/rxbinding4/drawerlayout/RxDrawerLayoutTestActivity.java",
"chars": 1107,
"preview": "package com.jakewharton.rxbinding4.drawerlayout;\n\nimport android.app.Activity;\nimport android.graphics.Color;\nimport and"
},
{
"path": "rxbinding-drawerlayout/src/main/AndroidManifest.xml",
"chars": 62,
"preview": "<manifest package=\"com.jakewharton.rxbinding4.drawerlayout\"/>\n"
},
{
"path": "rxbinding-drawerlayout/src/main/java/com/jakewharton/rxbinding4/drawerlayout/DrawerLayoutDrawerOpenedObservable.kt",
"chars": 2315,
"preview": "@file:JvmName(\"RxDrawerLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.drawerlayout\n\nimport android"
},
{
"path": "rxbinding-drawerlayout/src/main/java/com/jakewharton/rxbinding4/drawerlayout/DrawerLayoutOpenConsumer.kt",
"chars": 639,
"preview": "@file:JvmName(\"RxDrawerLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.drawerlayout\n\nimport android"
},
{
"path": "rxbinding-leanback/build.gradle",
"chars": 1065,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n api project(':rxbindi"
},
{
"path": "rxbinding-leanback/gradle.properties",
"chars": 83,
"preview": "POM_ARTIFACT_ID=rxbinding-leanback\nPOM_NAME=RxBinding (leanback)\nPOM_PACKAGING=aar\n"
},
{
"path": "rxbinding-leanback/src/androidTest/AndroidManifest.xml",
"chars": 513,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package"
},
{
"path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchBarTest.java",
"chars": 2526,
"preview": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.view.KeyEvent;\nimport androidx.leanback.widget.SearchBar;\ni"
},
{
"path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchBarTestActivity.java",
"chars": 893,
"preview": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx.lea"
},
{
"path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchEditTextTest.java",
"chars": 1180,
"preview": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.view.KeyEvent;\nimport androidx.leanback.widget.SearchEditTe"
},
{
"path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchEditTextTestActivity.java",
"chars": 446,
"preview": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx.lea"
},
{
"path": "rxbinding-leanback/src/main/AndroidManifest.xml",
"chars": 58,
"preview": "<manifest package=\"com.jakewharton.rxbinding4.leanback\"/>\n"
},
{
"path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchBarSearchQueryChangeEventsObservable.kt",
"chars": 1919,
"preview": "@file:JvmName(\"RxSearchBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.leanback\n\nimport androidx.annot"
},
{
"path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchBarSearchQueryChangesObservable.kt",
"chars": 1548,
"preview": "@file:JvmName(\"RxSearchBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.leanback\n\nimport androidx.annot"
},
{
"path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchBarSearchQueryEvent.kt",
"chars": 695,
"preview": "package com.jakewharton.rxbinding4.leanback\n\nimport androidx.leanback.widget.SearchBar\n\nsealed class SearchBarSearchQuer"
},
{
"path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchEditTextKeyboardDismissObservable.kt",
"chars": 1532,
"preview": "@file:JvmName(\"RxSearchEditText\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.leanback\n\nimport androidx."
},
{
"path": "rxbinding-material/build.gradle",
"chars": 1086,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n api project(':rxbindi"
},
{
"path": "rxbinding-material/gradle.properties",
"chars": 83,
"preview": "POM_ARTIFACT_ID=rxbinding-material\nPOM_NAME=RxBinding (material)\nPOM_PACKAGING=aar\n"
},
{
"path": "rxbinding-material/src/androidTest/AndroidManifest.xml",
"chars": 337,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package"
},
{
"path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxAppBarLayoutTest.java",
"chars": 1631,
"preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\ni"
},
{
"path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxBottomNavigationViewTest.java",
"chars": 1666,
"preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\ni"
},
{
"path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxChipTest.kt",
"chars": 982,
"preview": "package com.jakewharton.rxbinding4.material\n\nimport android.content.Context\nimport android.view.ContextThemeWrapper\nimpo"
},
{
"path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxFloatingActionButtonTest.java",
"chars": 1062,
"preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\ni"
},
{
"path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxNavigationViewTest.java",
"chars": 1713,
"preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\ni"
},
{
"path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSnackbarTest.java",
"chars": 1706,
"preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.app.Instrumentation;\nimport android.content.Context;\nimport"
},
{
"path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSwipeDismissBehaviorTest.java",
"chars": 1945,
"preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.view.View;\nimport androidx.coordinatorlayout.widget.Coordin"
},
{
"path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSwipeDismissBehaviorTestActivity.java",
"chars": 701,
"preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view"
},
{
"path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxTabLayoutTest.java",
"chars": 3594,
"preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\ni"
},
{
"path": "rxbinding-material/src/androidTest/res/menu/menu.xml",
"chars": 310,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <group>\n <"
},
{
"path": "rxbinding-material/src/androidTest/res/values/strings.xml",
"chars": 119,
"preview": "<resources>\n <string name=\"hint\">Your name here</string>\n <string name=\"error\">Your error here</string>\n</resources>\n"
},
{
"path": "rxbinding-material/src/main/AndroidManifest.xml",
"chars": 58,
"preview": "<manifest package=\"com.jakewharton.rxbinding4.material\"/>\n"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/AppBarLayoutOffsetChangeObservable.kt",
"chars": 1572,
"preview": "@file:JvmName(\"RxAppBarLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.an"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/BottomNavigationViewItemSelectionsObservable.kt",
"chars": 2071,
"preview": "@file:JvmName(\"RxBottomNavigationView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport and"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/ChipCloseIconClicksObservable.kt",
"chars": 1669,
"preview": "@file:JvmName(\"RxChip\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport android.view.View\ni"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/FloatingActionButtonVisibilityConsumer.kt",
"chars": 619,
"preview": "@file:JvmName(\"RxFloatingActionButton\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport and"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/NavigationViewItemSelectionsObservable.kt",
"chars": 2092,
"preview": "@file:JvmName(\"RxNavigationView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport android.v"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/SnackbarDismissesObservable.kt",
"chars": 1487,
"preview": "@file:JvmName(\"RxSnackbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annota"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/SwipeDismissBehaviorObservable.kt",
"chars": 1976,
"preview": "@file:JvmName(\"RxSwipeDismissBehavior\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport and"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectConsumer.kt",
"chars": 664,
"preview": "@file:JvmName(\"RxTabLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annot"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectionEvent.kt",
"chars": 694,
"preview": "package com.jakewharton.rxbinding4.material\n\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectionEventObservable.kt",
"chars": 2183,
"preview": "@file:JvmName(\"RxTabLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annot"
},
{
"path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectionsObservable.kt",
"chars": 1844,
"preview": "@file:JvmName(\"RxTabLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annot"
},
{
"path": "rxbinding-recyclerview/build.gradle",
"chars": 1042,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n api project(':rxbindi"
},
{
"path": "rxbinding-recyclerview/gradle.properties",
"chars": 91,
"preview": "POM_ARTIFACT_ID=rxbinding-recyclerview\nPOM_NAME=RxBinding (recyclerview)\nPOM_PACKAGING=aar\n"
},
{
"path": "rxbinding-recyclerview/src/androidTest/AndroidManifest.xml",
"chars": 274,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest package=\"com.jakewharton.rxbinding4.recyclerview\"\n xmlns:andr"
},
{
"path": "rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewAdapterTest.java",
"chars": 1323,
"preview": "package com.jakewharton.rxbinding4.recyclerview;\n\nimport android.view.ViewGroup;\nimport androidx.recyclerview.widget.Rec"
},
{
"path": "rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewTest.java",
"chars": 8663,
"preview": "package com.jakewharton.rxbinding4.recyclerview;\n\nimport android.app.Instrumentation;\nimport android.view.LayoutInflater"
},
{
"path": "rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewTestActivity.java",
"chars": 608,
"preview": "package com.jakewharton.rxbinding4.recyclerview;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx"
},
{
"path": "rxbinding-recyclerview/src/main/AndroidManifest.xml",
"chars": 62,
"preview": "<manifest package=\"com.jakewharton.rxbinding4.recyclerview\"/>\n"
},
{
"path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerAdapterDataChangeObservable.kt",
"chars": 1738,
"preview": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerViewAdapter\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport "
},
{
"path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewChildAttachStateChangeEventObservable.kt",
"chars": 2035,
"preview": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android"
},
{
"path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewChildAttachStateChangeEvents.kt",
"chars": 1321,
"preview": "package com.jakewharton.rxbinding4.recyclerview\n\nimport android.view.View\nimport androidx.recyclerview.widget.RecyclerVi"
},
{
"path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewFlingEventObservable.kt",
"chars": 1971,
"preview": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android"
},
{
"path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewScrollEventObservable.kt",
"chars": 1985,
"preview": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android"
},
{
"path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewScrollStateChangeObservable.kt",
"chars": 1562,
"preview": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android"
},
{
"path": "rxbinding-slidingpanelayout/build.gradle",
"chars": 1108,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n api project(':rxbindi"
},
{
"path": "rxbinding-slidingpanelayout/gradle.properties",
"chars": 101,
"preview": "POM_ARTIFACT_ID=rxbinding-slidingpanelayout\nPOM_NAME=RxBinding (slidingpanelayout)\nPOM_PACKAGING=aar\n"
},
{
"path": "rxbinding-slidingpanelayout/src/androidTest/AndroidManifest.xml",
"chars": 278,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package"
},
{
"path": "rxbinding-slidingpanelayout/src/androidTest/java/com/jakewharton/rxbinding4/slidingpanelayout/RxSlidingPaneLayoutTest.java",
"chars": 4988,
"preview": "package com.jakewharton.rxbinding4.slidingpanelayout;\n\nimport android.app.Instrumentation;\nimport android.view.View;\nimp"
},
{
"path": "rxbinding-slidingpanelayout/src/androidTest/java/com/jakewharton/rxbinding4/slidingpanelayout/RxSlidingPaneLayoutTestActivity.java",
"chars": 1180,
"preview": "package com.jakewharton.rxbinding4.slidingpanelayout;\n\nimport android.app.Activity;\nimport android.graphics.Color;\nimpor"
},
{
"path": "rxbinding-slidingpanelayout/src/main/AndroidManifest.xml",
"chars": 67,
"preview": "<manifest package=\"com.jakewharton.rxbinding4.slidingpanelayout\"/>\n"
},
{
"path": "rxbinding-slidingpanelayout/src/main/java/com/jakewharton/rxbinding4/slidingpanelayout/SlidingPaneLayoutOpenConsumer.kt",
"chars": 617,
"preview": "@file:JvmName(\"RxSlidingPaneLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.slidingpanelayout\n\nimpo"
},
{
"path": "rxbinding-slidingpanelayout/src/main/java/com/jakewharton/rxbinding4/slidingpanelayout/SlidingPaneLayoutPaneOpenedObservable.kt",
"chars": 1961,
"preview": "@file:JvmName(\"RxSlidingPaneLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.slidingpanelayout\n\nimpo"
},
{
"path": "rxbinding-slidingpanelayout/src/main/java/com/jakewharton/rxbinding4/slidingpanelayout/SlidingPaneLayoutSlideObservable.kt",
"chars": 1794,
"preview": "@file:JvmName(\"RxSlidingPaneLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.slidingpanelayout\n\nimpo"
},
{
"path": "rxbinding-swiperefreshlayout/build.gradle",
"chars": 1048,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n api project(':rxbindi"
}
]
// ... and 35 more files (download for full content)
About this extraction
This page contains the full source code of the JakeWharton/RxBinding GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 235 files (367.0 KB), approximately 96.2k tokens, and a symbol index with 336 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.