Showing preview only (5,317K chars total). Download the full file or copy to clipboard to get everything.
Repository: airbnb/epoxy
Branch: master
Commit: e45bd3a61fe3
Files: 936
Total size: 86.9 MB
Directory structure:
gitextract_6mir2ezo/
├── .github/
│ └── workflows/
│ └── build_test.yml
├── .gitignore
├── .idea/
│ └── codeStyleSettings.xml
├── CHANGELOG.md
├── CONTRIBUTING.MD
├── LICENSE
├── README.md
├── RELEASING.md
├── UpdateProcessorTestResources.kt
├── blessedDeps.gradle
├── build.gradle
├── epoxy-adapter/
│ ├── .gitignore
│ ├── build.gradle
│ ├── gradle.properties
│ ├── lint.xml
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── airbnb/
│ │ │ └── epoxy/
│ │ │ ├── ActivityRecyclerPool.kt
│ │ │ ├── AsyncEpoxyController.java
│ │ │ ├── AsyncEpoxyDiffer.java
│ │ │ ├── BaseEpoxyAdapter.java
│ │ │ ├── BaseEpoxyTouchCallback.java
│ │ │ ├── BoundViewHolders.java
│ │ │ ├── Carousel.java
│ │ │ ├── ControllerHelper.java
│ │ │ ├── ControllerHelperLookup.java
│ │ │ ├── ControllerModelList.java
│ │ │ ├── DebugTimer.java
│ │ │ ├── DiffHelper.java
│ │ │ ├── DiffPayload.java
│ │ │ ├── DiffResult.java
│ │ │ ├── EpoxyAdapter.java
│ │ │ ├── EpoxyAsyncUtil.java
│ │ │ ├── EpoxyController.java
│ │ │ ├── EpoxyControllerAdapter.java
│ │ │ ├── EpoxyDiffLogger.java
│ │ │ ├── EpoxyDragCallback.java
│ │ │ ├── EpoxyHolder.java
│ │ │ ├── EpoxyItemSpacingDecorator.java
│ │ │ ├── EpoxyModel.java
│ │ │ ├── EpoxyModelGroup.java
│ │ │ ├── EpoxyModelTouchCallback.java
│ │ │ ├── EpoxyModelWithHolder.java
│ │ │ ├── EpoxyModelWithView.java
│ │ │ ├── EpoxyRecyclerView.kt
│ │ │ ├── EpoxySwipeCallback.java
│ │ │ ├── EpoxyTouchHelper.java
│ │ │ ├── EpoxyTouchHelperCallback.kt
│ │ │ ├── EpoxyViewHolder.java
│ │ │ ├── EpoxyVisibilityItem.kt
│ │ │ ├── EpoxyVisibilityTracker.kt
│ │ │ ├── GeneratedModel.java
│ │ │ ├── GroupModel.kt
│ │ │ ├── HandlerExecutor.java
│ │ │ ├── HiddenEpoxyModel.java
│ │ │ ├── IdUtils.java
│ │ │ ├── IllegalEpoxyUsage.java
│ │ │ ├── ImmutableModelException.java
│ │ │ ├── InternalExposer.kt
│ │ │ ├── ListenersUtils.java
│ │ │ ├── MainThreadExecutor.java
│ │ │ ├── ModelCollector.kt
│ │ │ ├── ModelGroupHolder.kt
│ │ │ ├── ModelList.java
│ │ │ ├── ModelState.java
│ │ │ ├── NoOpControllerHelper.java
│ │ │ ├── NoOpTimer.java
│ │ │ ├── NotifyBlocker.java
│ │ │ ├── OnModelBoundListener.java
│ │ │ ├── OnModelBuildFinishedListener.java
│ │ │ ├── OnModelCheckedChangeListener.java
│ │ │ ├── OnModelClickListener.java
│ │ │ ├── OnModelLongClickListener.java
│ │ │ ├── OnModelUnboundListener.java
│ │ │ ├── OnModelVisibilityChangedListener.java
│ │ │ ├── OnModelVisibilityStateChangedListener.java
│ │ │ ├── QuantityStringResAttribute.java
│ │ │ ├── SimpleEpoxyAdapter.java
│ │ │ ├── SimpleEpoxyController.java
│ │ │ ├── SimpleEpoxyModel.java
│ │ │ ├── StringAttributeData.java
│ │ │ ├── StyleBuilderCallback.java
│ │ │ ├── Timer.java
│ │ │ ├── Typed2EpoxyController.java
│ │ │ ├── Typed3EpoxyController.java
│ │ │ ├── Typed4EpoxyController.java
│ │ │ ├── TypedEpoxyController.java
│ │ │ ├── UnboundedViewPool.kt
│ │ │ ├── UpdateOp.java
│ │ │ ├── UpdateOpHelper.java
│ │ │ ├── ViewHolderState.java
│ │ │ ├── ViewTypeManager.java
│ │ │ ├── VisibilityState.java
│ │ │ ├── WrappedEpoxyModelCheckedChangeListener.java
│ │ │ ├── WrappedEpoxyModelClickListener.kt
│ │ │ ├── preload/
│ │ │ │ ├── EpoxyModelPreloader.kt
│ │ │ │ ├── EpoxyPreloader.kt
│ │ │ │ ├── PreloadTargetProvider.kt
│ │ │ │ ├── Preloadable.kt
│ │ │ │ ├── PreloadableViewDataProvider.kt
│ │ │ │ └── PreloaderExtensions.kt
│ │ │ ├── stickyheader/
│ │ │ │ ├── StickyHeaderCallbacks.kt
│ │ │ │ └── StickyHeaderLinearLayoutManager.kt
│ │ │ └── utils/
│ │ │ └── utils.kt
│ │ └── res/
│ │ ├── layout/
│ │ │ └── view_holder_empty_view.xml
│ │ └── values/
│ │ ├── attrs.xml
│ │ └── ids.xml
│ └── test/
│ └── java/
│ └── com/
│ └── airbnb/
│ └── epoxy/
│ ├── DiffPayloadTest.java
│ ├── DifferCorrectnessTest.java
│ ├── DifferNotifyTest.java
│ ├── EpoxyAdapterTest.java
│ ├── EpoxyControllerTest.java
│ ├── EpoxyModelGroupTest.kt
│ ├── EpoxyRecyclerViewTest.kt
│ ├── EpoxyViewHolderTest.kt
│ ├── EpoxyVisibilityTrackerNestedTest.kt
│ ├── EpoxyVisibilityTrackerTest.kt
│ ├── InsertedModel.java
│ ├── ModelListTest.java
│ ├── ModelTestUtils.java
│ ├── TestAdapter.java
│ ├── TestModel.java
│ ├── TestObserver.java
│ ├── TypedEpoxyControllerTest.java
│ ├── UnboundedViewPoolTests.kt
│ ├── UpdateOpHelperTest.java
│ ├── ViewTypeManagerIntegrationTest.java
│ └── test/
│ └── CarouselTest.java
├── epoxy-annotations/
│ ├── .gitignore
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── airbnb/
│ └── epoxy/
│ ├── AfterPropsSet.java
│ ├── AutoModel.java
│ ├── CallbackProp.java
│ ├── EpoxyAttribute.java
│ ├── EpoxyBuildScope.kt
│ ├── EpoxyDataBindingLayouts.java
│ ├── EpoxyDataBindingPattern.java
│ ├── EpoxyModelClass.java
│ ├── ModelProp.java
│ ├── ModelView.java
│ ├── OnViewRecycled.java
│ ├── OnVisibilityChanged.java
│ ├── OnVisibilityStateChanged.java
│ ├── PackageEpoxyConfig.java
│ ├── PackageModelViewConfig.java
│ └── TextProp.java
├── epoxy-compose/
│ ├── .gitignore
│ ├── build.gradle
│ ├── consumer-rules.pro
│ ├── gradle.properties
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── airbnb/
│ └── epoxy/
│ └── ComposeInterop.kt
├── epoxy-composeinterop-maverickssample/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ └── composeinterop/
│ │ └── maverickssample/
│ │ └── MultiKeyComposeInteropFragmentTest.kt
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ └── composeinterop/
│ │ └── maverickssample/
│ │ ├── ComposeInteropListFragmnet.kt
│ │ ├── MainActivity.kt
│ │ ├── MultiKeyComposeInteropFragment.kt
│ │ ├── SampleApplication.kt
│ │ └── epoxyviews/
│ │ └── HeaderView.kt
│ └── res/
│ ├── drawable/
│ │ └── ic_launcher_background.xml
│ ├── drawable-v24/
│ │ └── ic_launcher_foreground.xml
│ ├── layout/
│ │ ├── activity_main.xml
│ │ ├── fragment_multi_key_compose_interop.xml
│ │ ├── fragment_my.xml
│ │ └── header_view.xml
│ ├── mipmap-anydpi-v26/
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ ├── values/
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── themes.xml
│ └── values-night/
│ └── themes.xml
├── epoxy-composesample/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ └── compose/
│ │ └── sample/
│ │ ├── ComposableInteropActivity.kt
│ │ ├── EpoxyInteropActivity.kt
│ │ ├── MainActivity.kt
│ │ ├── epoxyviews/
│ │ │ └── HeaderView.kt
│ │ └── ui/
│ │ └── theme/
│ │ ├── Color.kt
│ │ ├── Shape.kt
│ │ ├── Theme.kt
│ │ └── Type.kt
│ └── res/
│ ├── drawable/
│ │ └── ic_launcher_background.xml
│ ├── drawable-v24/
│ │ └── ic_launcher_foreground.xml
│ ├── layout/
│ │ ├── activity_composable_interop.xml
│ │ ├── activity_epoxy_interop.xml
│ │ ├── activity_main.xml
│ │ └── header_view.xml
│ ├── mipmap-anydpi-v26/
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ ├── values/
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── themes.xml
│ └── values-night/
│ └── themes.xml
├── epoxy-databinding/
│ ├── .gitignore
│ ├── build.gradle
│ ├── gradle.properties
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── airbnb/
│ └── epoxy/
│ └── DataBindingEpoxyModel.java
├── epoxy-glide-preloader/
│ ├── .gitignore
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ └── preloader/
│ │ └── ExampleInstrumentedTest.java
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── airbnb/
│ └── epoxy/
│ ├── GlidePreloadExtensions.kt
│ └── GlidePreloadRequestHolder.kt
├── epoxy-integrationtest/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── airbnb/
│ │ │ └── epoxy/
│ │ │ └── integrationtest/
│ │ │ ├── AdapterWithFieldAssigned.java
│ │ │ ├── AdapterWithIdChanged.java
│ │ │ ├── BasicAutoModelsAdapter.java
│ │ │ ├── ControllerWithAutoModel.java
│ │ │ ├── ControllerWithoutImplicityAdding.java
│ │ │ ├── EpoxyDataBindingConfig.java
│ │ │ ├── KotlinViewWithDefaultParams.kt
│ │ │ ├── Model.java
│ │ │ ├── ModelChangesDuringBind.java
│ │ │ ├── ModelGroupWithAnnotation.java
│ │ │ ├── ModelWithCheckedChangeListener.java
│ │ │ ├── ModelWithClickListener.java
│ │ │ ├── ModelWithConstructors.java
│ │ │ ├── ModelWithLongClickListener.java
│ │ │ ├── ModelWithNoGeneratedClass.java
│ │ │ ├── ModelsWithCustomTypes.java
│ │ │ ├── TestActivity.kt
│ │ │ ├── ViewWithAnnotationsForIntegrationTest.java
│ │ │ ├── ViewWithDelegate.kt
│ │ │ ├── ViewWithInterface.kt
│ │ │ └── autoaddautomodels/
│ │ │ ├── ControllerWithImplicitlyAddedModels.java
│ │ │ ├── ControllerWithImplicitlyAddedModels2.java
│ │ │ ├── ControllerWithImplicitlyAddedModels3.java
│ │ │ └── PackageConfig.java
│ │ └── res/
│ │ ├── layout/
│ │ │ ├── model_with_checked_change.xml
│ │ │ ├── model_with_click_listener.xml
│ │ │ ├── model_with_data_binding.xml
│ │ │ ├── vertical_linear_group.xml
│ │ │ ├── view_holder_databinding_test.xml
│ │ │ ├── view_holder_nested_databinding_test.xml
│ │ │ ├── view_holder_no_databinding.xml
│ │ │ └── view_with_annotations_for_integration_test.xml
│ │ └── values/
│ │ ├── plurals.xml
│ │ └── strings.xml
│ └── test/
│ └── java/
│ └── com/
│ └── airbnb/
│ └── epoxy/
│ ├── AutoModelIntegrationTest.java
│ ├── BindDiffTest.kt
│ ├── BindModelIntegrationTest.java
│ ├── ControllerLifecycleHelper.kt
│ ├── DataBindingModelIntegrationTest.java
│ ├── DiffPayloadTestUtil.java
│ ├── EpoxyAdapterIntegrationTest.java
│ ├── EpoxyModelGroupRecyclingTest.kt
│ ├── EpoxyModelIntegrationTest.java
│ ├── EpoxyModelValidationTest.java
│ ├── EpoxyViewBinderIntegrationTest.kt
│ ├── EpoxyViewBinderVisibilityTrackerTest.kt
│ ├── EpoxyVisibilityItemTest.kt
│ ├── EpoxyVisibilityTrackerModelGroupTest.kt
│ ├── KotlinDefaultParamTest.kt
│ ├── ModelBuilderExtensionIntegrationTest.kt
│ ├── ModelClickListenerTest.java
│ ├── ModelGroupIntegrationTest.kt
│ ├── ModelViewDelegateTest.kt
│ ├── ModelViewInterfaceTest.kt
│ ├── OnModelBindListenerTest.java
│ ├── ViewAnnotationsStringOverloadsIntegrationTest.java
│ ├── models/
│ │ ├── TrackerTestModel.kt
│ │ └── TrackerTestModelGroup.kt
│ └── utils/
│ └── VisibilityAssertHelper.kt
├── epoxy-kspsample/
│ ├── .gitignore
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ └── ksp/
│ │ └── sample/
│ │ ├── MainActivity.kt
│ │ └── epoxyviews/
│ │ ├── EpoxyConfig.kt
│ │ └── HeaderView.kt
│ └── res/
│ ├── layout/
│ │ ├── activity_main.xml
│ │ └── header_view.xml
│ └── values/
│ └── strings.xml
├── epoxy-modelfactory/
│ ├── .gitignore
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── airbnb/
│ └── epoxy/
│ └── ModelProperties.java
├── epoxy-modelfactorytest/
│ ├── .gitignore
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── airbnb/
│ │ │ └── epoxy/
│ │ │ ├── TestModelPropertiesKotlinView.kt
│ │ │ └── TestModelPropertiesView.java
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ ├── FromModelPropertiesKotlinTest.kt
│ │ ├── FromModelPropertiesTest.kt
│ │ ├── ModelFactoryViewProcessorTest.kt
│ │ ├── ParisConfig.kt
│ │ └── ProcessorTestUtils.kt
│ └── resources/
│ ├── AllTypesModelView.java
│ ├── AllTypesModelViewModel_.java
│ ├── BasicModelWithFinalAttribute.java
│ ├── BasicModelWithFinalAttribute_.java
│ ├── CallbackPropModelView.java
│ ├── CallbackPropModelViewModel_.java
│ ├── GroupPropMultipleSupportedAttributeDifferentNameModelView.java
│ ├── GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_.java
│ ├── GroupPropMultipleSupportedAttributeSameNameModelView.java
│ ├── GroupPropMultipleSupportedAttributeSameNameModelViewModel_.java
│ ├── GroupPropSingleSupportedAttributeModelView.java
│ ├── GroupPropSingleSupportedAttributeModelViewModel_.java
│ ├── ListSubtypeModelView.java
│ ├── ListSubtypeModelViewModel_.java
│ ├── ModelFactoryBaseModelView.java
│ ├── ModelFactoryBaseModelViewModel_.java
│ ├── ModelFactoryBasicModelWithAttribute.java
│ ├── ModelFactoryBasicModelWithAttribute_.java
│ ├── StyleableModelView.java
│ ├── StyleableModelViewModel_.java
│ ├── TextPropModelView.java
│ ├── TextPropModelViewModel_.java
│ ├── ksp/
│ │ ├── AllTypesModelViewModel_.java
│ │ ├── BasicModelWithFinalAttribute_.java
│ │ ├── CallbackPropModelViewModel_.java
│ │ ├── GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_.java
│ │ ├── GroupPropMultipleSupportedAttributeSameNameModelViewModel_.java
│ │ ├── GroupPropSingleSupportedAttributeModelViewModel_.java
│ │ ├── ListSubtypeModelViewModel_.java
│ │ ├── ModelFactoryBaseModelViewModel_.java
│ │ ├── ModelFactoryBasicModelWithAttribute_.java
│ │ └── TextPropModelViewModel_.java
│ └── test.json
├── epoxy-paging3/
│ ├── .gitignore
│ ├── build.gradle
│ ├── gradle.properties
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ └── paging3/
│ │ ├── Item.kt
│ │ ├── ListDataSource.kt
│ │ └── PagedListModelCacheTest.kt
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ └── paging3/
│ │ ├── PagedDataModelCache.kt
│ │ ├── PagedListEpoxyController.kt
│ │ ├── PagedListModelCache.kt
│ │ └── PagingDataEpoxyController.kt
│ └── test/
│ └── java/
│ └── com/
│ └── airbnb/
│ └── epoxy/
│ └── paging3/
│ ├── DummyItem.kt
│ ├── ListPagingSource.kt
│ └── PagedDataModelCacheTest.kt
├── epoxy-preloadersample/
│ ├── .gitignore
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ └── preloadersample/
│ │ ├── ImageModel.kt
│ │ ├── ImagesController.kt
│ │ ├── KotlinHolder.kt
│ │ ├── MainActivity.kt
│ │ ├── NoPreloadActivity.kt
│ │ └── PreloadActivity.kt
│ └── res/
│ ├── drawable/
│ │ └── ic_launcher_background.xml
│ ├── layout/
│ │ ├── activity_main.xml
│ │ ├── list_activity.xml
│ │ └── list_item.xml
│ └── values/
│ ├── colors.xml
│ ├── strings.xml
│ └── styles.xml
├── epoxy-processor/
│ ├── .gitignore
│ ├── build.gradle
│ ├── gradle.properties
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── airbnb/
│ │ │ └── epoxy/
│ │ │ └── processor/
│ │ │ ├── Asyncable.kt
│ │ │ ├── AttributeInfo.kt
│ │ │ ├── BaseModelAttributeInfo.kt
│ │ │ ├── BaseProcessor.kt
│ │ │ ├── BaseProcessorWithPackageConfigs.kt
│ │ │ ├── BasicGeneratedModelInfo.kt
│ │ │ ├── ClassNames.kt
│ │ │ ├── ConfigManager.kt
│ │ │ ├── ControllerClassInfo.kt
│ │ │ ├── ControllerModelField.kt
│ │ │ ├── ControllerProcessor.kt
│ │ │ ├── DataBindingAttributeInfo.kt
│ │ │ ├── DataBindingModelInfo.kt
│ │ │ ├── DataBindingModuleLookup.kt
│ │ │ ├── DataBindingProcessor.kt
│ │ │ ├── EpoxyProcessor.kt
│ │ │ ├── EpoxyProcessorException.kt
│ │ │ ├── Extensions.kt
│ │ │ ├── GeneratedModelInfo.kt
│ │ │ ├── GeneratedModelWriter.kt
│ │ │ ├── GroupedAttribute.kt
│ │ │ ├── HashCodeValidator.kt
│ │ │ ├── ImportScanner.java
│ │ │ ├── JavaPoetDsl.kt
│ │ │ ├── KClassNames.kt
│ │ │ ├── KotlinModelBuilderExtensionWriter.kt
│ │ │ ├── KotlinUtils.kt
│ │ │ ├── Logger.kt
│ │ │ ├── Memoizer.kt
│ │ │ ├── MethodInfo.kt
│ │ │ ├── ModelBuilderInterfaceWriter.kt
│ │ │ ├── ModelViewInfo.kt
│ │ │ ├── ModelViewProcessor.kt
│ │ │ ├── ModelViewWriter.kt
│ │ │ ├── MultiParamAttribute.kt
│ │ │ ├── PackageConfigSettings.kt
│ │ │ ├── PackageModelViewSettings.kt
│ │ │ ├── ParisStyleAttributeInfo.kt
│ │ │ ├── PoetExtensions.kt
│ │ │ ├── StringOverloadWriter.kt
│ │ │ ├── StyleWriter.kt
│ │ │ ├── Synchronization.kt
│ │ │ ├── Timer.kt
│ │ │ ├── Type.kt
│ │ │ ├── TypeNameWorkaround.kt
│ │ │ ├── Utils.kt
│ │ │ ├── ViewAttributeInfo.kt
│ │ │ ├── XProcessingUtils.kt
│ │ │ └── resourcescanning/
│ │ │ ├── JavacResourceScanner.kt
│ │ │ ├── KspResourceScanner.kt
│ │ │ ├── ResourceScanner.kt
│ │ │ └── ResourceValue.kt
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ ├── com.google.devtools.ksp.processing.SymbolProcessorProvider
│ │ └── javax.annotation.processing.Processor
│ └── test/
│ └── java/
│ └── com/
│ └── airbnb/
│ └── epoxy/
│ ├── KspResourceScannerTest.kt
│ ├── PoetExtensionsTest.kt
│ └── UtilsTests.kt
├── epoxy-processortest/
│ ├── .gitignore
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── airbnb/
│ │ │ └── integrationtest/
│ │ │ └── processortest/
│ │ │ ├── ProcessorTestModel.java
│ │ │ └── differentpackage/
│ │ │ └── Model.java
│ │ └── res/
│ │ ├── layout/
│ │ │ └── model_with_data_binding_without_donothash.xml
│ │ └── values/
│ │ └── strings.xml
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ ├── ConfigTest.kt
│ │ ├── ControllerProcessorTest.kt
│ │ ├── DataBindingModelTest.kt
│ │ ├── EpoxyResourceProcessorTest.kt
│ │ ├── GuavaPatch.kt
│ │ ├── ModelProcessorTest.kt
│ │ ├── ProcessorTestUtils.kt
│ │ ├── ViewProcessorTest.kt
│ │ └── testpackage/
│ │ └── DifferentPackageTest.java
│ └── resources/
│ ├── AbstractEpoxyModelWithView.java
│ ├── AbstractEpoxyModelWithView_.java
│ ├── AbstractModelWithHolder.java
│ ├── AbstractModelWithHolder_.java
│ ├── AutoLayoutModelView.java
│ ├── AutoLayoutModelViewManualLayoutParams.java
│ ├── AutoLayoutModelViewManualLayoutParamsModel_.java
│ ├── AutoLayoutModelViewMatchParent.java
│ ├── AutoLayoutModelViewMatchParentModel_.java
│ ├── AutoLayoutModelViewModel_.java
│ ├── AutoModelNotInAutoAdapter.java
│ ├── AutoModelNotOnModelField.java
│ ├── BaseModelView.java
│ ├── BaseModelViewModel_.java
│ ├── BasicModelWithAttribute.java
│ ├── BasicModelWithAttribute_.java
│ ├── ControllerProcessorTest/
│ │ └── controllerWithAutoModel/
│ │ ├── BasicModelWithAttribute.kt
│ │ ├── ControllerWithAutoModel.kt
│ │ ├── ControllerWithAutoModel_EpoxyHelper.java
│ │ └── ksp/
│ │ └── ControllerWithAutoModel_EpoxyHelper.java
│ ├── ControllerWithAutoModel.java
│ ├── ControllerWithAutoModelAndImplicitAdding.java
│ ├── ControllerWithAutoModelAndImplicitAdding_EpoxyHelper.java
│ ├── ControllerWithAutoModelWithSuperClass$SubControllerWithAutoModelWithSuperClass_EpoxyHelper.java
│ ├── ControllerWithAutoModelWithSuperClass.java
│ ├── ControllerWithAutoModelWithSuperClass_EpoxyHelper.java
│ ├── ControllerWithAutoModelWithoutValidation.java
│ ├── ControllerWithAutoModelWithoutValidation_EpoxyHelper.java
│ ├── ControllerWithAutoModel_EpoxyHelper.java
│ ├── CustomPackageLayoutPatternViewModel_.java
│ ├── DataBindingConfig.java
│ ├── DataBindingModelWithAllFieldTypes.java
│ ├── DataBindingModelWithAllFieldTypesNoValidation.java
│ ├── DataBindingModelWithAllFieldTypesNoValidation_.java
│ ├── DataBindingModelWithAllFieldTypes_.java
│ ├── DefaultPackageLayoutPatternViewModel_.java
│ ├── DoNotHashView.java
│ ├── DoNotHashViewModel_.java
│ ├── EpoxyModelGroupWithAnnotations.java
│ ├── EpoxyModelGroupWithAnnotations_.java
│ ├── GenerateDefaultLayoutMethod.java
│ ├── GenerateDefaultLayoutMethodNextParentLayout$NoLayout_.java
│ ├── GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_.java
│ ├── GenerateDefaultLayoutMethodNextParentLayout$WithLayout_.java
│ ├── GenerateDefaultLayoutMethodNextParentLayout.java
│ ├── GenerateDefaultLayoutMethodNoLayout.java
│ ├── GenerateDefaultLayoutMethodParentLayout$NoLayout_.java
│ ├── GenerateDefaultLayoutMethodParentLayout$WithLayout_.java
│ ├── GenerateDefaultLayoutMethodParentLayout.java
│ ├── GenerateDefaultLayoutMethodParentStillNoLayout.java
│ ├── GenerateDefaultLayoutMethod_.java
│ ├── GeneratedModelSuffixViewSuffix_.java
│ ├── GridSpanCountView.java
│ ├── GridSpanCountViewModel_.java
│ ├── IgnoreRequireHashCodeView.java
│ ├── IgnoreRequireHashCodeViewModel_.java
│ ├── LayoutOverloadsViewModel_.java
│ ├── ModelAsInnerClass.java
│ ├── ModelConfigRequireHashCodeAllowsMarkedAttributes.java
│ ├── ModelConfigRequireHashCodeCharSequencePasses.java
│ ├── ModelConfigRequireHashCodeInterfaceWithHashCodePasses.java
│ ├── ModelConfigSubPackageOverridesParent.java
│ ├── ModelDoNotHash.java
│ ├── ModelDoNotHash_.java
│ ├── ModelDoNotUseInToString.java
│ ├── ModelDoNotUseInToString_.java
│ ├── ModelForRProcessingTest.java
│ ├── ModelForRProcessingTest_.java
│ ├── ModelForTestingDuplicateRValues.java
│ ├── ModelForTestingDuplicateRValues_.java
│ ├── ModelNoValidation.java
│ ├── ModelNoValidation_.java
│ ├── ModelPackageWithNoConfigInheritsNearestParentConfig.java
│ ├── ModelProcessorTest/
│ │ └── testKotlinModel/
│ │ ├── Model.kt
│ │ ├── Model_.java
│ │ └── ksp/
│ │ └── Model_.java
│ ├── ModelRequiresEqualsFailsBasicObject.java
│ ├── ModelRequiresHashCodeArrayFails.java
│ ├── ModelRequiresHashCodeArraySucceeds.java
│ ├── ModelRequiresHashCodeAutoValueClassPasses.java
│ ├── ModelRequiresHashCodeEnumPasses.java
│ ├── ModelRequiresHashCodeFailsBasicObject.java
│ ├── ModelRequiresHashCodeIterableFails.java
│ ├── ModelRequiresHashCodeIterableSucceeds.java
│ ├── ModelReturningClassType.java
│ ├── ModelReturningClassTypeWithVarargs.java
│ ├── ModelReturningClassTypeWithVarargs_.java
│ ├── ModelReturningClassType_.java
│ ├── ModelViewExtendingSuperClass.java
│ ├── ModelViewExtendingSuperClassModel_.java
│ ├── ModelViewSuperClass.java
│ ├── ModelViewSuperClassModel_.java
│ ├── ModelViewWithParis.java
│ ├── ModelViewWithParisModel_.java
│ ├── ModelWithAbstractClass.java
│ ├── ModelWithAbstractClassAndAnnotation.java
│ ├── ModelWithAbstractClassAndAnnotation_.java
│ ├── ModelWithAllFieldTypes.java
│ ├── ModelWithAllFieldTypesBuilder.java
│ ├── ModelWithAllFieldTypes_.java
│ ├── ModelWithAllPrivateFieldTypes.java
│ ├── ModelWithAllPrivateFieldTypes_.java
│ ├── ModelWithAnnotatedClass.java
│ ├── ModelWithAnnotatedClassAndSuperAttributes$SubModelWithAnnotatedClassAndSuperAttributes_.java
│ ├── ModelWithAnnotatedClassAndSuperAttributes.java
│ ├── ModelWithAnnotatedClassAndSuperAttributes_.java
│ ├── ModelWithAnnotatedClass_.java
│ ├── ModelWithAnnotation.java
│ ├── ModelWithAnnotation_.java
│ ├── ModelWithCheckedChangeListener.java
│ ├── ModelWithCheckedChangeListener_.java
│ ├── ModelWithConstructors.java
│ ├── ModelWithConstructors_.java
│ ├── ModelWithDataBindingBinding.java
│ ├── ModelWithDataBindingBindingModel_.java
│ ├── ModelWithDataBindingWithoutDonothashBinding.java
│ ├── ModelWithDataBindingWithoutDonothashBindingModel_.java
│ ├── ModelWithFieldAnnotation.java
│ ├── ModelWithFieldAnnotation_.java
│ ├── ModelWithFinalClass.java
│ ├── ModelWithFinalField.java
│ ├── ModelWithFinalField_.java
│ ├── ModelWithIntDef.java
│ ├── ModelWithIntDef_.java
│ ├── ModelWithPrivateFieldWithGetterWithParams.java
│ ├── ModelWithPrivateFieldWithIsPrefixGetter.java
│ ├── ModelWithPrivateFieldWithPrivateGetter.java
│ ├── ModelWithPrivateFieldWithPrivateSetter.java
│ ├── ModelWithPrivateFieldWithSameAsFieldGetterAndSetterName.java
│ ├── ModelWithPrivateFieldWithSameAsFieldGetterAndSetterName_.java
│ ├── ModelWithPrivateFieldWithSettterWithoutParams.java
│ ├── ModelWithPrivateFieldWithStaticGetter.java
│ ├── ModelWithPrivateFieldWithStaticSetter.java
│ ├── ModelWithPrivateFieldWithoutGetter.java
│ ├── ModelWithPrivateFieldWithoutGetterAndSetter.java
│ ├── ModelWithPrivateFieldWithoutSetter.java
│ ├── ModelWithPrivateInnerClass.java
│ ├── ModelWithPrivateViewClickListener.java
│ ├── ModelWithPrivateViewClickListener_.java
│ ├── ModelWithStaticField.java
│ ├── ModelWithSuper.java
│ ├── ModelWithSuperAttributes$SubModelWithSuperAttributes_.java
│ ├── ModelWithSuperAttributes.java
│ ├── ModelWithSuperAttributes_.java
│ ├── ModelWithSuper_.java
│ ├── ModelWithType.java
│ ├── ModelWithType_.java
│ ├── ModelWithVarargsConstructors.java
│ ├── ModelWithVarargsConstructors_.java
│ ├── ModelWithViewClickListener.java
│ ├── ModelWithViewClickListener_.java
│ ├── ModelWithViewLongClickListener.java
│ ├── ModelWithViewLongClickListener_.java
│ ├── ModelWithoutEpoxyExtension.java
│ ├── ModelWithoutHash.java
│ ├── ModelWithoutHash_.java
│ ├── ModelWithoutSetter.java
│ ├── ModelWithoutSetter_.java
│ ├── NullOnRecycleView.java
│ ├── NullOnRecycleViewModel_.java
│ ├── NullOnRecycleView_throwsIfNotNullable.java
│ ├── ObjectWithoutEqualsThrowsView.java
│ ├── OnViewRecycledView.java
│ ├── OnViewRecycledViewModel_.java
│ ├── OnViewRecycledView_throwsIfHasParams.java
│ ├── OnViewRecycledView_throwsIfPrivate.java
│ ├── OnViewRecycledView_throwsIfStatic.java
│ ├── OnVisibilityChangedView.java
│ ├── OnVisibilityChangedViewModel_.java
│ ├── OnVisibilityChangedView_throwsIfInvalidParams.java
│ ├── OnVisibilityChangedView_throwsIfNoParams.java
│ ├── OnVisibilityChangedView_throwsIfPrivate.java
│ ├── OnVisibilityChangedView_throwsIfStatic.java
│ ├── OnVisibilityStateChangedView.java
│ ├── OnVisibilityStateChangedViewModel_.java
│ ├── OnVisibilityStateChangedView_throwsIfInvalidParams.java
│ ├── OnVisibilityStateChangedView_throwsIfNoParams.java
│ ├── OnVisibilityStateChangedView_throwsIfPrivate.java
│ ├── OnVisibilityStateChangedView_throwsIfStatic.java
│ ├── PropDefaultsView.java
│ ├── PropDefaultsViewModel_.java
│ ├── PropDefaultsView_throwsForNonFinalValue.java
│ ├── PropDefaultsView_throwsForNonStaticValue.java
│ ├── PropDefaultsView_throwsForNotFound.java
│ ├── PropDefaultsView_throwsForPrivateValue.java
│ ├── PropDefaultsView_throwsForWrongType.java
│ ├── PropGroupsView.java
│ ├── PropGroupsViewModel_.java
│ ├── Prop_throwsIfMultipleParams.java
│ ├── Prop_throwsIfNoParams.java
│ ├── Prop_throwsIfPrivate.java
│ ├── Prop_throwsIfStatic.java
│ ├── RLayoutInViewModelAnnotationWorksViewModel_.java
│ ├── RequireAbstractModelFailsClassWithAttribute.java
│ ├── RequireAbstractModelFailsEpoxyModelClass.java
│ ├── RequireAbstractModelPassesClassWithAttribute.java
│ ├── RequireAbstractModelPassesEpoxyModelClass.java
│ ├── SavedStateView.java
│ ├── SavedStateViewModel_.java
│ ├── StringOverloads_throwsIfNotCharSequence.java
│ ├── TestAfterBindPropsSuperView.java
│ ├── TestAfterBindPropsView.java
│ ├── TestAfterBindPropsViewModel_.java
│ ├── TestCallbackPropMustBeNullableView.java
│ ├── TestCallbackPropView.java
│ ├── TestCallbackPropViewModel_.java
│ ├── TestFieldPropCallbackPropView.java
│ ├── TestFieldPropCallbackPropViewModel_.java
│ ├── TestFieldPropChildView.java
│ ├── TestFieldPropChildViewModel_.java
│ ├── TestFieldPropDoNotHashOptionView.java
│ ├── TestFieldPropDoNotHashOptionViewModel_.java
│ ├── TestFieldPropGenerateStringOverloadsOptionView.java
│ ├── TestFieldPropGenerateStringOverloadsOptionViewModel_.java
│ ├── TestFieldPropIgnoreRequireHashCodeOptionView.java
│ ├── TestFieldPropIgnoreRequireHashCodeOptionViewModel_.java
│ ├── TestFieldPropModelPropView.java
│ ├── TestFieldPropModelPropViewModel_.java
│ ├── TestFieldPropNullOnRecycleOptionView.java
│ ├── TestFieldPropNullOnRecycleOptionViewModel_.java
│ ├── TestFieldPropParentView.java
│ ├── TestFieldPropStringOverloadsIfNotCharSequenceView.java
│ ├── TestFieldPropTextPropView.java
│ ├── TestFieldPropTextPropViewModel_.java
│ ├── TestFieldPropThrowsIfPrivateView.java
│ ├── TestFieldPropThrowsIfStaticView.java
│ ├── TestManyTypesView.java
│ ├── TestManyTypesViewModelBuilder.java
│ ├── TestManyTypesViewModel_.java
│ ├── TestNullStringOverloadsView.java
│ ├── TestNullStringOverloadsViewModel_.java
│ ├── TestStringOverloadsView.java
│ ├── TestStringOverloadsViewModel_.java
│ ├── TestTextPropIfNotCharSequenceView.java
│ ├── TestTextPropMustBeCharSequenceView.java
│ ├── TestTextPropView.java
│ ├── TestTextPropViewModel_.java
│ ├── TextPropDefaultView.java
│ ├── TextPropDefaultViewModel_.java
│ ├── TextPropDefaultView_throwsForNonStringRes.java
│ ├── ViewProcessorTest/
│ │ ├── annotationsAreCopied/
│ │ │ ├── SourceView.kt
│ │ │ ├── SourceViewModelBuilder.java
│ │ │ ├── SourceViewModel_.java
│ │ │ └── ksp/
│ │ │ ├── SourceViewModelBuilder.java
│ │ │ └── SourceViewModel_.java
│ │ ├── annotationsAreCopied_java/
│ │ │ ├── SourceView.java
│ │ │ ├── SourceViewModelBuilder.java
│ │ │ ├── SourceViewModel_.java
│ │ │ └── ksp/
│ │ │ ├── SourceViewModelBuilder.java
│ │ │ └── SourceViewModel_.java
│ │ ├── inheritingAttributesWorksCorrectly/
│ │ │ ├── SourceView.kt
│ │ │ ├── SourceViewModelBuilder.java
│ │ │ ├── SourceViewModel_.java
│ │ │ └── ksp/
│ │ │ ├── SourceViewModelBuilder.java
│ │ │ └── SourceViewModel_.java
│ │ ├── inheritingAttributesWorksCorrectlyJavaClassPath/
│ │ │ ├── SourceView.kt
│ │ │ ├── SourceViewModelBuilder.java
│ │ │ ├── SourceViewModel_.java
│ │ │ └── ksp/
│ │ │ ├── SourceViewModelBuilder.java
│ │ │ └── SourceViewModel_.java
│ │ ├── inheritingAttributesWorksCorrectlyJavaSources/
│ │ │ ├── AirEpoxyModel.java
│ │ │ ├── SourceView.kt
│ │ │ ├── SourceViewModelBuilder.java
│ │ │ ├── SourceViewModel_.java
│ │ │ └── ksp/
│ │ │ ├── SourceViewModelBuilder.java
│ │ │ └── SourceViewModel_.java
│ │ ├── testManyTypes/
│ │ │ ├── EpoxyModelViewProcessorKotlinExtensions.kt
│ │ │ ├── TestManyTypesView.kt
│ │ │ ├── TestManyTypesViewModelBuilder.java
│ │ │ ├── TestManyTypesViewModel_.java
│ │ │ └── ksp/
│ │ │ ├── EpoxyModelViewProcessorKotlinExtensions.kt
│ │ │ ├── TestManyTypesViewModelBuilder.java
│ │ │ └── TestManyTypesViewModel_.java
│ │ ├── testStyleableViewKotlinSources/
│ │ │ ├── ModelViewWithParis.kt
│ │ │ ├── ModelViewWithParisModel_.java
│ │ │ └── ksp/
│ │ │ └── ModelViewWithParisModel_.java
│ │ └── wildcardHandling/
│ │ ├── AirEpoxyModel.java
│ │ ├── SourceView.kt
│ │ ├── SourceViewModelBuilder.java
│ │ ├── SourceViewModel_.java
│ │ └── ksp/
│ │ ├── SourceViewModelBuilder.java
│ │ └── SourceViewModel_.java
│ ├── baseModelFromPackageConfig/
│ │ ├── BaseModelViewModel_.java
│ │ └── ksp/
│ │ ├── BaseModelViewModel_.java
│ │ └── actual/
│ │ └── BaseModelViewModel_.java
│ ├── baseModelFromPackageConfigIsOverriddenByViewSetting/
│ │ ├── BaseModelViewModel_.java
│ │ └── ksp/
│ │ ├── BaseModelViewModel_.java
│ │ └── actual/
│ │ └── BaseModelViewModel_.java
│ ├── baseModelWithAttribute/
│ │ ├── BaseModelViewModel_.java
│ │ └── ksp/
│ │ ├── BaseModelViewModel_.java
│ │ └── actual/
│ │ └── BaseModelViewModel_.java
│ ├── baseModelWithDiffBind/
│ │ ├── BaseModelViewModel_.java
│ │ └── ksp/
│ │ ├── BaseModelViewModel_.java
│ │ └── actual/
│ │ └── BaseModelViewModel_.java
│ ├── ksp/
│ │ ├── AbstractEpoxyModelWithView_.java
│ │ ├── AutoLayoutModelViewManualLayoutParamsModel_.java
│ │ ├── AutoLayoutModelViewMatchParentModel_.java
│ │ ├── AutoLayoutModelViewModel_.java
│ │ ├── BaseModelViewModel_.java
│ │ ├── BasicModelWithAttribute_.java
│ │ ├── ControllerWithAutoModelWithSuperClass$SubControllerWithAutoModelWithSuperClass_EpoxyHelper.java
│ │ ├── ControllerWithAutoModelWithSuperClass_EpoxyHelper.java
│ │ ├── ControllerWithAutoModel_EpoxyHelper.java
│ │ ├── CustomPackageLayoutPatternViewModel_.java
│ │ ├── DataBindingModelWithAllFieldTypes_.java
│ │ ├── DefaultPackageLayoutPatternViewModel_.java
│ │ ├── DoNotHashViewModel_.java
│ │ ├── EpoxyModelGroupWithAnnotations_.java
│ │ ├── GenerateDefaultLayoutMethodNextParentLayout$NoLayout_.java
│ │ ├── GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_.java
│ │ ├── GenerateDefaultLayoutMethodNextParentLayout$WithLayout_.java
│ │ ├── GenerateDefaultLayoutMethodParentLayout$NoLayout_.java
│ │ ├── GenerateDefaultLayoutMethodParentLayout$WithLayout_.java
│ │ ├── GenerateDefaultLayoutMethod_.java
│ │ ├── GeneratedModelSuffixViewSuffix_.java
│ │ ├── GridSpanCountViewModel_.java
│ │ ├── IgnoreRequireHashCodeViewModel_.java
│ │ ├── LayoutOverloadsViewModel_.java
│ │ ├── ModelDoNotHash_.java
│ │ ├── ModelDoNotUseInToString_.java
│ │ ├── ModelForRProcessingTest_.java
│ │ ├── ModelReturningClassTypeWithVarargs_.java
│ │ ├── ModelReturningClassType_.java
│ │ ├── ModelViewExtendingSuperClassModel_.java
│ │ ├── ModelViewSuperClassModel_.java
│ │ ├── ModelViewWithParisModel_.java
│ │ ├── ModelWithAbstractClassAndAnnotation_.java
│ │ ├── ModelWithAllFieldTypesBuilder.java
│ │ ├── ModelWithAllFieldTypes_.java
│ │ ├── ModelWithAllPrivateFieldTypes_.java
│ │ ├── ModelWithAnnotatedClass_.java
│ │ ├── ModelWithAnnotation_.java
│ │ ├── ModelWithCheckedChangeListener_.java
│ │ ├── ModelWithConstructors_.java
│ │ ├── ModelWithFieldAnnotation_.java
│ │ ├── ModelWithFinalField_.java
│ │ ├── ModelWithPrivateFieldWithSameAsFieldGetterAndSetterName_.java
│ │ ├── ModelWithPrivateViewClickListener_.java
│ │ ├── ModelWithSuperAttributes$SubModelWithSuperAttributes_.java
│ │ ├── ModelWithSuperAttributes_.java
│ │ ├── ModelWithSuper_.java
│ │ ├── ModelWithViewClickListener_.java
│ │ ├── ModelWithViewLongClickListener_.java
│ │ ├── ModelWithoutHash_.java
│ │ ├── ModelWithoutSetter_.java
│ │ ├── NullOnRecycleViewModel_.java
│ │ ├── OnViewRecycledViewModel_.java
│ │ ├── OnVisibilityChangedViewModel_.java
│ │ ├── OnVisibilityStateChangedViewModel_.java
│ │ ├── PropDefaultsViewModel_.java
│ │ ├── PropGroupsViewModel_.java
│ │ ├── RLayoutInViewModelAnnotationWorksViewModel_.java
│ │ ├── SavedStateViewModel_.java
│ │ ├── TestAfterBindPropsViewModel_.java
│ │ ├── TestCallbackPropViewModel_.java
│ │ ├── TestFieldPropCallbackPropViewModel_.java
│ │ ├── TestFieldPropChildViewModel_.java
│ │ ├── TestFieldPropDoNotHashOptionViewModel_.java
│ │ ├── TestFieldPropGenerateStringOverloadsOptionViewModel_.java
│ │ ├── TestFieldPropIgnoreRequireHashCodeOptionViewModel_.java
│ │ ├── TestFieldPropModelPropViewModel_.java
│ │ ├── TestFieldPropNullOnRecycleOptionViewModel_.java
│ │ ├── TestFieldPropTextPropViewModel_.java
│ │ ├── TestManyTypesViewModelBuilder.java
│ │ ├── TestManyTypesViewModel_.java
│ │ ├── TestNullStringOverloadsViewModel_.java
│ │ ├── TestStringOverloadsViewModel_.java
│ │ ├── TestTextPropViewModel_.java
│ │ └── TextPropDefaultViewModel_.java
│ └── testModelWithHolderGeneratesNewHolderMethod/
│ ├── AbstractModelWithHolder.kt
│ ├── AbstractModelWithHolder_.java
│ └── ksp/
│ └── AbstractModelWithHolder_.java
├── epoxy-processortest2/
│ ├── .gitignore
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ └── processortest2/
│ │ └── ProcessorTest2Model.java
│ └── res/
│ └── values/
│ └── strings.xml
├── epoxy-sample/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── assets/
│ │ ├── exploding_heart.json
│ │ └── favourite_app_icon.json
│ ├── java/
│ │ └── com/
│ │ └── airbnb/
│ │ └── epoxy/
│ │ └── sample/
│ │ ├── CarouselData.java
│ │ ├── ColorData.java
│ │ ├── EpoxyConfig.java
│ │ ├── MainActivity.java
│ │ ├── SampleController.kt
│ │ ├── models/
│ │ │ ├── BaseEpoxyHolder.kt
│ │ │ ├── BaseView.java
│ │ │ ├── CarouselModelGroup.java
│ │ │ ├── ColorModel.kt
│ │ │ ├── ImageButtonModel.kt
│ │ │ ├── SimpleAnimatorListener.java
│ │ │ ├── TestModel1.kt
│ │ │ ├── TestModel2.kt
│ │ │ ├── TestModel3.kt
│ │ │ ├── TestModel4.kt
│ │ │ ├── TestModel5.kt
│ │ │ ├── TestModel6.kt
│ │ │ └── TestModel7.kt
│ │ └── views/
│ │ ├── GridCarousel.java
│ │ └── HeaderView.java
│ └── res/
│ ├── drawable/
│ │ ├── ic_add_circle.xml
│ │ ├── ic_change.xml
│ │ ├── ic_delete.xml
│ │ └── ic_shuffle.xml
│ ├── layout/
│ │ ├── activity_main.xml
│ │ ├── button.xml
│ │ ├── model_carousel_group.xml
│ │ ├── model_color.xml
│ │ ├── model_image_button.xml
│ │ ├── number_view.xml
│ │ └── view_header.xml
│ ├── values/
│ │ ├── dimens.xml
│ │ └── strings.xml
│ └── values-w820dp/
│ └── dimens.xml
├── epoxy-viewbinder/
│ ├── .gitignore
│ ├── build.gradle
│ ├── gradle.properties
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── airbnb/
│ │ │ └── epoxy/
│ │ │ ├── EpoxyViewBinder.kt
│ │ │ ├── EpoxyViewBinderExtensions.kt
│ │ │ ├── EpoxyViewBinderVisibilityTracker.kt
│ │ │ ├── EpoxyViewStub.kt
│ │ │ └── ViewExtensions.kt
│ │ └── res/
│ │ └── values/
│ │ └── ids.xml
│ └── test/
│ └── java/
│ └── com/
│ └── example/
│ └── epoxy_viewbinder/
│ └── EpoxyViewBinderTest.kt
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── kotlinsample/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── airbnb/
│ │ │ └── epoxy/
│ │ │ └── kotlinsample/
│ │ │ ├── DragAndDropActivity.kt
│ │ │ ├── EpoxyDataBindingPatterns.kt
│ │ │ ├── MainActivity.kt
│ │ │ ├── StickyHeaderActivity.kt
│ │ │ ├── StickyHeaderAdapter.kt
│ │ │ ├── StickyHeaderController.kt
│ │ │ ├── helpers/
│ │ │ │ ├── EpoxyCarouselNoSnapBuilder.kt
│ │ │ │ ├── KotlinEpoxyHolder.kt
│ │ │ │ ├── KotlinModel.kt
│ │ │ │ ├── ViewBindingEpoxyModelWithHolder.kt
│ │ │ │ └── ViewBindingKotlinModel.kt
│ │ │ ├── models/
│ │ │ │ ├── CarouselItemCustomView.kt
│ │ │ │ ├── ColoredSquareView.kt
│ │ │ │ ├── DecoratedLinearGroupModel.kt
│ │ │ │ ├── ItemCustomView.kt
│ │ │ │ ├── ItemDataClass.kt
│ │ │ │ ├── ItemEpoxyHolder.kt
│ │ │ │ ├── ItemViewBindingDataClass.kt
│ │ │ │ ├── ItemViewBindingEpoxyHolder.kt
│ │ │ │ ├── ManualLayoutParamsView.kt
│ │ │ │ ├── OnVisibilityEventDrawable.kt
│ │ │ │ └── StickyItemEpoxyHolder.kt
│ │ │ └── views/
│ │ │ └── CarouselNoSnap.kt
│ │ └── res/
│ │ ├── drawable/
│ │ │ └── ic_launcher_background.xml
│ │ ├── drawable-v24/
│ │ │ └── ic_launcher_foreground.xml
│ │ ├── layout/
│ │ │ ├── activity.xml
│ │ │ ├── carousel_custom_view_item.xml
│ │ │ ├── colored_square_view.xml
│ │ │ ├── custom_view_item.xml
│ │ │ ├── data_class_item.xml
│ │ │ ├── data_class_view_binding_item.xml
│ │ │ ├── decorated_linear_group.xml
│ │ │ ├── epoxy_layout_data_binding_item.xml
│ │ │ ├── sticky_view_holder_item.xml
│ │ │ ├── vertical_linear_group.xml
│ │ │ ├── view_binding_holder_item.xml
│ │ │ └── view_holder_item.xml
│ │ ├── mipmap-anydpi-v26/
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ └── values/
│ │ ├── colors.xml
│ │ ├── ids.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test/
│ └── java/
│ └── com/
│ └── airbnb/
│ └── epoxy/
│ └── kotlinsample/
│ ├── AnnotationModel.kt
│ ├── ConstructorWithLambdaModel.kt
│ └── ConstructorWithoutLamdaModel.kt
├── ktlint.gradle
├── libs/
│ ├── rt.jar
│ └── tools.jar
├── publishing.gradle
├── reports/
│ └── profile/
│ ├── css/
│ │ ├── base-style.css
│ │ └── style.css
│ ├── js/
│ │ └── report.js
│ └── profile-2020-03-31-14-39-05.html
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/build_test.yml
================================================
name: Build/Test
on:
# Trigger on every pull request
pull_request:
permissions:
contents: read
jobs:
build-test:
runs-on: macos-13
steps:
- name: Checkout epoxy
uses: actions/checkout@v4
- name: Setting up Java 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
cache-read-only: ${{ github.ref != 'refs/heads/master' }}
- name: Build / Unit tests / Lint
run: "./gradlew check --stacktrace"
- name: Run UI Tests
uses: reactivecircus/android-emulator-runner@v2.32.0
with:
api-level: 21
target: default
arch: x86_64
emulator-options: -no-skin -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect
disable-animations: true
script: ./gradlew :epoxy-composeinterop-maverickssample:connectedDebugAndroidTest --stacktrace
================================================
FILE: .gitignore
================================================
# macOS
.DS_Store
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.war
*.ear
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
# IntelliJ
*.iml
.idea/
!.idea/codeStyles/
!.idea/codeStyleSettings.xml
# Android
.gradle
build/
local.properties
# Kotlin
.kotlin
================================================
FILE: .idea/codeStyleSettings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectCodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS">
<value>
<option name="OTHER_INDENT_OPTIONS">
<value>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="8" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</value>
</option>
<option name="INSERT_INNER_CLASS_IMPORTS" value="true" />
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
<value />
</option>
<option name="IMPORT_LAYOUT_TABLE">
<value>
<package name="android" withSubpackages="true" static="false" />
<emptyLine />
<package name="com" withSubpackages="true" static="false" />
<emptyLine />
<package name="junit" withSubpackages="true" static="false" />
<emptyLine />
<package name="net" withSubpackages="true" static="false" />
<emptyLine />
<package name="org" withSubpackages="true" static="false" />
<emptyLine />
<package name="java" withSubpackages="true" static="false" />
<emptyLine />
<package name="javax" withSubpackages="true" static="false" />
<emptyLine />
<package name="" withSubpackages="true" static="false" />
<emptyLine />
<package name="" withSubpackages="true" static="true" />
<emptyLine />
</value>
</option>
<option name="RIGHT_MARGIN" value="100" />
<option name="JD_KEEP_INVALID_TAGS" value="false" />
<option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" />
<option name="JD_KEEP_EMPTY_PARAMETER" value="false" />
<option name="JD_KEEP_EMPTY_EXCEPTION" value="false" />
<option name="JD_KEEP_EMPTY_RETURN" value="false" />
<option name="WRAP_COMMENTS" value="true" />
<AndroidXmlCodeStyleSettings>
<option name="USE_CUSTOM_SETTINGS" value="true" />
</AndroidXmlCodeStyleSettings>
<JavaCodeStyleSettings>
<option name="ANNOTATION_PARAMETER_WRAP" value="1" />
</JavaCodeStyleSettings>
<MarkdownNavigatorCodeStyleSettings>
<option name="RIGHT_MARGIN" value="72" />
</MarkdownNavigatorCodeStyleSettings>
<Objective-C-extensions>
<file>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
</file>
<class>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
</class>
<extensions>
<pair source="cpp" header="h" />
<pair source="c" header="h" />
</extensions>
</Objective-C-extensions>
<XML>
<option name="XML_KEEP_LINE_BREAKS" value="false" />
<option name="XML_KEEP_BLANK_LINES" value="1" />
<option name="XML_ALIGN_ATTRIBUTES" value="false" />
<option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" />
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
</XML>
<codeStyleSettings language="Groovy">
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="4" />
<option name="TAB_SIZE" value="8" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JAVA">
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
<option name="BLANK_LINES_AROUND_METHOD_IN_INTERFACE" value="0" />
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
<option name="CALL_PARAMETERS_WRAP" value="1" />
<option name="METHOD_PARAMETERS_WRAP" value="1" />
<option name="RESOURCE_LIST_WRAP" value="1" />
<option name="THROWS_LIST_WRAP" value="1" />
<option name="EXTENDS_KEYWORD_WRAP" value="1" />
<option name="THROWS_KEYWORD_WRAP" value="1" />
<option name="METHOD_CALL_CHAIN_WRAP" value="1" />
<option name="BINARY_OPERATION_WRAP" value="1" />
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
<option name="TERNARY_OPERATION_WRAP" value="1" />
<option name="KEEP_SIMPLE_CLASSES_IN_ONE_LINE" value="true" />
<option name="FOR_STATEMENT_WRAP" value="1" />
<option name="ARRAY_INITIALIZER_WRAP" value="1" />
<option name="ASSIGNMENT_WRAP" value="1" />
<option name="ASSERT_STATEMENT_WRAP" value="1" />
<option name="IF_BRACE_FORCE" value="3" />
<option name="FOR_BRACE_FORCE" value="3" />
<option name="WRAP_LONG_LINES" value="true" />
<option name="FIELD_ANNOTATION_WRAP" value="1" />
<option name="PARAMETER_ANNOTATION_WRAP" value="1" />
<option name="VARIABLE_ANNOTATION_WRAP" value="1" />
<option name="ENUM_CONSTANTS_WRAP" value="2" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="4" />
<option name="TAB_SIZE" value="8" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_NAMESPACE>Namespace:</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_NAMESPACE>Namespace:</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_width</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_height</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_.*</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:width</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:height</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="1" />
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" />
</codeStyleSettings>
</value>
</option>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</component>
</project>
================================================
FILE: CHANGELOG.md
================================================
# 5.2.1
Fix some issues in KSP2 when multiple processing rounds occur (https://github.com/airbnb/epoxy/pull/1396)
# 5.2.0
Migrate to KSP 2 (#1393)
# 5.1.4
Change the way the Compose interop works to avoid Android 12 bug (#1370)
# 5.1.3
Update to kotlin 1.8.21
Fix click listener kapt bug (#1327)
Resolve unchecked call warning for WrappedEpoxyModelClickListener (#1337)
Fix refresh KDoc (#1334)
epoxy-kspsample : use ksp block to specify arguments (#1347)
# 5.1.2
Updates kotlin, ksp, and the xprocessing library.
Notably, the androidx.room:room-compiler-processing library (aka xprocessing) has been updated to 2.6.0-alpha01. This version is incompatible with previous versions due to a breaking API change. All annotation processors using this library must be on the same version. Other annotation processors such as Epoxy and Paris also use xprocessing and if you use them you need to use a version of them that also uses xprocessing 2.6.0-alpha01
# 5.1.1
Remove incorrect ksp symbol validation in processing of @EpoxyModelClass
# 5.1.0
Updates Kotlin to 1.7.20 and KSP to 1.7.20-1.0.7, as well as the room compiler processing (xprocessing) library to 2.5.0-beta01.
Also deletes the epoxy-paging artifact in favor of the newer epoxy-paging3
# 5.0.0
This adds support for Kotlin Symbol Processing, while maintaining backwards compatibility with java annotation processing via the xprocessing library from Room.
This includes a major version bump to 5.0.0 because there may be slight behavior differences with KSP, especially for generic types in generated code. For example, if you previously had an epoxy attribute in java source code with a raw type it may now appear in the generated code with a wildcard type, which may require tweaking the type that is passed to the model.
Additionally, some type checking was improved, for example more accurate validation of proper equals and hashcode implementations.
To use Epoxy with KSP, simply apply it with the ksp gradle plugin instead of kapt (https://github.com/google/ksp/blob/main/docs/quickstart.md). See the new epoxy-kspsample module for an example.
Note that unfortunately the databinding processor does NOT support KSP, simply because Android databinding itself uses KAPT and KSP cannot currently depend on KAPT sources. The code changes are in place to enable KSP with databinding once the databinding plugin from Android supports KSP (although this is unlikely) - alternatively it may be possible to configure the KSP plugin to run after KAPT and depend on its outputs (you're on your own if you want to try that).
Also, parallel processing support was removed because it is not compatible with KSP.
We have also added easy interop with Jetpack Compose via functions in the `epoxy-composeinterop` artifact.
See the epoxy-composesample module for example usage.
# 4.6.4 (September 23, 2021)
- Clean up dependency for the experimental epoxy module
# 4.6.3 (September 11, 2021)
- Add EpoxyModel#preBind hook(#1225)
- Add unbind extension to ItemViewBindingEpoxyHolder (#1223)
- Add missing loadStateFlow to PagingDataEpoxyController (#1209)
# 4.6.2 (June 11, 2021)
Fix Drag n Drop not working in 4.6.1 (#1195)
# 4.6.1 (May 13, 2021)
Adds "epoxyDisableDslMarker" annotation processor flag which you can use to delay migration to the model building scope DLSMarker introduced in 4.6.0 if it is a large breaking change for your project.
Note that this only applies to your project modules that you apply it to, and does not apply to the handful of models that ship with the Epoxy library (like the Carousel or `group` builder).
For example:
```groovy
project.android.buildTypes.all { buildType ->
buildType.javaCompileOptions.annotationProcessorOptions.arguments =
[
epoxyDisableDslMarker : "true",
]
}
```
# 4.6.0 (May 12, 2021)
- View Binder Support (#1175) Bind epoxy models to views outside of a RecyclerView.
### Potentially Breaking
- Use kotlin dsl marker for model building receivers (#1180)
This change uses Kotlin's DSL marker annotation to enforce proper usage of model building extension
functions. You may now need to change some references in your model building code to explicitly reference properties with `this`.
# 4.5.0 (April 13, 2021)
- Fix generated code consistency in builder interfaces (#1166)
- Provided support to invalidate `modelCache` in `PagingDataEpoxyController` (#1161)
- Explicitly add public modifier (#1162)
- Unwrap context to find parent activity in order to share viewpool when using Hilt (#1157)
# 4.4.4 (Mar 24, 2021)
- Provide support for snapshot() function in PagingDataEpoxyController (#1144)
# 4.4.3 (Mar 17, 2021)
- Fixed interface model related regression introduced in the previous release.
# 4.4.2 (Mar 1, 2021)
- Updated package name of the model class generated for an interface
# 4.4.1 (Feb 22, 2021)
- Support for Paging3 (#1126) (Thanks to @osipxd and @anhanh11001!)
- Update KotlinPoet to 1.7.2 (#1117)
# 4.4.0 (Feb 18, 2021)
Bad release, don't use
# 4.3.1 (Dec 2, 2020)
- Fix ANR and view pool resolution in nested group (#1101)
# 4.3.0 (Dec 1, 2020)
- ModelGroupHolder get recycle pool from parent (#1097)
- Add support for `EpoxyModelGroup` in the `EpoxyVisibilityTracker` (#1091)
- Convert EpoxyVisibilityTracker code to Kotlin (#1090)
## Breaking Changes
Note that due to the conversion of EpoxyVisibilityTracker to kotlin you now need to access `EpoxyVisibilityTracker.partialImpressionThresholdPercentage` as a property
`epoxyVisibilityTracker.setPartialImpressionThresholdPercentage(value)` -> `epoxyVisibilityTracker.partialImpressionThresholdPercentage = value`
Also, the ModelGroupHolder improvement required the `ModelGroupHolder#createNewHolder` function to change its signature to accept a `ViewParent` parameter.
If you override `createNewHolder()` anywhere you will need to change it to `createNewHolder(@NonNull ViewParent parent)`
# 4.2.0 (Nov 11, 2020)
- Add notify model changed method (#1063)
- Update to Kotlin 1.4.20-RC and remove dependency on kotlin-android-extensions
# 4.1.0 (Sept 17, 2020)
- Fix some synchronization issues with the parallel Epoxy processing option
- Add view visibility checks to EpoxyVisibilityItem and decouple RecyclerView #1052
# 4.0.0 (Sept 5, 2020)
## New
- Incremental annotation processing for faster builds
- Support for Android Jetpack Paging v3 library in new `epoxy-paging3` artifact
- Model group building with Kotlin DSL (#1012)
- A new annotation processor argument `logEpoxyTimings` can be set to get a detailed breakdown of how long the processors took and where they spent their time (off by default)
- Another new argument `enableParallelEpoxyProcessing` can be set to true to have the annotation processor process annotations and generate files in parallel (via coroutines).
You can enable these processor options in your build.gradle file like so:
```
project.android.buildTypes.all { buildType ->
buildType.javaCompileOptions.annotationProcessorOptions.arguments =
[
logEpoxyTimings : "true",
enableParallelEpoxyProcessing : "true"
]
}
```
Parallel processing can greatly speed up processing time (moreso than the incremental support), but given the hairy nature of parallel processing it is still incubating.
Please report any issues or crashes that you notice.
(We are currently using parallel mode in our large project at Airbnb with no problems.)
- Add options to skip generation of functions for getters, reset, and method overloads to reduce generated code
- New annotation processor options are:
- epoxyDisableGenerateOverloads
- epoxyDisableGenerateGetters
- epoxyDisableGenerateReset
## Fixes
- Synchronize ListUpdateCallback and PagedListModelCache functions (#987)
- Avoid generating bitset checks in models when not needed (reduces code size)
- Fix minor memory leak
## Breaking
- Annotations that previously targeted package elements now target types (classes or interfaces).
This includes: `EpoxyDataBindingPattern`, `EpoxyDataBindingLayouts`, `PackageModelViewConfig`, `PackageEpoxyConfig`
This was necessary to work around an incremental annotation processor issue where annotation on package-info elements are not properly recompiled
- In order to enable incremental annotation processing a change had to be made in how the processor of
`@AutoModel` annotations work. If you use `@AutoModel` in an EpoxyController the annotated Model types
must be either declared in a different module from the EpoxyController, or in the same module in the same java package.
Also make sure you have kapt error types enabled.
However, generally `@AutoModel` is considered legacy and is not recommended. It is a relic of Java Epoxy usage
and instead the current best practice is to use Kotlin with the Kotlin model extension functions to build models.
- Removed support for generating Epoxy models from Litho components
# 4.0.0-beta6 (July 15, 2020)
- PackageModelViewConfig can now be applied to classes and interfaces in addition to package-info.java
# 4.0.0-beta5 (July 9, 2020)
Fixes:
- An occasional processor crash when the option to log timings is enabled
- Incremental annotation processing of databinding models would fail to generate models (#1014)
Breaking!
- The annotation that support databinding, `EpoxyDataBindingLayouts` and `EpoxyDataBindingPattern`,
must now be placed on a class or interface instead of in a `package-info.java` file. The interface
or class must be in Java, Kotlin is not supported. This is necessary to support incremental processing.
Example usage:
```java
package com.example.app;
import com.airbnb.epoxy.EpoxyDataBindingLayouts;
import com.airbnb.epoxy.EpoxyDataBindingPattern;
@EpoxyDataBindingPattern(rClass = R.class, layoutPrefix = "my_view_prefix")
@EpoxyDataBindingLayouts({R.layout.my_model_layout})
interface EpoxyDataBindingConfig {}
```
# 4.0.0-beta4 (June 1, 2020)
Fixes:
- Synchronize ListUpdateCallback and PagedListModelCache functions (#987)
- 4.0.0.beta1 generating duplicate method layout(int) #988
# 4.0.0-beta3 (May 27, 2020)
- Sort functions in generated kotlin extension function files deterministically to prevent generated sources from changing
- Avoid generating bitset checks in models when not needed
- Add options to skip generation of functions for getters, reset, and method overloads to reduce generated code
New annotation processor options are:
- epoxyDisableGenerateOverloads
- epoxyDisableGenerateGetters
- epoxyDisableGenerateReset
These can also be controlled (and overridden) on a per package level with the `PackageModelViewConfig` package annotation.
# 4.0.0-beta1 (May 22, 2020)
- Support for incremental annotation processing as an Aggregating processor (#972)
- Removed Litho support
- A new annotation processor argument `logEpoxyTimings` can be set to get a detailed breakdown of how long the processors took and where they spent their time (off by default)
- Another new argument `enableParallelEpoxyProcessing` can be set to true to have the annotation processor process annotations and generate files in parallel (via coroutines).
You can enable these processor options in your build.gradle file like so:
```
project.android.buildTypes.all { buildType ->
buildType.javaCompileOptions.annotationProcessorOptions.arguments =
[
logEpoxyTimings : "true",
enableParallelEpoxyProcessing : "true"
]
}
```
Parallel processing can greatly speed up processing time (moreso than the incremental support), but given the nature of parallel processing it is still incubating.
Please report any issues or crashes that you notice.
(We are currently using parallel mode in our large project at Airbnb with no problems.)
## Breaking
In order to enable incremental annotation processing a change had to be made in how the processor of
`@AutoModel` annotations work. If you use `@AutoModel` in an EpoxyController the annotated Model types
must be either declared in a different module from the EpoxyController, or in the same module in the same java package.
Also make sure you have kapt error types enabled.
However, generally `@AutoModel` is considered legacy and is not recommended. It is a relic of Java Epoxy usage
and instead the current best practice is to use Kotlin with the Kotlin model extension functions to build models.
# 3.11.0 (May 20, 2020)
- Introduce partial impression visibility states (#973)
- Fix sticky header crash (#976)
# 3.10.0 (May 15, 2020)
- Carousel building with Kotlin DSL (#967)
- Android ViewBinding: added an example in the sample project. (#939)
- Fix setter with default value lookup in kotlin 1.4 (#966)
- Change "result" property name in generated model (#965)
- Add support for Sticky Headers (#842)
- Use measured width/height if it exists in Carousel. (#915)
- Add a getter to EpoxyViewHolder.getHolder(). (#952) (#953)
- Fix visibility tracking during RecyclerView animations (#962)
- Fix leak in ActivityRecyclerPool ((#906)
- Rename ResultCallack to ResultCallback in AsyncEpoxyDiffer (#899)
- Fix incorrect license attributes in POM file (#898)
# 3.9.0 (Dec 17, 2019)
- Fix reading EpoxyDataBindingPattern enableDoNotHash (#837)
- Make EpoxyRecyclerView.setItemSpacingPx() open (#829)
- Use same version for Mockito Core and Inline (#860)
- Minor documentation and variable name updates. (#870)
- Move epoxy-modelfactory tests to their own module (#834)
- Remove executable bit from non-executable files (#864)
- Various repo clean ups and version bumps
# 3.8.0 (Sept 16, 2019)
- Add support for Kotlin delegation via annotated interface properties #812
- Fix checked change crash and improve debug errors #806
- Remove extra space in Kotlin extensions #777
- Update project to AGP 3.5, Kotlin 1.3.50, Gradle 5.6
# 3.7.0 (July 1, 2019)
- **New** Add a method to request visibility check externally (https://github.com/airbnb/epoxy/pull/775)
# 3.6.0 (June 18, 2019)
- **New** Preloader system with glide extensions https://github.com/airbnb/epoxy/pull/766
- **Fixed** model click listener crashing on nested model https://github.com/airbnb/epoxy/pull/767
# 3.5.1 (May 21, 2019)
- Bumped Kotlin to 1.3.31
# 3.5.0 (May 8, 2019)
- **New** Converted EpoxyRecyclerView to Kotlin (you may need to update your usage for this). Also added built in support for `EpoxyRecyclerView#withModels` for easy inline model building with Kotlin.
- **Fixed** Crashes in visibility tracking
# 3.4.2 (April 18, 2019)
- **Fixed** Kotlin default param handling had issues with overloaded functions
# 3.4.1 (April 16, 2019)
- **New** Support kotlin default parameters in @ModelView classes (https://github.com/airbnb/epoxy/pull/722)
# 3.4.0 (April 10, 2019)
- **New** Generate OnModelCheckedChangeListener override for props of type `CompoundButton.OnCheckedChangeListener` (https://github.com/airbnb/epoxy/pull/725)
- **New** Extract ID generation methods to new public IdUtils class (https://github.com/airbnb/epoxy/pull/724)
- **Changed** Reset controller state on failed model build (https://github.com/airbnb/epoxy/pull/720)
- **Changed** Disabled the auto-detach behavior on Carousels by default (https://github.com/airbnb/epoxy/pull/688)
# 3.3.0 (Feb 5, 2019)
- **Fixed** Two issues related to the recent EpoxyModelGroup changes (https://github.com/airbnb/epoxy/pull/676)
# 3.2.0 (Jan 21, 2019)
- **New** Enable recycling of views within EpoxyModelGroup (https://github.com/airbnb/epoxy/pull/657)
- **New** Add support to tracking visibility in nested RecyclerViews (https://github.com/airbnb/epoxy/pull/633)
- **New** Add method to clear cache in paging controller (https://github.com/airbnb/epoxy/pull/586)
- **Fix** Crashes from synchronization in PagedListEpoxyController (https://github.com/airbnb/epoxy/pull/656)
- **Fix** Get onSwipeProgressChanged callbacks on return to original item position (https://github.com/airbnb/epoxy/pull/654)
# 3.1.0 (Dec 4, 2018)
- **Fix** Memory leak in debug mode is removed (https://github.com/airbnb/epoxy/pull/613)
- **Fix** For visibility callbacks, wrong visibility when the view becomes not visible (https://github.com/airbnb/epoxy/pull/619)
# 3.0.0 (Nov 13, 2018)
- **Breaking** Migrated to androidx packages (Big thanks to jeffreydelooff!)
- **Breaking** The `Carousel.Padding` class changed the ordering of its parameters to match Android's ordering of "left, top, right, bottom". (https://github.com/airbnb/epoxy/pull/536 thanks to martinbonnin)
This change won't break compilation, so you _must_ manually change your parameter ordering, otherwise you will get unexpected padding results.
# 2.19.0 (Oct 18, 2018)
This release adds built in support for monitoring visibility of views in the RecyclerView. (https://github.com/airbnb/epoxy/pull/560)
Usage instructions and details are in the wiki - https://github.com/airbnb/epoxy/wiki/Visibility-Events
Huge thanks to Emmanuel Boudrant for contributing this!
# 2.18.0 (Sep 26, 2018)
- **New** A new `PagedListEpoxyController` to improve integration with the Android Paging architecture component (#533 Thanks to Yigit!)
With this change the old `PagingEpoxyController` has been deprecated, and [the wiki](https://github.com/airbnb/epoxy/wiki/Paging-Support) is updated.
- **New** Add databinding option to not auto apply DoNotHash (#539)
- **Fixed** Fix AsyncEpoxyController constructor to correctly use boolean setting (#537)
- **Fixed** `app_name` is removed from module manifests (#543 Thanks @kettsun0123!)
# 2.17.0 (Sep 6, 2018)
- **New** Add support for setting the Padding via resource or directly in dp (https://github.com/airbnb/epoxy/pull/528 Thanks to pwillmann!)
- **Fixed** Strip kotlin metadata annotation from generated classes (https://github.com/airbnb/epoxy/pull/523)
- **Fixed** Reflect the annotations declared in constructor params (https://github.com/airbnb/epoxy/pull/519 Thanks to Shaishav Gandhi!)
# 2.16.4 (Aug 29, 2018)
- **New** `EpoxyAsyncUtil` and `AsyncEpoxyController` make it easier to use Epoxy's async behavior out of the box
- **New** Epoxy's background diffing posts messages back to the main thread asynchronously so they are not blocked by waiting for vsync
# 2.16.3 (Aug 24, 2018)
- **New** Add `AsyncEpoxyController` for easy access to async support. Change background diffing to post asynchronously to the main thread (https://github.com/airbnb/epoxy/pull/509)
# 2.16.2 (Aug 23, 2018)
- **Fix** Kotlin lambdas can be used in model constructors (https://github.com/airbnb/epoxy/pull/501)
- **New** Added function to check whether a model build is pending (https://github.com/airbnb/epoxy/pull/506)
# 2.16.1 (Aug 15, 2018)
- **Fix** Update EpoxyController async model building so threading works with tests (https://github.com/airbnb/epoxy/pull/504)
# 2.16.0 (Aug 7, 2018)
- **New** EpoxyController now supports asynchronous model building and diffing by allowing you to provide a custom Handler to run these tasks. See the [wiki](https://github.com/airbnb/epoxy/wiki/Epoxy-Controller#asynchronous-support) for more details.
- **New** The `EpoxyController#addModelBuildListener` method was added to support listening for when model changes are dispatched to the recyclerview.
# 2.15.0 (July 29, 2018)
- **New** Added kotlin sample code for building models. Updated wiki with info (https://github.com/airbnb/epoxy/wiki/Kotlin-Model-Examples)
- **Fix** Generated kotlin extension functions now work with Models with type variables (https://github.com/airbnb/epoxy/pull/478)
- **Fix** Backup is not enabled in manifest now (https://github.com/airbnb/epoxy/pull/481)
- **Fix** Click listener setter on generated model has correct nullability annotation (https://github.com/airbnb/epoxy/pull/458)
- **Fix** Avoid kotlin crash using toString on lambdas (https://github.com/airbnb/epoxy/pull/482)
- **Fix** If EpoxyModelGroup has annotations the generated class now calls super methods correctly. (https://github.com/airbnb/epoxy/pull/483)
# 2.14.0 (June 27, 2018)
- **New** Experimental support for creating Epoxy models from arbitrary data formats (#450)
# 2.13.0 (June 19, 2018)
- **Fix** Reduce memory usage in model groups and differ (#433)
- **Fix** Support for wildcards in private epoxy attributes (#451)
- **Fix** Generated Kotlin Extensions Don't Adhere to Constructor Nullability (#449)
- **Fix** Infinite loop in annotation processor (#447)
# 2.12.0 (April 18, 2018)
- **Breaking** Several updates to the Paging Library integration were made (https://github.com/airbnb/epoxy/pull/421)
- The `PagingEpoxyController` class had the methods `setNumPagesToLoad` and `setPageSizeHint` removed
- Page hints are now taken from the `Config` object off of the PagedList. See the `setConfig` javadoc for information on how config values are used: https://github.com/airbnb/epoxy/blob/master/epoxy-paging/src/main/java/com/airbnb/epoxy/paging/PagingEpoxyController.java#L220
- Several tweaks were made to how the page size and prefetch distance affect model rebuilding. Take some time to make sure your config values make sense and produce good results for your use case
- A crash on empty list was fixed (https://github.com/airbnb/epoxy/issues/420)
- **New** The [Paris](https://github.com/airbnb/paris) library is now officially supported to allow dynamically styling RecyclerView items though Epoxy models. See [the wiki](https://github.com/airbnb/epoxy/wiki/Paris-Integration-(Dynamic-Styling)) for more info.
# 2.11.0 (April 7, 2018)
- **Fix** Make databinding work with Android Studio 3.1 (https://github.com/airbnb/epoxy/pull/418)
- Make `EpoxyController#isBuildingModels` public (https://github.com/airbnb/epoxy/pull/406
# 2.10.0 (February 25, 2018)
- **Improved** Allow the `Model_` class suffix for models generated via `@ModelView` to be customized (https://github.com/airbnb/epoxy/pull/402 Big thanks to geralt-encore!)
# 2.9.0 (January 29, 2018)
- **Improved** Global defaults for EpoxyController settings. Set duplicate filtering and exception handlers for all your controllers. (https://github.com/airbnb/epoxy/pull/394)
- **Improved** Add `@NonNull` annotations in EpoxyModel for better Kotlin interop
- **Fixed** Model click listeners now rebind correctly on partial model diffs (https://github.com/airbnb/epoxy/pull/393)
- **Fixed** Update Android Paging library to fix placeholder support (Thanks @wkranich! https://github.com/airbnb/epoxy/pull/360)
- **Fixed** Improve error message for inaccessible private fields (https://github.com/airbnb/epoxy/pull/388)
# 2.8.0 (December 22, 2017)
- **New** Use `@ModelProp` directly on fields to avoid creating a setter (https://github.com/airbnb/epoxy/pull/343)
- **New** Set EpoxyRecyclerView item spacing via xml attribute (https://github.com/airbnb/epoxy/pull/364)
- **New** More flexibility over setting Carousel padding values (https://github.com/airbnb/epoxy/pull/369)
- **New** Allow custom EpoxyModelGroup root view (https://github.com/airbnb/epoxy/pull/370)
- **Fixed** Public visibility settings of the Carousel snap helper settings (https://github.com/airbnb/epoxy/pull/356)
- **Fixed** Add more nullability annotations to better support Kotlin
- **Fixed** Saving view state now works better (https://github.com/airbnb/epoxy/pull/367)
# 2.7.3 (November 21, 2017)
- **Fixed** When a model changed and a partial update was bound to an existing view the wrong values could be set for prop groups (https://github.com/airbnb/epoxy/pull/347)
# 2.7.2 (October 28, 2017)
- **Fixed** Using `EpoxyDataBindingPattern` could result in the wrong package being used for the BR class in generated models.
# 2.7.1 (October 24, 2017)
Several fixes:
- https://github.com/airbnb/epoxy/pull/332
- https://github.com/airbnb/epoxy/pull/329
- https://github.com/airbnb/epoxy/pull/330
- https://github.com/airbnb/epoxy/pull/331
# 2.7.0 (October 17, 2017)
* **New** If a `@ModelView` generated model has a custom base class the generated model will now inherit constructors from the base class (https://github.com/airbnb/epoxy/pull/315)
* **New** Use the `EpoxyDataBindingPattern` annotation to specify a naming pattern for databinding layouts. This removes the need to declare every databinding layout explicitly ([Wiki](https://github.com/airbnb/epoxy/wiki/Data-Binding-Support#automatic-based-on-naming-pattern) - https://github.com/airbnb/epoxy/pull/319)
* **New** If a view with `@ModelView` implements an interface then the generated model will implement a similar interface, enabling polymorphism with models. [Wiki](https://github.com/airbnb/epoxy/wiki/Generating-Models-from-View-Annotations#view-interfaces)
* **Improvement** `PagingEpoxyController` now has getters to access the underlying data lists (Thanks to @pcqpcq - https://github.com/airbnb/epoxy/pull/317)
* **Improvement** `EpoxyModelGroup` now supports partial rebinds (https://github.com/airbnb/epoxy/pull/316)
# 2.6.0 (October 10, 2017)
* **Improvement** If a `OnModelClickListener` is used it will not be called if a view is clicked while it is being removed or otherwise has no position (https://github.com/airbnb/epoxy/issues/293 - Thanks @niccorder!)
* **New** `EpoxyRecyclerView` and `Carousel` provide out of the box integration with Epoxy along with other enhancements over regular RecyclerView (https://github.com/airbnb/epoxy/wiki/EpoxyRecyclerView)
* **New** `EpoxyPagingController` provides integration with the Android Paging architecture component as well as normal, large lists of items (https://github.com/airbnb/epoxy/wiki/Large-Data-Sets)
#### Kotlin
* **Improvement** Disable kotlin extension function generation with the annotation processor flag `disableEpoxyKotlinExtensionGeneration` (https://github.com/airbnb/epoxy/pull/309)
* **Fix** If a model has a non empty constructor the generated extension function will now use it.
# 2.5.1 (October 2, 2017)
* **Fixed** The wrong import was being generated for models using a view holder in 2.5.0 (https://github.com/airbnb/epoxy/pull/294)
* **Fixed** Fix generated code failing to compile if a subclass of View.OnClickListener is used as an attribute (https://github.com/airbnb/epoxy/pull/296)
# 2.5.0 (September 14, 2017)
* **New Feature** Epoxy now generates a Kotlin DSL to use when building models in your EpoxyController! See [the wiki](https://github.com/airbnb/epoxy/wiki/Epoxy-Controller#usage-with-kotlin) for details
* **New Feature** You can use the `autoLayout` parameter in `@ModelView` instead of needing to create a layout resource for `defaultLayout`. Epoxy will then create your view programmatically (https://github.com/airbnb/epoxy/pull/282).
**Breaking**
* The `onSwipeProgressChanged` callback in `EpoxyTouchHelper` had a `Canvas` parameter added (https://github.com/airbnb/epoxy/pull/280). You will need to update any of your usages to add this. Sorry for the inconvenience; this will hopefully help you add better swipe animations.
# 2.4.0 (September 4, 2017)
* **Improvement** If you are setting options on a @ModelProp and have no other annotation parameters you can now omit the explicit `options = ` param name (https://github.com/airbnb/epoxy/pull/268)
* **Improvement** If you are using `@TextProp` you can now specify a default string via a string resource (https://github.com/airbnb/epoxy/pull/269)
* **Fixed** EpoxyModelGroup was not binding model click listeners correctly (https://github.com/airbnb/epoxy/pull/267)
* **Fixed** A model created with @ModelView could fail to compile if it had nullable prop overloads (https://github.com/airbnb/epoxy/pull/274)
#### Potentially Breaking Fix
A model created with @ModelView with a click listener had the wrong setter name for the model click listener overload (https://github.com/airbnb/epoxy/pull/275)
If you were setting this you will need to update the setter name. If you were setting the click listener to null you may now have to cast it.
# 2.3.0 (August 16, 2017)
* **New** An `AfterPropsSet` annotation for use in `@ModelView` classes. This allows initialization work to be done after all properties are bound from the model. (https://github.com/airbnb/epoxy/pull/242)
* **New** Annotations `TextProp` and `CallbackProp` as convenient replacements for `ModelProp`. (https://github.com/airbnb/epoxy/pull/260)
* **New** Easy support for dragging and swiping via the `EpoxyTouchHelper` class. https://github.com/airbnb/epoxy/wiki/Touch-Support
* **Change** Added the method `getRootView` to the view holder class in `EpoxyModelGroup` and made the bind methods on `EpoxyModelGroup` non final. This allows access to the root view of the group.
* **Change** Generated models will now inherit class annotations from the base class (https://github.com/airbnb/epoxy/pull/255 Thanks geralt-encore!)
# 2.2.0 (June 19, 2017)
* **Main Feature** Models can now be completely generated from a custom view via annotations on the view. This should completely remove the overhead of creating a model manually in many cases! For more info, see [the wiki](https://github.com/airbnb/epoxy/wiki/Generating-Models-from-View-Annotations)
* **New** Lowered the minimum SDK from 16 to 14.
* **New** Models that have a `View.OnLongClickListener` as an EpoxyAttribute will now have an overloaded setter on the generated model that allows you to set a long click listener that will return the model, view, and adapter position. This is very similar to the `View.OnClickListener` support added in 2.0.0, but for long click listeners. **Upgrade Note** If you were setting a long click listener value to null anywhere you will need to now cast that to `View.OnLongClickListener` because of the new overloaded method.
* **New** `id` overload on EpoxyModel to define a model id with multiple strings
* **New** Option in `EpoxyAttribute` to not include the attribute in the generated `toString` method (Thanks to @geralt-encore!)
* **New** @AutoModel models are now inherited from usages in super classes (Thanks to @geralt-encore!)
* **Fixed** Generated getters could recursively call themselves (Thanks to @geralt-encore!)
# 2.1.0 (May 9, 2017)
* **New**: Support for Android Data Binding! Epoxy will now generate an EpoxyModel directly from a Data Binding xml layout, and handle all data binding details automatically. Thanks to @geralt-encore for helping with this! See more details in [the wiki](https://github.com/airbnb/epoxy/wiki/Data-Binding-Support).
* **New**: Support for Litho. Epoxy will now generate an EpoxyModel for Litho Layout Specs. See more details in [the wiki](https://github.com/airbnb/epoxy/wiki/Litho-Support).
* **New**: Support for implicitly adding AutoModels to an EpoxyController, this let's you drop the extra `.addTo(this)` line. More details and instructions [here](https://github.com/airbnb/epoxy/wiki/Epoxy-Controller#implicit-adding)
# 2.0.0 (March 25, 2017)
* **New**: The `EpoxyController` class helps you manage even models better. This should be used instead of the original `EpoxyAdapter` in most places. Read more about `EpoxyController` in [the wiki](https://github.com/airbnb/epoxy/wiki/Epoxy-Controller).
* **Change**: In the new EpoxyController, the diffing algorithm uses both `equals` and `hashCode` on each model to check for changes. This is a change from the EpoxyAdapter where only `hashCode` was used. Generated models have both hashCode and equals implemented properly already, but if you have any custom hashCode implementations in your models make sure you have equals implemented as well.
* **New**: Models that have a `View.OnClickListener` as an EpoxyAttribute will now have an overloaded setter on the generated model that allows you to set a click listener that will return the model, view, and adapter position. **Upgrade Note** If you were setting a click listener value to null anywhere you will need to now cast that to `View.OnClickListener` because of the new overloaded method.
* **New**: Attach an onBind/onUnbind listener directly to a model instead of overriding the onModelBound method. Generated models will have methods created to set this listener and handle the callback for you.
* **New**: Support for creating models in Kotlin (Thanks to @geralt-encore! https://github.com/airbnb/epoxy/pull/144)
* **New**: `EpoxyModelWithView` supports creating a View programmatically instead of inflating from XML.
* **New**: `EpoxyModelGroup` supports grouping models together in arbitrary formations.
* **New**: Instead of setting attribute options like `@EpoxyAttribute(hash = false)` you should now do `@EpoxyAttribute(DoNotHash)`. You can also set other options like that.
* **New**: Annotation processor options can now be set via gradle instead of with `PackageEpoxyConfig`
* **New**: In an EpoxyController, if a model with the same id changes state Epoxy will include its previous state as a payload in the change notification. The new model will have its `bind(view, previouslyBoundModel)` method called so it can compare what changed since the previous model, and so it can update the view with only the data that changed.
# 1.7.5 (Feb 21, 2017)
* **New**: Models inherit layouts specified in superclass `@EpoxyModelClass` annotations [#119](https://github.com/airbnb/epoxy/pull/119)
* **New**: Support module configuration options [#124](https://github.com/airbnb/epoxy/pull/124)
# 1.6.2 (Feb 8, 2017)
* New: Support layout resource annotations in library projects (https://github.com/airbnb/epoxy/pull/116)
# 1.6.1 (Feb 6, 2017)
* Allow the default layout resource to be specified in the EpoxyModelClass class annotation [(#109)](https://github.com/airbnb/epoxy/pull/109) [(#111)](https://github.com/airbnb/epoxy/pull/111)
* Allow the `createNewHolder` method to be omitted and generated automatically [(#105)](https://github.com/airbnb/epoxy/pull/105)
* Generate a subclass for abstract model classes if the EpoxyModelClass annotation is present [(#105)](https://github.com/airbnb/epoxy/pull/105)
* Allow strings as model ids [(#107)](https://github.com/airbnb/epoxy/pull/107)
* Add instructions to readme for avoiding memory leaks [(#106)](https://github.com/airbnb/epoxy/pull/106)
* Add model callbacks for view attached/detached from window, and onFailedToRecycleView [(#104)](https://github.com/airbnb/epoxy/pull/104)
* Improve documentation on model unbind behavior [(#103)](https://github.com/airbnb/epoxy/pull/103)
* Fix generated methods from super classes that have var args [(#100)](https://github.com/airbnb/epoxy/pull/100)
* Remove apt dependency [(#95)](https://github.com/airbnb/epoxy/pull/95)
* Add `removeAllModels` method to EpoxyAdapter [(#94)](https://github.com/airbnb/epoxy/pull/94)
* Use actual param names when generating methods from super classes [(#85)](https://github.com/airbnb/epoxy/pull/85)
# 1.5.0 (11/21/2016)
* Fixes models being used in separate modules
* Generates a `reset()` method on each model to reset annotated fields to their defaults.
* Changes `@EpoxyAttribute(hash = false)` to still differentiate between null and non null values in the hashcode implementation
* Adds a `notifyModelChanged` method to EpoxyAdapter that allows a payload to be specified
* Generates a `toString()` method on all generated model classes that includes the values of all annotated fields.
# 1.4.0 (10/13/2016)
* Optimizations to the diffing algorithm
* Setters on generated classes are not created if an @EpoxyAttribute field is marked as `final`
* Adds @EpoxyModelClass annotation to force a model to have a generated class, even if it doesn't have any @EpoxyAttribute fields
* Fix to not generate methods for package private @EpoxyAttribute fields that are in a different package from the generated class
* Have generated classes duplicate any super methods that have the model as the return type to help with chaining
# 1.3.0 (09/15/2016)
* Add support for using the view holder pattern with models. See the readme for more information.
* Throw an exception if `EpoxyAdapter#notifyDataSetChanged()` is called when diffing is enabled. It doesn't make sense to allow this alongside diffing, and calling this is most likely to be an accidental mixup with `notifyModelsChanged()`.
* Some performance improvements with the diffing algorithm.
# 1.2.0 (09/07/2016)
* Change signature of `EpoxyAdapter#onModelBound` to include the model position
* Fix EpoxyModel hashcode to include the layout specified by `getDefaultLayout`
* Enforce that the id of an `EpoxyModel` cannot change once it has been added to the adapter
* Add optional hash parameter to the `EpoxyAttribute` annotation to exclude a field from being included in the generated hashcode method.
# 1.1.0 (08/24/2016)
* Initial release
================================================
FILE: CONTRIBUTING.MD
================================================
# Epoxy is an Open Source Project
Pull requests are welcome! We'd love help improving this library.
We have a code style setting for the project (checkstyle for Java, ktlint for Kotlin). Please run `Reformat Code` in Android Studio (or Intellij) on changed files before pushing them. Alternatively for Kotlin you can use [ktlint](https://ktlint.github.io/) tasks: check Kotlin code formatting with`./gradlew ktlint` and reformat all Kotlin code with `./gradlew ktlintformat`.
Also, run `./gradlew check` locally to make sure that style checks and tests pass.
If you update the model annotation processor you may find the `UpdateProcessorTestResults.kt` script very useful for updating the existing tests with your changes. (run it with kscript)
- Run ./gradlew testDebug first to get test failures, then run `kscript UpdateProcessorTestResources.kt` to updates sources
- You may have to repeat this cycle several times for all tests to be updated.
================================================
FILE: LICENSE
================================================
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 2018 Airbnb, Inc.
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
================================================
[](https://travis-ci.com/github/airbnb/epoxy)
[](https://maven-badges.herokuapp.com/maven-central/com.airbnb.android/epoxy)
[](https://github.com/airbnb/epoxy/blob/master/LICENSE)

# Epoxy
Epoxy is an Android library for building complex screens in a RecyclerView. Models are automatically generated from custom views or databinding layouts via annotation processing. These models are then used in an EpoxyController to declare what items to show in the RecyclerView.
This abstracts the boilerplate of view holders, diffing items and binding payload changes, item types, item ids, span counts, and more, in order to simplify building screens with multiple view types. Additionally, Epoxy adds support for saving view state and automatic diffing of item changes.
[We developed Epoxy at Airbnb](https://medium.com/airbnb-engineering/epoxy-airbnbs-view-architecture-on-android-c3e1af150394#.xv4ymrtmk) to simplify the process of working with RecyclerViews, and to add the missing functionality we needed. We now use Epoxy for most of the main screens in our app and it has improved our developer experience greatly.
* [Installation](#installation)
* [Basic Usage](#basic-usage)
* [Documentation](#documentation)
* [Min SDK](#min-sdk)
* [Contributing](#contributing)
* [Sample App](https://github.com/airbnb/epoxy/wiki/Sample-App)
## Installation
Gradle is the only supported build configuration, so just add the dependency to your project `build.gradle` file:
```groovy
dependencies {
implementation "com.airbnb.android:epoxy:$epoxyVersion"
// Add the annotation processor if you are using Epoxy's annotations (recommended)
annotationProcessor "com.airbnb.android:epoxy-processor:$epoxyVersion"
}
```
Replace the variable `$epoxyVersion` with the latest version : [](https://maven-badges.herokuapp.com/maven-central/com.airbnb.android/epoxy)
See the [releases page](https://github.com/airbnb/epoxy/releases) for up to date release versions and details
#### Kotlin with KAPT
If you are using Kotlin with KAPT you should also add
```groovy
apply plugin: 'kotlin-kapt'
kapt {
correctErrorTypes = true
}
```
so that `AutoModel` annotations work properly. More information [here](https://github.com/airbnb/epoxy/wiki/Epoxy-Controller#usage-with-kotlin)
Also, make sure to use `kapt` instead of `annotationProcessor` in your dependencies in the `build.gradle` file.
#### Kotlin with KSP (Recommended)
KSP (Kotlin Symbol Processing) is recommended over KAPT as it is significantly faster.
Add the KSP plugin to your root `build.gradle`:
```groovy
plugins {
id 'com.google.devtools.ksp' version "$KSP_VERSION" apply false
}
```
Then apply it in your module's `build.gradle`:
```groovy
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'com.google.devtools.ksp'
}
dependencies {
implementation "com.airbnb.android:epoxy:$epoxyVersion"
ksp "com.airbnb.android:epoxy-processor:$epoxyVersion"
}
```
You can configure KSP processor options:
```groovy
ksp {
// Validation and debugging
arg("validateEpoxyModelUsage", "true") // Validate model usage at runtime (default: true)
arg("logEpoxyTimings", "false") // Log annotation processing timings (default: false)
// Code generation options
arg("epoxyDisableGenerateReset", "false") // Disable reset() method generation (default: false)
arg("epoxyDisableGenerateGetters", "false") // Disable getter generation (default: false)
arg("epoxyDisableGenerateOverloads", "false") // Disable builder overload generation (default: false)
arg("disableEpoxyKotlinExtensionGeneration", "false") // Disable Kotlin extension generation (default: false)
arg("epoxyDisableDslMarker", "false") // Disable DSL marker annotation (default: false)
// Model requirements
arg("requireHashCodeInEpoxyModels", "false") // Require hashCode/equals in models (default: false)
arg("requireAbstractEpoxyModels", "false") // Require abstract model classes (default: false)
arg("implicitlyAddAutoModels", "false") // Auto-add models to controllers (default: false)
}
```
**Important:** DataBinding models are **not supported** with KSP, as Android's DataBinding library itself uses KAPT. If you need DataBinding support, you must continue using KAPT. For custom views with `@ModelView` or ViewHolder models, KSP works perfectly.
See the [epoxy-kspsample](https://github.com/airbnb/epoxy/tree/master/epoxy-kspsample) module for a complete working example.
## Library Projects
If you are using layout resources in Epoxy annotations then for library projects add [Butterknife's gradle plugin](https://github.com/JakeWharton/butterknife#library-projects) to your `buildscript`.
```groovy
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:10.1.0'
}
}
```
and then apply it in your module:
```groovy
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
```
Now make sure you use R2 instead of R inside all Epoxy annotations.
```java
@ModelView(defaultLayout = R2.layout.view_holder_header)
public class HeaderView extends LinearLayout {
....
}
```
This is not necessary if you don't use resources as annotation parameters, such as with [custom view models](https://github.com/airbnb/epoxy/wiki/Generating-Models-from-View-Annotations).
## Basic Usage
There are two main components of Epoxy:
1. The `EpoxyModel`s that describe how your views should be displayed in the RecyclerView.
2. The `EpoxyController` where the models are used to describe what items to show and with what data.
### Creating Models
Epoxy generates models for you based on your view or layout. Generated model classes are suffixed with an underscore (`_`) are used directly in your EpoxyController classes.
#### From Custom Views
Add the `@ModelView` annotation on a view class. Then, add a "prop" annotation on each setter method to mark it as a property for the model.
```java
@ModelView(autoLayout = Size.MATCH_WIDTH_WRAP_HEIGHT)
public class HeaderView extends LinearLayout {
... // Initialization omitted
@TextProp
public void setTitle(CharSequence text) {
titleView.setText(text);
}
}
```
A `HeaderViewModel_` is then generated in the same package.
[More Details](https://github.com/airbnb/epoxy/wiki/Generating-Models-from-View-Annotations)
#### From DataBinding
If you use Android DataBinding you can simply set up your xml layouts like normal:
```xml
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="title" type="String" />
</data>
<TextView
android:layout_width="120dp"
android:layout_height="40dp"
android:text="@{title}" />
</layout>
```
Then, create an interface or class in any package and add an `EpoxyDataBindingLayouts` annotation to declare your databinding layouts.
```java
package com.airbnb.epoxy.sample;
import com.airbnb.epoxy.EpoxyDataBindingLayouts;
@EpoxyDataBindingLayouts({R.layout.header_view, ... // other layouts })
interface EpoxyConfig {}
```
From this layout name Epoxy generates a `HeaderViewBindingModel_`.
[More Details](https://github.com/airbnb/epoxy/wiki/Data-Binding-Support)
#### From ViewHolders
If you use xml layouts without databinding you can create a model class to do the binding.
```java
@EpoxyModelClass(layout = R.layout.header_view)
public abstract class HeaderModel extends EpoxyModelWithHolder<Holder> {
@EpoxyAttribute String title;
@Override
public void bind(Holder holder) {
holder.header.setText(title);
}
static class Holder extends BaseEpoxyHolder {
@BindView(R.id.text) TextView header;
}
}
```
A `HeaderModel_` class is generated that subclasses HeaderModel and implements the model details.
[More Details](https://github.com/airbnb/epoxy/wiki/ViewHolder-Models)
### Using your models in a controller
A controller defines what items should be shown in the RecyclerView, by adding the corresponding models in the desired order.
The controller's `buildModels` method declares which items to show. You are responsible for calling `requestModelBuild` whenever your data changes, which triggers `buildModels` to run again. Epoxy tracks changes in the models and automatically binds and updates views.
As an example, our `PhotoController` shows a header, a list of photos, and a loader (if more photos are being loaded). The controller's `setData(photos, loadingMore)` method is called whenever photos are loaded, which triggers a call to `buildModels` so models representing the state of the new data can be built.
```java
public class PhotoController extends Typed2EpoxyController<List<Photo>, Boolean> {
@AutoModel HeaderModel_ headerModel;
@AutoModel LoaderModel_ loaderModel;
@Override
protected void buildModels(List<Photo> photos, Boolean loadingMore) {
headerModel
.title("My Photos")
.description("My album description!")
.addTo(this);
for (Photo photo : photos) {
new PhotoModel()
.id(photo.id())
.url(photo.url())
.addTo(this);
}
loaderModel
.addIf(loadingMore, this);
}
}
```
#### Or with Kotlin
An extension function is generated for each model so we can write this:
```kotlin
class PhotoController : Typed2EpoxyController<List<Photo>, Boolean>() {
override fun buildModels(photos: List<Photo>, loadingMore: Boolean) {
header {
id("header")
title("My Photos")
description("My album description!")
}
photos.forEach {
photoView {
id(it.id())
url(it.url())
}
}
if (loadingMore) loaderView { id("loader") }
}
}
```
### Integrating with RecyclerView
Get the backing adapter off the EpoxyController to set up your RecyclerView:
```java
MyController controller = new MyController();
recyclerView.setAdapter(controller.getAdapter());
// Request a model build whenever your data changes
controller.requestModelBuild();
// Or if you are using a TypedEpoxyController
controller.setData(myData);
```
If you are using the [EpoxyRecyclerView](https://github.com/airbnb/epoxy/wiki/EpoxyRecyclerView) integration is easier.
```java
epoxyRecyclerView.setControllerAndBuildModels(new MyController());
// Request a model build on the recyclerview when data changes
epoxyRecyclerView.requestModelBuild();
```
#### Kotlin
Or use [Kotlin Extensions](https://github.com/airbnb/epoxy/wiki/EpoxyRecyclerView#kotlin-extensions) to simplify further and remove the need for a controller class.
```kotlin
epoxyRecyclerView.withModels {
header {
id("header")
title("My Photos")
description("My album description!")
}
photos.forEach {
photoView {
id(it.id())
url(it.url())
}
}
if (loadingMore) loaderView { id("loader") }
}
}
```
### More Reading
And that's it! The controller's declarative style makes it very easy to visualize what the RecyclerView will look like, even when many different view types or items are used. Epoxy handles everything else. If a view only partially changes, such as the description, only that new value is set on the view, so the system is very efficient
Epoxy handles much more than these basics, and is highly configurable. See [the wiki](https://github.com/airbnb/epoxy/wiki) for in depth documentation.
## Documentation
See examples and browse complete documentation at the [Epoxy Wiki](https://github.com/airbnb/epoxy/wiki)
If you still have questions, feel free to create a new issue.
## Min SDK
We support a minimum SDK of 14. However, Epoxy is based on the v7 support libraries so it should work with lower versions if you care to override the min sdk level in the manifest.
## Contributing
Pull requests are welcome! We'd love help improving this library. Feel free to browse through open issues to look for things that need work. If you have a feature request or bug, please open a new issue so we can track it.
## License
```
Copyright 2016 Airbnb, Inc.
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: RELEASING.md
================================================
Releasing
========
1. Bump the VERSION_NAME property in `gradle.properties` based on Major.Minor.Patch naming scheme
2. Update `CHANGELOG.md` for the impending release.
3. `git commit -am "Prepare for release X.Y.Z."` (where X.Y.Z is the version you set in step 1)
4. Add your sonatype login information under gradle properties mavenCentralUsername and mavenCentralPassword in your local user gradle.properties file
5. Make sure you have a gpg signing key configured (https://vanniktech.github.io/gradle-maven-publish-plugin/central/#secrets)
5. Run `./gradlew publish` to build the artifacts and publish them to maven
7. Open PR on Github, merge, and publish release through Github UI.
Publishing a release to an internal repository
========
To publish an internal release to an Artifactory repository:
1. Set credential values for ARTIFACTORY_USERNAME and ARTIFACTORY_PASSWORD in your local gradle.properties
2. Set values for ARTIFACTORY_RELEASE_URL (and optionally ARTIFACTORY_SNAPSHOT_URL if you are publishing a snapshot)
3. ./gradlew publishAllPublicationsToAirbnbArtifactoryRepository -PdoNotSignRelease=true --no-configuration-cache
4. "-PdoNotSignRelease=true" is optional, but we don't need to sign artifactory releases and this allows everyone to publish without setting up a gpg key
If you need to publish to a different repository, look at the configuration in 'publishing.gradle'
to see how to configure additional repositories.
Maven Local Installation
=======================
If testing changes locally, you can install to mavenLocal via `./gradlew publishToMavenLocal`
================================================
FILE: UpdateProcessorTestResources.kt
================================================
#!/usr/bin/env kscript
@file:DependsOn("org.jsoup:jsoup:1.13.1")
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import java.io.File
fun main() {
val testResultHtmlRegex = Regex("/build/reports/tests/.*/classes/.*\\.html")
File(".")
.walk()
.filter { it.isFile }
.filter { it.path.contains(testResultHtmlRegex) }
.forEach { updateTestClass(it) }
}
fun updateTestClass(testReport: File) {
val doc: Document = Jsoup.parse(testReport, "UTF-8")
// Failing processor tests have their output in a <pre></pre> block
doc.getElementsByTag("pre")
.filter { element ->
// A failing block contains the text "Source declared the same top-level types of an expected source, but
// didn't match exactly."
element.text().contains("Source declared the same top-level types of an expected source")
}.map { it.text() }
.forEach { failingTestText ->
updateIndividualTest(failingTestText)
}
}
private fun updateIndividualTest(failingTestText: String) {
val expectedFile = expectedFileRegex
.find(failingTestText)
?.groupValues
?.getOrNull(1)
?.let { filePath ->
// The test copies the source file to the build folder. We need to modify the original file to update its expected source
File(
filePath.replace(
"/build/intermediates/sourceFolderJavaResources/debug/",
"/src/test/resources/"
)
)
}
?.takeIf { it.isFile }
?: error("Count not find expected file in $failingTestText")
// The error message includes the source code that was generated.
// Actual Source:
//=================
// [code here]
//
// javaSources was: [com.google.testing.compile.JavaFileObjects$ResourceSourceJavaFileObject[file:/Users/elihart/repos/epoxy/epoxy-modelfactorytest/build/intermediates/sourceFolderJavaResources/debug/GroupPropMultipleSupportedAttributeDifferentNameModelView.java]]
// at com.airbnb.epoxy.ProcessorTestUtils.assertGeneration(ProcessorTestUtils.kt:33)
// ...
val actualSource = failingTestText.substringAfter(
"""
Actual Source:
=================
""".trimIndent()
).substringBefore("javaSources was:")
.substringBefore("object was:")
expectedFile.writeText(actualSource)
println("Updated test source ${expectedFile.path.substringAfter("/epoxy/")}")
}
// We expect to see a line like:
// Expected file: </Users/elihart/repos/epoxy/epoxy-modelfactorytest/build/intermediates/sourceFolderJavaResources/debug/AllTypesModelViewModel_.java>
// Which tells us where the original processor test file lives
val expectedFileRegex = Regex("Expected file: <(.*)>")
================================================
FILE: blessedDeps.gradle
================================================
/**
* "Blessed" dependencies give us the ability to force a dependency(s) version to be consistent
* for packaging a library. In turn, this also allows the ability to retract the forced update
* based off build type/flavor which reduces regressions caused by conflicts.
*
* As an added bonus, we don't bloat our project build file by abstracting dependencies into its own
* gradle file, then applying it back in as necessary.
*/
rootProject.ext.TARGET_SDK_VERSION = 30
rootProject.ext.COMPILE_SDK_VERSION = 33
rootProject.ext.MIN_SDK_VERSION = 14
rootProject.ext.COMPOSE_MIN_SDK_VERSION = 21
rootProject.ext.PARIS_MIN_SDK_VERSION = 21
rootProject.ext.ANDROIDX_ANNOTATION = "1.5.0"
rootProject.ext.ANDROIDX_APPCOMPAT = "1.5.1"
rootProject.ext.ANDROIDX_CARDVIEW = "1.0.0"
rootProject.ext.ANDROIDX_CORE_KTX = "1.3.2"
rootProject.ext.ANDROIDX_DATABINDING_ADAPTERS = "3.2.1"
rootProject.ext.ANDROIDX_DATABINDING_COMPILER = "3.2.1"
rootProject.ext.ANDROIDX_DATABINDING_LIBRARY = "3.2.1"
rootProject.ext.ANDROIDX_ESPRESSO_CORE = "3.5.1"
rootProject.ext.ANDROIDX_FRAGMENT_TESTING = "1.3.3"
rootProject.ext.ANDROIDX_LEGACY = "1.0.0"
rootProject.ext.ANDROIDX_MATERIAL = "1.3.0"
rootProject.ext.ANDROIDX_PAGING = "2.0.0"
rootProject.ext.ANDROIDX_PAGING3 = "3.1.1"
rootProject.ext.ANDROIDX_RECYCLERVIEW = "1.3.0-rc01"
rootProject.ext.ANDROIDX_ROOM = "2.5.0-beta01"
rootProject.ext.ANDROIDX_RUNTIME = "2.3.1"
rootProject.ext.ANDROIDX_VERSIONED_PARCELABLE = "1.1.1"
rootProject.ext.ANDROID_ARCH_TESTING = "2.1.0"
rootProject.ext.ANDROID_DATA_BINDING = "1.3.1"
rootProject.ext.ANDROID_RUNTIME_VERSION = "4.1.1.4"
rootProject.ext.ANDROID_TEST_RUNNER = "1.5.2"
rootProject.ext.ANDROID_TEST_RULES = "1.5.0"
rootProject.ext.ASSERTJ_VERSION = "1.7.1"
rootProject.ext.AUTO_VALUE_VERSION = "1.7.4"
rootProject.ext.GLIDE_VERSION = "4.12.0"
rootProject.ext.GOOGLE_TESTING_COMPILE_VERSION = "0.23.0"
rootProject.ext.INCAP_VERSION = "0.3"
rootProject.ext.JUNIT_VERSION = "4.13.2"
rootProject.ext.KOTLIN_COROUTINES_VERSION = "1.6.4"
rootProject.ext.LOTTIE_VERSION = "2.8.0"
rootProject.ext.MOCKITO_VERSION = "5.20.0"
rootProject.ext.PARIS_VERSION = "2.2.1"
rootProject.ext.ROBOLECTRIC_VERSION = "4.9.2"
rootProject.ext.SQUARE_JAVAPOET_VERSION = "1.13.0"
rootProject.ext.SQUARE_KOTLINPOET_VERSION = "1.12.0"
rootProject.ext.COMPOSE_VERSION = "1.4.2"
rootProject.ext.COMPOSE_ACTIVITY_VERSION = "1.6.0"
rootProject.ext.KOTLINX_LIFECYCLE_RUNTIME_VERSION = "2.5.1"
rootProject.ext.XPROCESSING_VERSION = "2.8.4"
rootProject.ext.KOTLIN_TESTING_COMPILE_VERSION = '0.11.0'
rootProject.ext.LIFECYCLE_VIEWMODEL = '2.6.1'
rootProject.ext.deps = [
activityCompose : "androidx.activity:activity-compose:$COMPOSE_ACTIVITY_VERSION",
androidAnnotations : "androidx.annotation:annotation:$ANDROIDX_ANNOTATION",
androidAppcompat : "androidx.appcompat:appcompat:$ANDROIDX_APPCOMPAT",
androidArchCoreTesting : "androidx.arch.core:core-testing:$ANDROID_ARCH_TESTING",
androidCardView : "androidx.cardview:cardview:$ANDROIDX_CARDVIEW",
androidCoreKtx : "androidx.core:core-ktx:$ANDROIDX_CORE_KTX",
androidDesignLibrary : "com.google.android.material:material:$ANDROIDX_MATERIAL",
androidEspressoCore : "androidx.test.espresso:espresso-core:$ANDROIDX_ESPRESSO_CORE",
androidFragmentTesting : "androidx.fragment:fragment-testing:$ANDROIDX_FRAGMENT_TESTING",
androidLifecycleRuntimeKtx : "androidx.lifecycle:lifecycle-runtime-ktx:$KOTLINX_LIFECYCLE_RUNTIME_VERSION",
androidPaging3Component : "androidx.paging:paging-runtime:$ANDROIDX_PAGING3",
androidPagingComponent : "androidx.paging:paging-runtime:$ANDROIDX_PAGING",
androidRecyclerView : "androidx.recyclerview:recyclerview:$ANDROIDX_RECYCLERVIEW",
androidRuntime : "com.google.android:android:$ANDROID_RUNTIME_VERSION",
androidTestCore : "androidx.test:core:1.3.0",
androidTestExtJunitKtx : "androidx.test.ext:junit-ktx:1.1.2",
androidTestRules : "androidx.test:rules:$ANDROID_TEST_RULES",
androidTestRunner : "androidx.test:runner:$ANDROID_TEST_RUNNER",
assertj : "org.assertj:assertj-core:$ASSERTJ_VERSION",
autoValue : "com.google.auto.value:auto-value:$AUTO_VALUE_VERSION",
composeMaterial : "androidx.compose.material:material:$COMPOSE_VERSION",
composeUi : "androidx.compose.ui:ui:$COMPOSE_VERSION",
composeUiTooling : "androidx.compose.ui:ui-tooling:$COMPOSE_VERSION",
dataBindingAdapters : "androidx.databinding:databinding-adapters:$ANDROIDX_DATABINDING_ADAPTERS",
dataBindingLibrary : "androidx.databinding:databinding-library:$ANDROIDX_DATABINDING_LIBRARY",
glide : "com.github.bumptech.glide:glide:$GLIDE_VERSION",
googleTestingCompile : "com.google.testing.compile:compile-testing:$GOOGLE_TESTING_COMPILE_VERSION",
incapProcessor : "net.ltgt.gradle.incap:incap-processor:$INCAP_VERSION",
incapRuntime : "net.ltgt.gradle.incap:incap:$INCAP_VERSION",
junit : "junit:junit:$JUNIT_VERSION",
kotlinCoroutines : "org.jetbrains.kotlinx:kotlinx-coroutines-core:$KOTLIN_COROUTINES_VERSION",
kotlinCoroutinesTest : "org.jetbrains.kotlinx:kotlinx-coroutines-test:$KOTLIN_COROUTINES_VERSION",
kotlinxMetadata : "org.jetbrains.kotlin:kotlin-metadata-jvm:$KOTLIN_VERSION",
lottie : "com.airbnb.android:lottie:$LOTTIE_VERSION",
mockito : "org.mockito:mockito-core:$MOCKITO_VERSION",
paris : "com.airbnb.android:paris:$PARIS_VERSION",
parisProcessor : "com.airbnb.android:paris-processor:$PARIS_VERSION",
robolectric : "org.robolectric:robolectric:$ROBOLECTRIC_VERSION",
squareJavaPoet : "com.squareup:javapoet:$SQUARE_JAVAPOET_VERSION",
squareKotlinPoet : "com.squareup:kotlinpoet:$SQUARE_KOTLINPOET_VERSION",
kotlinPoetJavaInterop : "com.squareup:kotlinpoet-javapoet:$SQUARE_KOTLINPOET_VERSION",
kotlinPoetKspInterop : "com.squareup:kotlinpoet-ksp:$SQUARE_KOTLINPOET_VERSION",
versionedParcelable : "androidx.versionedparcelable:versionedparcelable:$ANDROIDX_VERSIONED_PARCELABLE",
ksp : "com.google.devtools.ksp:symbol-processing-api:$KSP_VERSION",
kspAaEmbeddable : "com.google.devtools.ksp:symbol-processing-aa-embeddable:$KSP_VERSION",
kspImpl : "com.google.devtools.ksp:symbol-processing:$KSP_VERSION",
xProcessing : "androidx.room:room-compiler-processing:$XPROCESSING_VERSION",
xProcessingTesting : "androidx.room:room-compiler-processing-testing:$XPROCESSING_VERSION",
kotlinCompileTesting : "dev.zacsweers.kctfork:ksp:$KOTLIN_TESTING_COMPILE_VERSION",
kotlinAnnotationProcessingEmbeddable: "org.jetbrains.kotlin:kotlin-annotation-processing-embeddable:$KOTLIN_VERSION",
lifecycleViewmodel : "androidx.lifecycle:lifecycle-viewmodel:$LIFECYCLE_VIEWMODEL",
lifecycleViewmodelKtx : "androidx.lifecycle:lifecycle-viewmodel-ktx:$LIFECYCLE_VIEWMODEL",
]
================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.KOTLIN_VERSION = "2.2.21"
ext.ANDROID_PLUGIN_VERSION = '8.13.0'
ext.KSP_VERSION = '2.3.3'
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
dependencies {
classpath "com.android.tools.build:gradle:$ANDROID_PLUGIN_VERSION"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION"
classpath "org.jetbrains.kotlin:compose-compiler-gradle-plugin:$KOTLIN_VERSION"
// Upload with: (see RELEASING.md)
// ./gradlew publishAllPublicationsToMavenCentral --no-configuration-cache
classpath 'com.vanniktech:gradle-maven-publish-plugin:0.35.0'
// Dokka is needed on classpath for vanniktech publish plugin
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.6.10"
}
}
plugins {
// Run ./gradlew dependencyUpdates to see available version updates
id 'com.github.ben-manes.versions' version '0.42.0'
id "com.google.devtools.ksp" version "$KSP_VERSION"
}
allprojects {
repositories {
google()
mavenCentral()
}
// Prevent javadoc task complaining about errors with kotlin files
tasks.withType(Javadoc) {
excludes = ['**/*.kt']
}
}
subprojects { project ->
apply from: "$rootDir/blessedDeps.gradle"
apply plugin: 'com.github.ben-manes.versions'
apply from: "${project.rootDir}/ktlint.gradle"
afterEvaluate {
if (project.tasks.findByName('check')) {
check.dependsOn('ktlint')
}
if (project.extensions.findByType(com.android.build.gradle.LibraryExtension.class) != null) {
project.android.libraryVariants.all { variant ->
def outputFolder = new File("build/generated/ksp/${variant.name}/kotlin")
variant.addJavaSourceFoldersToModel(outputFolder)
android.sourceSets.getAt(variant.name).java {
srcDir(outputFolder)
}
}
} else if (project.extensions.findByType(com.android.build.gradle.AbstractAppExtension.class) != null) {
project.android.applicationVariants.all { variant ->
def outputFolder = new File("build/generated/ksp/${variant.name}/kotlin")
variant.addJavaSourceFoldersToModel(outputFolder)
android.sourceSets.getAt(variant.name).java {
srcDir(outputFolder)
}
}
}
}
}
def isNonStable = { String version ->
def stableKeyword = ['RELEASE', 'FINAL', 'GA'].any { it -> version.uppercase().contains(it) }
def regex = /^[0-9,.v-]+(-r)?$/
return !stableKeyword && !(version ==~ regex)
}
tasks.named("dependencyUpdates").configure {
// disallow release candidates as upgradable versions from stable versions
rejectVersionIf {
isNonStable(it.candidate.version) && !isNonStable(it.currentVersion)
}
}
================================================
FILE: epoxy-adapter/.gitignore
================================================
/build
================================================
FILE: epoxy-adapter/build.gradle
================================================
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-parcelize'
apply from: '../publishing.gradle'
android {
namespace 'com.airbnb.viewmodeladapter'
defaultConfig {
compileSdk rootProject.COMPILE_SDK_VERSION
minSdkVersion rootProject.MIN_SDK_VERSION
targetSdkVersion rootProject.TARGET_SDK_VERSION
consumerProguardFiles 'proguard-rules.pro'
}
testOptions.unitTests.includeAndroidResources = true
buildTypes.all { buildType ->
buildType.javaCompileOptions.annotationProcessorOptions.arguments =
[
logEpoxyTimings: "true"
]
}
}
kotlin {
jvmToolchain(11)
}
configurations.all { strategy ->
strategy.resolutionStrategy.force rootProject.deps.androidAnnotations, rootProject.deps.androidRecyclerView,
rootProject.deps.androidDesignLibrary, rootProject.deps.androidAppcompat, rootProject.deps.junit,
rootProject.deps.robolectric, rootProject.deps.mockito
}
dependencies {
implementation rootProject.deps.androidAppcompat
implementation rootProject.deps.androidAnnotations
implementation rootProject.deps.androidRecyclerView
implementation rootProject.deps.androidDesignLibrary
api project(':epoxy-annotations')
kapt project(':epoxy-processor')
kaptTest project(':epoxy-processor')
testImplementation rootProject.deps.junit
testImplementation rootProject.deps.robolectric
testImplementation rootProject.deps.mockito
testImplementation rootProject.deps.androidTestCore
}
================================================
FILE: epoxy-adapter/gradle.properties
================================================
POM_NAME=Epoxy
POM_ARTIFACT_ID=epoxy
POM_PACKAGING=jar
================================================
FILE: epoxy-adapter/lint.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="InvalidPackage" severity="warning" />
<!-- https://code.google.com/p/android/issues/detail?id=175532 -->
<issue id="WrongConstant" severity="warning" />
<issue id="PluralsCandidate" severity="ignore" />
<issue id="Typos" severity="ignore" />
<issue id="InvalidPackage" severity="ignore" />
</lint>
================================================
FILE: epoxy-adapter/proguard-rules.pro
================================================
# The generated ControllerHelper classes are needed when using AutoModel annotations.
# Each ControllerHelper is looked up reflectively, so we need to make sure it is
# kept and its name not obfuscated so the reflective lookup works.
-keep class * extends com.airbnb.epoxy.EpoxyController { *; }
-keep class * extends com.airbnb.epoxy.ControllerHelper { *; }
-keepclasseswithmembernames class * { @com.airbnb.epoxy.AutoModel <fields>; }
================================================
FILE: epoxy-adapter/src/main/AndroidManifest.xml
================================================
<manifest>
<application />
</manifest>
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ActivityRecyclerPool.kt
================================================
package com.airbnb.epoxy
import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
import android.os.Build
import androidx.core.view.ViewCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.OnLifecycleEvent
import androidx.recyclerview.widget.RecyclerView
import java.lang.ref.WeakReference
import java.util.ArrayList
internal class ActivityRecyclerPool {
/**
* Store one unique pool per activity. They are cleared out when activities are destroyed, so this
* only needs to hold pools for active activities.
*/
private val pools = ArrayList<PoolReference>(5)
@JvmOverloads
fun getPool(
context: Context,
poolFactory: () -> RecyclerView.RecycledViewPool
): PoolReference {
val iterator = pools.iterator()
var poolToUse: PoolReference? = null
while (iterator.hasNext()) {
val poolReference = iterator.next()
when {
poolReference.context === context -> {
if (poolToUse != null) {
throw IllegalStateException("A pool was already found")
}
poolToUse = poolReference
// finish iterating to remove any old contexts
}
poolReference.context.isActivityDestroyed() -> {
// A pool from a different activity that was destroyed.
// Clear the pool references to allow the activity to be GC'd
poolReference.viewPool.clear()
iterator.remove()
}
}
}
if (poolToUse == null) {
poolToUse = PoolReference(context, poolFactory(), this)
context.lifecycle()?.addObserver(poolToUse)
pools.add(poolToUse)
}
return poolToUse
}
fun clearIfDestroyed(pool: PoolReference) {
if (pool.context.isActivityDestroyed()) {
pool.viewPool.clear()
pools.remove(pool)
}
}
private fun Context.lifecycle(): Lifecycle? {
if (this is LifecycleOwner) {
return lifecycle
}
if (this is ContextWrapper) {
return baseContext.lifecycle()
}
return null
}
}
internal class PoolReference(
context: Context,
val viewPool: RecyclerView.RecycledViewPool,
private val parent: ActivityRecyclerPool
) : LifecycleObserver {
private val contextReference: WeakReference<Context> = WeakReference(context)
val context: Context? get() = contextReference.get()
fun clearIfDestroyed() {
parent.clearIfDestroyed(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onContextDestroyed() {
clearIfDestroyed()
}
}
internal fun Context?.isActivityDestroyed(): Boolean {
if (this == null) {
return true
}
if (this !is Activity) {
return (this as? ContextWrapper)?.baseContext?.isActivityDestroyed() ?: false
}
if (isFinishing) {
return true
}
return if (Build.VERSION.SDK_INT >= 17) {
isDestroyed
} else {
// Use this as a proxy for being destroyed on older devices
!ViewCompat.isAttachedToWindow(window.decorView)
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/AsyncEpoxyController.java
================================================
package com.airbnb.epoxy;
import android.os.Handler;
import static com.airbnb.epoxy.EpoxyAsyncUtil.MAIN_THREAD_HANDLER;
import static com.airbnb.epoxy.EpoxyAsyncUtil.getAsyncBackgroundHandler;
/**
* A subclass of {@link EpoxyController} that makes it easy to do model building and diffing in
* the background.
* <p>
* See https://github.com/airbnb/epoxy/wiki/Epoxy-Controller#asynchronous-support
*/
public abstract class AsyncEpoxyController extends EpoxyController {
/**
* A new instance that does model building and diffing asynchronously.
*/
public AsyncEpoxyController() {
this(true);
}
/**
* @param enableAsync True to do model building and diffing asynchronously, false to do them
* both on the main thread.
*/
public AsyncEpoxyController(boolean enableAsync) {
this(enableAsync, enableAsync);
}
/**
* Individually control whether model building and diffing are done async or on the main thread.
*/
public AsyncEpoxyController(boolean enableAsyncModelBuilding, boolean enableAsyncDiffing) {
super(getHandler(enableAsyncModelBuilding), getHandler(enableAsyncDiffing));
}
private static Handler getHandler(boolean enableAsync) {
return enableAsync ? getAsyncBackgroundHandler() : MAIN_THREAD_HANDLER;
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/AsyncEpoxyDiffer.java
================================================
package com.airbnb.epoxy;
import android.os.Handler;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executor;
import androidx.annotation.AnyThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.DiffUtil.ItemCallback;
/**
* An adaptation of Google's {@link androidx.recyclerview.widget.AsyncListDiffer}
* that adds support for payloads in changes.
* <p>
* Also adds support for canceling an in progress diff, and makes everything thread safe.
*/
class AsyncEpoxyDiffer {
interface ResultCallback {
void onResult(@NonNull DiffResult result);
}
private final Executor executor;
private final ResultCallback resultCallback;
private final ItemCallback<EpoxyModel<?>> diffCallback;
private final GenerationTracker generationTracker = new GenerationTracker();
AsyncEpoxyDiffer(
@NonNull Handler handler,
@NonNull ResultCallback resultCallback,
@NonNull ItemCallback<EpoxyModel<?>> diffCallback
) {
this.executor = new HandlerExecutor(handler);
this.resultCallback = resultCallback;
this.diffCallback = diffCallback;
}
@Nullable
private volatile List<? extends EpoxyModel<?>> list;
/**
* Non-null, unmodifiable version of list.
* <p>
* Collections.emptyList when list is null, wrapped by Collections.unmodifiableList otherwise
*/
@NonNull
private volatile List<? extends EpoxyModel<?>> readOnlyList = Collections.emptyList();
/**
* Get the current List - any diffing to present this list has already been computed and
* dispatched via the ListUpdateCallback.
* <p>
* If a <code>null</code> List, or no List has been submitted, an empty list will be returned.
* <p>
* The returned list may not be mutated - mutations to content must be done through
* {@link #submitList(List)}.
*
* @return current List.
*/
@AnyThread
@NonNull
public List<? extends EpoxyModel<?>> getCurrentList() {
return readOnlyList;
}
/**
* Prevents any ongoing diff from dispatching results. Returns true if there was an ongoing
* diff to cancel, false otherwise.
*/
@SuppressWarnings("WeakerAccess")
@AnyThread
public boolean cancelDiff() {
return generationTracker.finishMaxGeneration();
}
/**
* @return True if a diff operation is in progress.
*/
@SuppressWarnings("WeakerAccess")
@AnyThread
public boolean isDiffInProgress() {
return generationTracker.hasUnfinishedGeneration();
}
/**
* Set the current list without performing any diffing. Cancels any diff in progress.
* <p>
* This can be used if you notified a change to the adapter manually and need this list to be
* synced.
*/
@AnyThread
public synchronized boolean forceListOverride(@Nullable List<EpoxyModel<?>> newList) {
// We need to make sure that generation changes and list updates are synchronized
final boolean interruptedDiff = cancelDiff();
int generation = generationTracker.incrementAndGetNextScheduled();
tryLatchList(newList, generation);
return interruptedDiff;
}
/**
* Set a new List representing your latest data.
* <p>
* A diff will be computed between this list and the last list set. If this has not previously
* been called then an empty list is used as the previous list.
* <p>
* The diff computation will be done on the thread given by the handler in the constructor.
* When the diff is done it will be applied (dispatched to the result callback),
* and the new List will be swapped in.
*/
@AnyThread
@SuppressWarnings("WeakerAccess")
public void submitList(@Nullable final List<? extends EpoxyModel<?>> newList) {
final int runGeneration;
@Nullable final List<? extends EpoxyModel<?>> previousList;
synchronized (this) {
// Incrementing generation means any currently-running diffs are discarded when they finish
// We synchronize to guarantee list object and generation number are in sync
runGeneration = generationTracker.incrementAndGetNextScheduled();
previousList = list;
}
if (newList == previousList) {
// nothing to do
onRunCompleted(runGeneration, newList, DiffResult.noOp(previousList));
return;
}
if (newList == null || newList.isEmpty()) {
// fast simple clear all
DiffResult result = null;
if (previousList != null && !previousList.isEmpty()) {
result = DiffResult.clear(previousList);
}
onRunCompleted(runGeneration, null, result);
return;
}
if (previousList == null || previousList.isEmpty()) {
// fast simple first insert
onRunCompleted(runGeneration, newList, DiffResult.inserted(newList));
return;
}
final DiffCallback wrappedCallback = new DiffCallback(previousList, newList, diffCallback);
executor.execute(new Runnable() {
@Override
public void run() {
DiffUtil.DiffResult result = DiffUtil.calculateDiff(wrappedCallback);
onRunCompleted(runGeneration, newList, DiffResult.diff(previousList, newList, result));
}
});
}
private void onRunCompleted(
final int runGeneration,
@Nullable final List<? extends EpoxyModel<?>> newList,
@Nullable final DiffResult result
) {
// We use an asynchronous handler so that the Runnable can be posted directly back to the main
// thread without waiting on view invalidation synchronization.
MainThreadExecutor.ASYNC_INSTANCE.execute(new Runnable() {
@Override
public void run() {
final boolean dispatchResult = tryLatchList(newList, runGeneration);
if (result != null && dispatchResult) {
resultCallback.onResult(result);
}
}
});
}
/**
* Marks the generation as done, and updates the list if the generation is the most recent.
*
* @return True if the given generation is the most recent, in which case the given list was
* set. False if the generation is old and the list was ignored.
*/
@AnyThread
private synchronized boolean tryLatchList(@Nullable List<? extends EpoxyModel<?>> newList,
int runGeneration) {
if (generationTracker.finishGeneration(runGeneration)) {
list = newList;
if (newList == null) {
readOnlyList = Collections.emptyList();
} else {
readOnlyList = Collections.unmodifiableList(newList);
}
return true;
}
return false;
}
/**
* The concept of a "generation" is used to associate a diff result with a point in time when
* it was created. This allows us to handle list updates concurrently, and ignore outdated diffs.
* <p>
* We track the highest start generation, and the highest finished generation, and these must
* be kept in sync, so all access to this class is synchronized.
* <p>
* The general synchronization strategy for this class is that when a generation number
* is queried that action must be synchronized with accessing the current list, so that the
* generation number is synced with the list state at the time it was created.
*/
private static class GenerationTracker {
// Max generation of currently scheduled runnable
private volatile int maxScheduledGeneration;
private volatile int maxFinishedGeneration;
synchronized int incrementAndGetNextScheduled() {
return ++maxScheduledGeneration;
}
synchronized boolean finishMaxGeneration() {
boolean isInterrupting = hasUnfinishedGeneration();
maxFinishedGeneration = maxScheduledGeneration;
return isInterrupting;
}
synchronized boolean hasUnfinishedGeneration() {
return maxScheduledGeneration > maxFinishedGeneration;
}
synchronized boolean finishGeneration(int runGeneration) {
boolean isLatestGeneration =
maxScheduledGeneration == runGeneration && runGeneration > maxFinishedGeneration;
if (isLatestGeneration) {
maxFinishedGeneration = runGeneration;
}
return isLatestGeneration;
}
}
private static class DiffCallback extends DiffUtil.Callback {
final List<? extends EpoxyModel<?>> oldList;
final List<? extends EpoxyModel<?>> newList;
private final ItemCallback<EpoxyModel<?>> diffCallback;
DiffCallback(List<? extends EpoxyModel<?>> oldList, List<? extends EpoxyModel<?>> newList,
ItemCallback<EpoxyModel<?>> diffCallback) {
this.oldList = oldList;
this.newList = newList;
this.diffCallback = diffCallback;
}
@Override
public int getOldListSize() {
return oldList.size();
}
@Override
public int getNewListSize() {
return newList.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return diffCallback.areItemsTheSame(
oldList.get(oldItemPosition),
newList.get(newItemPosition)
);
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return diffCallback.areContentsTheSame(
oldList.get(oldItemPosition),
newList.get(newItemPosition)
);
}
@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
return diffCallback.getChangePayload(
oldList.get(oldItemPosition),
newList.get(newItemPosition)
);
}
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/BaseEpoxyAdapter.java
================================================
package com.airbnb.epoxy;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import com.airbnb.epoxy.stickyheader.StickyHeaderCallbacks;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup;
import androidx.recyclerview.widget.RecyclerView;
public abstract class BaseEpoxyAdapter
extends RecyclerView.Adapter<EpoxyViewHolder>
implements StickyHeaderCallbacks {
private static final String SAVED_STATE_ARG_VIEW_HOLDERS = "saved_state_view_holders";
private int spanCount = 1;
private final ViewTypeManager viewTypeManager = new ViewTypeManager();
/**
* Keeps track of view holders that are currently bound so we can save their state in {@link
* #onSaveInstanceState(Bundle)}.
*/
private final BoundViewHolders boundViewHolders = new BoundViewHolders();
private ViewHolderState viewHolderState = new ViewHolderState();
private final SpanSizeLookup spanSizeLookup = new SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
try {
return getModelForPosition(position)
.spanSize(spanCount, position, getItemCount());
} catch (IndexOutOfBoundsException e) {
// There seems to be a GridLayoutManager bug where when the user is in accessibility mode
// it incorrectly uses an outdated view position
// when calling this method. This crashes when a view is animating out, when it is
// removed from the adapter but technically still added
// to the layout. We've posted a bug report and hopefully can update when the support
// library fixes this
// TODO: (eli_hart 8/23/16) Figure out if this has been fixed in new support library
onExceptionSwallowed(e);
return 1;
}
}
};
public BaseEpoxyAdapter() {
// Defaults to stable ids since view models generate unique ids. Set this to false in the
// subclass if you don't want to support it
setHasStableIds(true);
spanSizeLookup.setSpanIndexCacheEnabled(true);
}
/**
* This is called when recoverable exceptions happen at runtime. They can be ignored and Epoxy
* will recover, but you can override this to be aware of when they happen.
*/
protected void onExceptionSwallowed(RuntimeException exception) {
}
@Override
public int getItemCount() {
return getCurrentModels().size();
}
/** Return the models currently being used by the adapter to populate the recyclerview. */
abstract List<? extends EpoxyModel<?>> getCurrentModels();
public boolean isEmpty() {
return getCurrentModels().isEmpty();
}
@Override
public long getItemId(int position) {
// This does not call getModelForPosition so that we don't use the id of the empty model when
// hidden,
// so that the id stays constant when gone vs shown
return getCurrentModels().get(position).id();
}
@Override
public int getItemViewType(int position) {
return viewTypeManager.getViewTypeAndRememberModel(getModelForPosition(position));
}
@Override
public EpoxyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
EpoxyModel<?> model = viewTypeManager.getModelForViewType(this, viewType);
View view = model.buildView(parent);
return new EpoxyViewHolder(parent, view, model.shouldSaveViewState());
}
@Override
public void onBindViewHolder(EpoxyViewHolder holder, int position) {
onBindViewHolder(holder, position, Collections.emptyList());
}
@Override
public void onBindViewHolder(EpoxyViewHolder holder, int position, List<Object> payloads) {
EpoxyModel<?> modelToShow = getModelForPosition(position);
EpoxyModel<?> previouslyBoundModel = null;
if (diffPayloadsEnabled()) {
previouslyBoundModel = DiffPayload.getModelFromPayload(payloads, getItemId(position));
}
holder.bind(modelToShow, previouslyBoundModel, payloads, position);
if (payloads.isEmpty()) {
// We only apply saved state to the view on initial bind, not on model updates.
// Since view state should be independent of model props, we should not need to apply state
// again in this case. This simplifies a rebind on update
viewHolderState.restore(holder);
}
boundViewHolders.put(holder);
if (diffPayloadsEnabled()) {
onModelBound(holder, modelToShow, position, previouslyBoundModel);
} else {
onModelBound(holder, modelToShow, position, payloads);
}
}
boolean diffPayloadsEnabled() {
return false;
}
/**
* Called immediately after a model is bound to a view holder. Subclasses can override this if
* they want alerts on when a model is bound.
*/
protected void onModelBound(EpoxyViewHolder holder, EpoxyModel<?> model, int position,
@Nullable List<Object> payloads) {
onModelBound(holder, model, position);
}
void onModelBound(EpoxyViewHolder holder, EpoxyModel<?> model, int position,
@Nullable EpoxyModel<?> previouslyBoundModel) {
onModelBound(holder, model, position);
}
/**
* Called immediately after a model is bound to a view holder. Subclasses can override this if
* they want alerts on when a model is bound.
*/
protected void onModelBound(EpoxyViewHolder holder, EpoxyModel<?> model, int position) {
}
/**
* Returns an object that manages the view holders currently bound to the RecyclerView. This
* object is mainly used by the base Epoxy adapter to save view states, but you may find it useful
* to help access views or models currently shown in the RecyclerView.
*/
protected BoundViewHolders getBoundViewHolders() {
return boundViewHolders;
}
EpoxyModel<?> getModelForPosition(int position) {
return getCurrentModels().get(position);
}
@Override
public void onViewRecycled(EpoxyViewHolder holder) {
viewHolderState.save(holder);
boundViewHolders.remove(holder);
EpoxyModel<?> model = holder.getModel();
holder.unbind();
onModelUnbound(holder, model);
}
@CallSuper
@Override
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
// The last model is saved for optimization, but holding onto it can leak anything saved inside
// the model (like a click listener that references a Fragment). This is only needed during
// the viewholder creation phase, so it is safe to clear now.
viewTypeManager.lastModelForViewTypeLookup = null;
}
/**
* Called immediately after a model is unbound from a view holder. Subclasses can override this if
* they want alerts on when a model is unbound.
*/
protected void onModelUnbound(EpoxyViewHolder holder, EpoxyModel<?> model) {
}
@CallSuper
@Override
public boolean onFailedToRecycleView(EpoxyViewHolder holder) {
//noinspection unchecked,rawtypes
return ((EpoxyModel) holder.getModel()).onFailedToRecycleView(holder.objectToBind());
}
@CallSuper
@Override
public void onViewAttachedToWindow(EpoxyViewHolder holder) {
//noinspection unchecked,rawtypes
((EpoxyModel) holder.getModel()).onViewAttachedToWindow(holder.objectToBind());
}
@CallSuper
@Override
public void onViewDetachedFromWindow(EpoxyViewHolder holder) {
//noinspection unchecked,rawtypes
((EpoxyModel) holder.getModel()).onViewDetachedFromWindow(holder.objectToBind());
}
public void onSaveInstanceState(Bundle outState) {
// Save the state of currently bound views first so they are included. Views that were
// scrolled off and unbound will already have had
// their state saved.
for (EpoxyViewHolder holder : boundViewHolders) {
viewHolderState.save(holder);
}
if (viewHolderState.size() > 0 && !hasStableIds()) {
throw new IllegalStateException("Must have stable ids when saving view holder state");
}
outState.putParcelable(SAVED_STATE_ARG_VIEW_HOLDERS, viewHolderState);
}
public void onRestoreInstanceState(@Nullable Bundle inState) {
// To simplify things we enforce that state is restored before views are bound, otherwise it
// is more difficult to update view state once they are bound
if (boundViewHolders.size() > 0) {
throw new IllegalStateException(
"State cannot be restored once views have been bound. It should be done before adding "
+ "the adapter to the recycler view.");
}
if (inState != null) {
viewHolderState = inState.getParcelable(SAVED_STATE_ARG_VIEW_HOLDERS);
if (viewHolderState == null) {
throw new IllegalStateException(
"Tried to restore instance state, but onSaveInstanceState was never called.");
}
}
}
/**
* Finds the position of the given model in the list. Doesn't use indexOf to avoid unnecessary
* equals() calls since we're looking for the same object instance.
*
* @return The position of the given model in the current models list, or -1 if the model can't be
* found.
*/
protected int getModelPosition(EpoxyModel<?> model) {
int size = getCurrentModels().size();
for (int i = 0; i < size; i++) {
if (model == getCurrentModels().get(i)) {
return i;
}
}
return -1;
}
/**
* For use with a grid layout manager - use this to get the {@link SpanSizeLookup} for models in
* this adapter. This will delegate span look up calls to each model's {@link
* EpoxyModel#getSpanSize(int, int, int)}. Make sure to also call {@link #setSpanCount(int)} so
* the span count is correct.
*/
public SpanSizeLookup getSpanSizeLookup() {
return spanSizeLookup;
}
/**
* If you are using a grid layout manager you must call this to set the span count of the grid.
* This span count will be passed on to the models so models can choose what span count to be.
*
* @see #getSpanSizeLookup()
* @see EpoxyModel#getSpanSize(int, int, int)
*/
public void setSpanCount(int spanCount) {
this.spanCount = spanCount;
}
public int getSpanCount() {
return spanCount;
}
public boolean isMultiSpan() {
return spanCount > 1;
}
//region Sticky header
/**
* Optional callback to setup the sticky view,
* by default it doesn't do anything.
* <p>
* The sub-classes should override the function if they are
* using sticky header feature.
*/
@Override
public void setupStickyHeaderView(@NotNull View stickyHeader) {
// no-op
}
/**
* Optional callback to perform tear down operation on the
* sticky view, by default it doesn't do anything.
* <p>
* The sub-classes should override the function if they are
* using sticky header feature.
*/
@Override
public void teardownStickyHeaderView(@NotNull View stickyHeader) {
// no-op
}
/**
* Called to check if the item at the position is a sticky item,
* by default returns false.
* <p>
* The sub-classes should override the function if they are
* using sticky header feature.
*/
@Override
public boolean isStickyHeader(int position) {
return false;
}
//endregion
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/BaseEpoxyTouchCallback.java
================================================
package com.airbnb.epoxy;
import android.view.View;
interface BaseEpoxyTouchCallback<T extends EpoxyModel> {
/**
* Should return a composite flag which defines the enabled move directions in each state
* (idle, swiping, dragging) for the given model.
* <p>
* Return 0 to disable movement for the model.
*
* @param model The model being targeted for movement.
* @param adapterPosition The current adapter position of the targeted model
* @see androidx.recyclerview.widget.ItemTouchHelper.Callback#getMovementFlags
*/
int getMovementFlagsForModel(T model, int adapterPosition);
/**
* Called when the user interaction with a view is over and the view has
* completed its animation. This is a good place to clear all changes on the view that were done
* in other previous touch callbacks (such as on touch start, change, release, etc).
* <p>
* This is the last callback in the lifecycle of a touch event.
*
* @param model The model whose view is being cleared.
* @param itemView The view being cleared.
*/
void clearView(T model, View itemView);
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/BoundViewHolders.java
================================================
package com.airbnb.epoxy;
import java.util.Iterator;
import java.util.NoSuchElementException;
import androidx.annotation.Nullable;
import androidx.collection.LongSparseArray;
/** Helper class for keeping track of {@link EpoxyViewHolder}s that are currently bound. */
@SuppressWarnings("WeakerAccess")
public class BoundViewHolders implements Iterable<EpoxyViewHolder> {
private final LongSparseArray<EpoxyViewHolder> holders = new LongSparseArray<>();
@Nullable
public EpoxyViewHolder get(EpoxyViewHolder holder) {
return holders.get(holder.getItemId());
}
public void put(EpoxyViewHolder holder) {
holders.put(holder.getItemId(), holder);
}
public void remove(EpoxyViewHolder holder) {
holders.remove(holder.getItemId());
}
public int size() {
return holders.size();
}
@Override
public Iterator<EpoxyViewHolder> iterator() {
return new HolderIterator();
}
@Nullable
public EpoxyViewHolder getHolderForModel(EpoxyModel<?> model) {
return holders.get(model.id());
}
private class HolderIterator implements Iterator<EpoxyViewHolder> {
private int position = 0;
@Override
public boolean hasNext() {
return position < holders.size();
}
@Override
public EpoxyViewHolder next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return holders.valueAt(position++);
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/Carousel.java
================================================
package com.airbnb.epoxy;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import com.airbnb.epoxy.ModelView.Size;
import com.airbnb.viewmodeladapter.R;
import java.util.List;
import androidx.annotation.DimenRes;
import androidx.annotation.Dimension;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Px;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.SnapHelper;
/**
* <i>This feature is in Beta - please report bugs, feature requests, or other feedback at
* https://github.com/airbnb/epoxy by creating a new issue. Thanks!</i>
*
* <p>This is intended as a plug and play "Carousel" view - a Recyclerview with horizontal
* scrolling. It comes with common defaults and performance optimizations and can be either used as
* a top level RecyclerView, or nested within a vertical recyclerview.
*
* <p>This class provides:
*
* <p>1. Automatic integration with Epoxy. A {@link CarouselModel_} is generated from this class,
* which you can use in your EpoxyController. Just call {@link #setModels(List)} to provide the list
* of models to show in the carousel.
*
* <p>2. Default padding for carousel peeking, and an easy way to change this padding - {@link
* #setPaddingDp(int)}
*
* <p>3. Easily control how many items are shown on screen in the carousel at a time - {@link
* #setNumViewsToShowOnScreen(float)}
*
* <p>4. Easy snap support. By default a {@link LinearSnapHelper} is used, but you can set a global
* default for all Carousels with {@link #setDefaultGlobalSnapHelperFactory(SnapHelperFactory)}
*
* <p>5. All of the benefits of {@link EpoxyRecyclerView}
*
* <p>If you need further flexibility you can subclass this view to change its width, height,
* scrolling direction, etc. You can annotate a subclass with {@link ModelView} to generate a new
* EpoxyModel.
*/
@ModelView(saveViewState = true, autoLayout = Size.MATCH_WIDTH_WRAP_HEIGHT)
public class Carousel extends EpoxyRecyclerView {
public static final int NO_VALUE_SET = -1;
private static SnapHelperFactory defaultGlobalSnapHelperFactory =
new SnapHelperFactory() {
@Override
@NonNull
public SnapHelper buildSnapHelper(Context context) {
return new LinearSnapHelper();
}
};
@Dimension(unit = Dimension.DP)
private static int defaultSpacingBetweenItemsDp = 8;
private float numViewsToShowOnScreen;
public Carousel(Context context) {
super(context);
}
public Carousel(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public Carousel(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void init() {
super.init();
// When used as a model the padding can't be set via xml so we set it programmatically
int defaultSpacingDp = getDefaultSpacingBetweenItemsDp();
if (defaultSpacingDp >= 0) {
setItemSpacingDp(defaultSpacingDp);
if (getPaddingLeft() == 0
&& getPaddingRight() == 0
&& getPaddingTop() == 0
&& getPaddingBottom() == 0) {
// Use the item spacing as the default padding if no other padding has been set
setPaddingDp(defaultSpacingDp);
}
}
SnapHelperFactory snapHelperFactory = getSnapHelperFactory();
if (snapHelperFactory != null) {
snapHelperFactory.buildSnapHelper(getContext()).attachToRecyclerView(this);
}
// Carousels will be detached when their parent recyclerview is
setRemoveAdapterWhenDetachedFromWindow(false);
}
/**
* Return a {@link SnapHelperFactory} instance to use with this Carousel. The {@link SnapHelper}
* created by the factory will be attached to this Carousel on view creation. Return null for no
* snap helper to be attached automatically.
*/
@Nullable
protected SnapHelperFactory getSnapHelperFactory() {
return defaultGlobalSnapHelperFactory;
}
/**
* Set a {@link SnapHelperFactory} instance to use with all Carousels by default. The {@link
* SnapHelper} created by the factory will be attached to each Carousel on view creation. Set null
* for no snap helper to be attached automatically.
*
* <p>A Carousel subclass can implement {@link #getSnapHelperFactory()} to override the global
* default.
*/
public static void setDefaultGlobalSnapHelperFactory(@Nullable SnapHelperFactory factory) {
defaultGlobalSnapHelperFactory = factory;
}
@ModelProp
@Override
public void setHasFixedSize(boolean hasFixedSize) {
super.setHasFixedSize(hasFixedSize);
}
/**
* Set the number of views to show on screen in this carousel at a time, partial numbers are
* allowed.
*
* <p>This is useful where you want to easily control for the number of items on screen,
* regardless of screen size. For example, you could set this to 1.2f so that one view is shown in
* full and 20% of the next view "peeks" from the edge to indicate that there is more content to
* scroll to.
*
* <p>Another pattern is setting a different view count depending on whether the device is phone
* or tablet.
*
* <p>Additionally, if a LinearLayoutManager is used this value will be forwarded to {@link
* LinearLayoutManager#setInitialPrefetchItemCount(int)} as a performance optimization.
*
* <p>If you want to only change the prefetch count without changing the view size you can simply
* use {@link #setInitialPrefetchItemCount(int)}
*/
@ModelProp(group = "prefetch")
public void setNumViewsToShowOnScreen(float viewCount) {
numViewsToShowOnScreen = viewCount;
setInitialPrefetchItemCount((int) Math.ceil(viewCount));
}
/**
* @return The number of views to show on screen in this carousel at a time.
*/
public float getNumViewsToShowOnScreen() {
return numViewsToShowOnScreen;
}
/**
* If you are using a Linear or Grid layout manager you can use this to set the item prefetch
* count. Only use this if you are not using {@link #setNumViewsToShowOnScreen(float)}
*
* @see #setNumViewsToShowOnScreen(float)
* @see LinearLayoutManager#setInitialPrefetchItemCount(int)
*/
@ModelProp(group = "prefetch")
public void setInitialPrefetchItemCount(int numItemsToPrefetch) {
if (numItemsToPrefetch < 0) {
throw new IllegalStateException("numItemsToPrefetch must be greater than 0");
}
// Use the linearlayoutmanager default of 2 if the user did not specify one
int prefetchCount = numItemsToPrefetch == 0 ? 2 : numItemsToPrefetch;
LayoutManager layoutManager = getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
((LinearLayoutManager) layoutManager).setInitialPrefetchItemCount(prefetchCount);
}
}
@Override
public void onChildAttachedToWindow(View child) {
if (numViewsToShowOnScreen > 0) {
ViewGroup.LayoutParams childLayoutParams = child.getLayoutParams();
child.setTag(R.id.epoxy_recycler_view_child_initial_size_id, childLayoutParams.width);
int itemSpacingPx = getSpacingDecorator().getPxBetweenItems();
int spaceBetweenItems = 0;
if (itemSpacingPx > 0) {
// The item decoration space is not counted in the width of the view
spaceBetweenItems = (int) (itemSpacingPx * numViewsToShowOnScreen);
}
boolean isScrollingHorizontally = getLayoutManager().canScrollHorizontally();
int itemSizeInScrollingDirection =
(int)
((getSpaceForChildren(isScrollingHorizontally) - spaceBetweenItems)
/ numViewsToShowOnScreen);
if (isScrollingHorizontally) {
childLayoutParams.width = itemSizeInScrollingDirection;
} else {
childLayoutParams.height = itemSizeInScrollingDirection;
}
// We don't need to request layout because the layout manager will do that for us next
}
}
private int getSpaceForChildren(boolean horizontal) {
if (horizontal) {
return getTotalWidthPx(this)
- getPaddingLeft()
- (getClipToPadding() ? getPaddingRight() : 0);
// If child views will be showing through padding than we include just one side of padding
// since when the list is at position 0 only the child towards the end of the list will show
// through the padding.
} else {
return getTotalHeightPx(this)
- getPaddingTop()
- (getClipToPadding() ? getPaddingBottom() : 0);
}
}
@Px
private static int getTotalWidthPx(View view) {
if (view.getWidth() > 0) {
// Can only get a width if we are laid out
return view.getWidth();
}
if (view.getMeasuredWidth() > 0) {
return view.getMeasuredWidth();
}
// Fall back to assuming we want the full screen width
DisplayMetrics metrics = view.getContext().getResources().getDisplayMetrics();
return metrics.widthPixels;
}
@Px
private static int getTotalHeightPx(View view) {
if (view.getHeight() > 0) {
return view.getHeight();
}
if (view.getMeasuredHeight() > 0) {
return view.getMeasuredHeight();
}
// Fall back to assuming we want the full screen width
DisplayMetrics metrics = view.getContext().getResources().getDisplayMetrics();
return metrics.heightPixels;
}
@Override
public void onChildDetachedFromWindow(View child) {
// Restore the view width that existed before we modified it
Object initialWidth = child.getTag(R.id.epoxy_recycler_view_child_initial_size_id);
if (initialWidth instanceof Integer) {
ViewGroup.LayoutParams params = child.getLayoutParams();
params.width = (int) initialWidth;
child.setTag(R.id.epoxy_recycler_view_child_initial_size_id, null);
// No need to request layout since the view is unbound and not attached to window
}
}
/**
* Set a global default to use as the item spacing for all Carousels. Set to 0 for no item
* spacing.
*/
public static void setDefaultItemSpacingDp(@Dimension(unit = Dimension.DP) int dp) {
defaultSpacingBetweenItemsDp = dp;
}
/**
* Return the item spacing to use in this carousel, or 0 for no spacing.
*
* <p>By default this uses the global default set in {@link #setDefaultItemSpacingDp(int)}, but
* subclasses can override this to specify their own value.
*/
@Dimension(unit = Dimension.DP)
protected int getDefaultSpacingBetweenItemsDp() {
return defaultSpacingBetweenItemsDp;
}
/**
* Set a dimension resource to specify the padding value to use on each side of the carousel and
* in between carousel items.
*/
@ModelProp(group = "padding")
public void setPaddingRes(@DimenRes int paddingRes) {
int px = resToPx(paddingRes);
setPadding(px, px, px, px);
setItemSpacingPx(px);
}
/**
* Set a DP value to use as the padding on each side of the carousel and in between carousel
* items.
*
* <p>The default as the value returned by {@link #getDefaultSpacingBetweenItemsDp()}
*/
@ModelProp(defaultValue = "NO_VALUE_SET", group = "padding")
public void setPaddingDp(@Dimension(unit = Dimension.DP) int paddingDp) {
int px = dpToPx(paddingDp != NO_VALUE_SET ? paddingDp : getDefaultSpacingBetweenItemsDp());
setPadding(px, px, px, px);
setItemSpacingPx(px);
}
/**
* Use the {@link Padding} class to specify individual padding values for each side of the
* carousel, as well as item spacing.
*
* <p>A value of null will set all padding and item spacing to 0.
*/
@ModelProp(group = "padding")
public void setPadding(@Nullable Padding padding) {
if (padding == null) {
setPaddingDp(0);
} else if (padding.paddingType == Padding.PaddingType.PX) {
setPadding(padding.left, padding.top, padding.right, padding.bottom);
setItemSpacingPx(padding.itemSpacing);
} else if (padding.paddingType == Padding.PaddingType.DP) {
setPadding(
dpToPx(padding.left), dpToPx(padding.top), dpToPx(padding.right), dpToPx(padding.bottom));
setItemSpacingPx(dpToPx(padding.itemSpacing));
} else if (padding.paddingType == Padding.PaddingType.RESOURCE) {
setPadding(
resToPx(padding.left),
resToPx(padding.top),
resToPx(padding.right),
resToPx(padding.bottom));
setItemSpacingPx(resToPx(padding.itemSpacing));
}
}
/**
* Used to specify individual padding values programmatically.
*
* @see #setPadding(Padding)
*/
public static class Padding {
public final int left;
public final int top;
public final int right;
public final int bottom;
public final int itemSpacing;
public final PaddingType paddingType;
enum PaddingType {
PX,
DP,
RESOURCE
}
/**
* @param paddingRes Padding as dimension resource.
* @param itemSpacingRes Space as dimension resource to add between each carousel item. Will be
* implemented via an item decoration.
*/
public static Padding resource(@DimenRes int paddingRes, @DimenRes int itemSpacingRes) {
return new Padding(
paddingRes, paddingRes, paddingRes, paddingRes, itemSpacingRes, PaddingType.RESOURCE);
}
/**
* @param leftRes Left padding as dimension resource.
* @param topRes Top padding as dimension resource.
* @param rightRes Right padding as dimension resource.
* @param bottomRes Bottom padding as dimension resource.
* @param itemSpacingRes Space as dimension resource to add between each carousel item. Will be
* implemented via an item decoration.
*/
public static Padding resource(
@DimenRes int leftRes,
@DimenRes int topRes,
@DimenRes int rightRes,
@DimenRes int bottomRes,
@DimenRes int itemSpacingRes) {
return new Padding(
leftRes, topRes, rightRes, bottomRes, itemSpacingRes, PaddingType.RESOURCE);
}
/**
* @param paddingDp Padding in dp.
* @param itemSpacingDp Space in dp to add between each carousel item. Will be implemented via
* an item decoration.
*/
public static Padding dp(
@Dimension(unit = Dimension.DP) int paddingDp,
@Dimension(unit = Dimension.DP) int itemSpacingDp) {
return new Padding(paddingDp, paddingDp, paddingDp, paddingDp, itemSpacingDp, PaddingType.DP);
}
/**
* @param leftDp Left padding in dp.
* @param topDp Top padding in dp.
* @param rightDp Right padding in dp.
* @param bottomDp Bottom padding in dp.
* @param itemSpacingDp Space in dp to add between each carousel item. Will be implemented via
* an item decoration.
*/
public static Padding dp(
@Dimension(unit = Dimension.DP) int leftDp,
@Dimension(unit = Dimension.DP) int topDp,
@Dimension(unit = Dimension.DP) int rightDp,
@Dimension(unit = Dimension.DP) int bottomDp,
@Dimension(unit = Dimension.DP) int itemSpacingDp) {
return new Padding(leftDp, topDp, rightDp, bottomDp, itemSpacingDp, PaddingType.DP);
}
/**
* @param paddingPx Padding in pixels to add on all sides of the carousel
* @param itemSpacingPx Space in pixels to add between each carousel item. Will be implemented
* via an item decoration.
*/
public Padding(@Px int paddingPx, @Px int itemSpacingPx) {
this(paddingPx, paddingPx, paddingPx, paddingPx, itemSpacingPx, PaddingType.PX);
}
/**
* @param leftPx Left padding in pixels.
* @param topPx Top padding in pixels.
* @param rightPx Right padding in pixels.
* @param bottomPx Bottom padding in pixels.
* @param itemSpacingPx Space in pixels to add between each carousel item. Will be implemented
* via an item decoration.
*/
public Padding(
@Px int leftPx, @Px int topPx, @Px int rightPx, @Px int bottomPx, @Px int itemSpacingPx) {
this(leftPx, topPx, rightPx, bottomPx, itemSpacingPx, PaddingType.PX);
}
/**
* @param left Left padding.
* @param top Top padding.
* @param right Right padding.
* @param bottom Bottom padding.
* @param itemSpacing Space to add between each carousel item. Will be implemented via an item
* decoration.
* @param paddingType Unit / Type of the given paddings/ itemspacing.
*/
private Padding(
int left, int top, int right, int bottom, int itemSpacing, PaddingType paddingType) {
this.left = left;
this.top = top;
this.right = right;
this.bottom = bottom;
this.itemSpacing = itemSpacing;
this.paddingType = paddingType;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Padding padding = (Padding) o;
if (left != padding.left) {
return false;
}
if (top != padding.top) {
return false;
}
if (right != padding.right) {
return false;
}
if (bottom != padding.bottom) {
return false;
}
return itemSpacing == padding.itemSpacing;
}
@Override
public int hashCode() {
int result = left;
result = 31 * result + top;
result = 31 * result + right;
result = 31 * result + bottom;
result = 31 * result + itemSpacing;
return result;
}
}
@ModelProp
public void setModels(@NonNull List<? extends EpoxyModel<?>> models) {
super.setModels(models);
}
@OnViewRecycled
public void clear() {
super.clear();
}
/** Provide a SnapHelper implementation you want to use with a Carousel. */
public abstract static class SnapHelperFactory {
/**
* Create and return a new instance of a {@link androidx.recyclerview.widget.SnapHelper} for use
* with a Carousel.
*/
@NonNull
public abstract SnapHelper buildSnapHelper(Context context);
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ControllerHelper.java
================================================
package com.airbnb.epoxy;
import java.util.List;
/**
* A helper class for {@link EpoxyController} to handle {@link
* com.airbnb.epoxy.AutoModel} models. This is only implemented by the generated classes created the
* annotation processor.
*/
public abstract class ControllerHelper<T extends EpoxyController> {
public abstract void resetAutoModels();
protected void validateModelHashCodesHaveNotChanged(T controller) {
List<EpoxyModel<?>> currentModels = controller.getAdapter().getCopyOfModels();
for (int i = 0; i < currentModels.size(); i++) {
EpoxyModel model = currentModels.get(i);
model.validateStateHasNotChangedSinceAdded(
"Model has changed since it was added to the controller.", i);
}
}
protected void setControllerToStageTo(EpoxyModel<?> model, T controller) {
model.controllerToStageTo = controller;
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ControllerHelperLookup.java
================================================
package com.airbnb.epoxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedHashMap;
import java.util.Map;
import androidx.annotation.Nullable;
/**
* Looks up a generated {@link ControllerHelper} implementation for a given adapter.
* If the adapter has no {@link com.airbnb.epoxy.AutoModel} models then a No-Op implementation will
* be returned.
*/
class ControllerHelperLookup {
private static final String GENERATED_HELPER_CLASS_SUFFIX = "_EpoxyHelper";
private static final Map<Class<?>, Constructor<?>> BINDINGS = new LinkedHashMap<>();
private static final NoOpControllerHelper NO_OP_CONTROLLER_HELPER = new NoOpControllerHelper();
static ControllerHelper getHelperForController(EpoxyController controller) {
Constructor<?> constructor = findConstructorForClass(controller.getClass());
if (constructor == null) {
return NO_OP_CONTROLLER_HELPER;
}
try {
return (ControllerHelper) constructor.newInstance(controller);
} catch (IllegalAccessException e) {
throw new RuntimeException("Unable to invoke " + constructor, e);
} catch (InstantiationException e) {
throw new RuntimeException("Unable to invoke " + constructor, e);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
}
if (cause instanceof Error) {
throw (Error) cause;
}
throw new RuntimeException("Unable to get Epoxy helper class.", cause);
}
}
@Nullable
private static Constructor<?> findConstructorForClass(Class<?> controllerClass) {
Constructor<?> helperCtor = BINDINGS.get(controllerClass);
if (helperCtor != null || BINDINGS.containsKey(controllerClass)) {
return helperCtor;
}
String clsName = controllerClass.getName();
if (clsName.startsWith("android.") || clsName.startsWith("java.")) {
return null;
}
try {
Class<?> bindingClass = Class.forName(clsName + GENERATED_HELPER_CLASS_SUFFIX);
//noinspection unchecked
helperCtor = bindingClass.getConstructor(controllerClass);
} catch (ClassNotFoundException e) {
helperCtor = findConstructorForClass(controllerClass.getSuperclass());
} catch (NoSuchMethodException e) {
throw new RuntimeException("Unable to find Epoxy Helper constructor for " + clsName, e);
}
BINDINGS.put(controllerClass, helperCtor);
return helperCtor;
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ControllerModelList.java
================================================
package com.airbnb.epoxy;
/**
* This ArrayList subclass enforces that no changes are made to the list after {@link #freeze()} is
* called. This prevents model interceptors from storing the list and trying to change it later. We
* could copy the list before diffing, but that would waste memory to make the copy for every
* buildModels cycle, plus the interceptors could still try to modify the list and be confused about
* why it doesn't do anything.
*/
class ControllerModelList extends ModelList {
private static final ModelListObserver OBSERVER = new ModelListObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
throw new IllegalStateException(
"Models cannot be changed once they are added to the controller");
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
throw new IllegalStateException(
"Models cannot be changed once they are added to the controller");
}
};
ControllerModelList(int expectedModelCount) {
super(expectedModelCount);
pauseNotifications();
}
void freeze() {
setObserver(OBSERVER);
resumeNotifications();
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/DebugTimer.java
================================================
package com.airbnb.epoxy;
import android.util.Log;
class DebugTimer implements Timer {
private final String tag;
private long startTime;
private String sectionName;
DebugTimer(String tag) {
this.tag = tag;
reset();
}
private void reset() {
startTime = -1;
sectionName = null;
}
@Override
public void start(String sectionName) {
if (startTime != -1) {
throw new IllegalStateException("Timer was already started");
}
startTime = System.nanoTime();
this.sectionName = sectionName;
}
@Override
public void stop() {
if (startTime == -1) {
throw new IllegalStateException("Timer was not started");
}
float durationMs = (System.nanoTime() - startTime) / 1000000f;
Log.d(tag, String.format(sectionName + ": %.3fms", durationMs));
reset();
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/DiffHelper.java
================================================
package com.airbnb.epoxy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
/**
* Helper to track changes in the models list.
*/
class DiffHelper {
private ArrayList<ModelState> oldStateList = new ArrayList<>();
// Using a HashMap instead of a LongSparseArray to
// have faster look up times at the expense of memory
private Map<Long, ModelState> oldStateMap = new HashMap<>();
private ArrayList<ModelState> currentStateList = new ArrayList<>();
private Map<Long, ModelState> currentStateMap = new HashMap<>();
private final BaseEpoxyAdapter adapter;
private final boolean immutableModels;
DiffHelper(BaseEpoxyAdapter adapter, boolean immutableModels) {
this.adapter = adapter;
this.immutableModels = immutableModels;
adapter.registerAdapterDataObserver(observer);
}
private final RecyclerView.AdapterDataObserver observer = new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
throw new UnsupportedOperationException(
"Diffing is enabled. You should use notifyModelsChanged instead of notifyDataSetChanged");
}
@Override
public void onItemRangeChanged(int positionStart, int itemCount) {
for (int i = positionStart; i < positionStart + itemCount; i++) {
currentStateList.get(i).hashCode = adapter.getCurrentModels().get(i).hashCode();
}
}
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
if (itemCount == 0) {
// no-op
return;
}
if (itemCount == 1 || positionStart == currentStateList.size()) {
for (int i = positionStart; i < positionStart + itemCount; i++) {
currentStateList.add(i, createStateForPosition(i));
}
} else {
// Add in a batch since multiple insertions to the middle of the list are slow
List<ModelState> newModels = new ArrayList<>(itemCount);
for (int i = positionStart; i < positionStart + itemCount; i++) {
newModels.add(createStateForPosition(i));
}
currentStateList.addAll(positionStart, newModels);
}
// Update positions of affected items
int size = currentStateList.size();
for (int i = positionStart + itemCount; i < size; i++) {
currentStateList.get(i).position += itemCount;
}
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
if (itemCount == 0) {
// no-op
return;
}
List<ModelState> modelsToRemove =
currentStateList.subList(positionStart, positionStart + itemCount);
for (ModelState model : modelsToRemove) {
currentStateMap.remove(model.id);
}
modelsToRemove.clear();
// Update positions of affected items
int size = currentStateList.size();
for (int i = positionStart; i < size; i++) {
currentStateList.get(i).position -= itemCount;
}
}
@Override
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
if (fromPosition == toPosition) {
// no-op
return;
}
if (itemCount != 1) {
throw new IllegalArgumentException("Moving more than 1 item at a time is not "
+ "supported. Number of items moved: " + itemCount);
}
ModelState model = currentStateList.remove(fromPosition);
model.position = toPosition;
currentStateList.add(toPosition, model);
if (fromPosition < toPosition) {
// shift the affected items left
for (int i = fromPosition; i < toPosition; i++) {
currentStateList.get(i).position--;
}
} else {
// shift the affected items right
for (int i = toPosition + 1; i <= fromPosition; i++) {
currentStateList.get(i).position++;
}
}
}
};
/**
* Set the current list of models. The diff callbacks will be notified of the changes between the
* current list and the last list that was set.
*/
void notifyModelChanges() {
UpdateOpHelper updateOpHelper = new UpdateOpHelper();
buildDiff(updateOpHelper);
// Send out the proper notify calls for the diff. We remove our
// observer first so that we don't react to our own notify calls
adapter.unregisterAdapterDataObserver(observer);
notifyChanges(updateOpHelper);
adapter.registerAdapterDataObserver(observer);
}
private void notifyChanges(UpdateOpHelper opHelper) {
for (UpdateOp op : opHelper.opList) {
switch (op.type) {
case UpdateOp.ADD:
adapter.notifyItemRangeInserted(op.positionStart, op.itemCount);
break;
case UpdateOp.MOVE:
adapter.notifyItemMoved(op.positionStart, op.itemCount);
break;
case UpdateOp.REMOVE:
adapter.notifyItemRangeRemoved(op.positionStart, op.itemCount);
break;
case UpdateOp.UPDATE:
if (immutableModels && op.payloads != null) {
adapter.notifyItemRangeChanged(op.positionStart, op.itemCount,
new DiffPayload(op.payloads));
} else {
adapter.notifyItemRangeChanged(op.positionStart, op.itemCount);
}
break;
default:
throw new IllegalArgumentException("Unknown type: " + op.type);
}
}
}
/**
* Create a list of operations that define the difference between {@link #oldStateList} and {@link
* #currentStateList}.
*/
private UpdateOpHelper buildDiff(UpdateOpHelper updateOpHelper) {
prepareStateForDiff();
// The general approach is to first search for removals, then additions, and lastly changes.
// Focusing on one type of operation at a time makes it easy to coalesce batch changes.
// When we identify an operation and add it to the
// result list we update the positions of items in the oldStateList to reflect
// the change, this way subsequent operations will use the correct, updated positions.
collectRemovals(updateOpHelper);
// Only need to check for insertions if new list is bigger
boolean hasInsertions =
oldStateList.size() - updateOpHelper.getNumRemovals() != currentStateList.size();
if (hasInsertions) {
collectInsertions(updateOpHelper);
}
collectMoves(updateOpHelper);
collectChanges(updateOpHelper);
resetOldState();
return updateOpHelper;
}
private void resetOldState() {
oldStateList.clear();
oldStateMap.clear();
}
private void prepareStateForDiff() {
// We use a list of the models as well as a map by their id,
// so we can easily find them by both position and id
oldStateList.clear();
oldStateMap.clear();
// Swap the two lists so that we have a copy of the current state to calculate the next diff
ArrayList<ModelState> tempList = oldStateList;
oldStateList = currentStateList;
currentStateList = tempList;
Map<Long, ModelState> tempMap = oldStateMap;
oldStateMap = currentStateMap;
currentStateMap = tempMap;
// Remove all pairings in the old states so we can tell which of them were removed. The items
// that still exist in the new list will be paired when we build the current list state below
for (ModelState modelState : oldStateList) {
modelState.pair = null;
}
int modelCount = adapter.getCurrentModels().size();
currentStateList.ensureCapacity(modelCount);
for (int i = 0; i < modelCount; i++) {
currentStateList.add(createStateForPosition(i));
}
}
private ModelState createStateForPosition(int position) {
EpoxyModel<?> model = adapter.getCurrentModels().get(position);
model.addedToAdapter = true;
ModelState state = ModelState.build(model, position, immutableModels);
ModelState previousValue = currentStateMap.put(state.id, state);
if (previousValue != null) {
int previousPosition = previousValue.position;
EpoxyModel<?> previousModel = adapter.getCurrentModels().get(previousPosition);
throw new IllegalStateException("Two models have the same ID. ID's must be unique!"
+ " Model at position " + position + ": " + model
+ " Model at position " + previousPosition + ": " + previousModel);
}
return state;
}
/**
* Find all removal operations and add them to the result list. The general strategy here is to
* walk through the {@link #oldStateList} and check for items that don't exist in the new list.
* Walking through it in order makes it easy to batch adjacent removals.
*/
private void collectRemovals(UpdateOpHelper helper) {
for (ModelState state : oldStateList) {
// Update the position of the item to take into account previous removals,
// so that future operations will reference the correct position
state.position -= helper.getNumRemovals();
// This is our first time going through the list, so we
// look up the item with the matching id in the new
// list and hold a reference to it so that we can access it quickly in the future
state.pair = currentStateMap.get(state.id);
if (state.pair != null) {
state.pair.pair = state;
continue;
}
helper.remove(state.position);
}
}
/**
* Find all insertion operations and add them to the result list. The general strategy here is to
* walk through the {@link #currentStateList} and check for items that don't exist in the old
* list. Walking through it in order makes it easy to batch adjacent insertions.
*/
private void collectInsertions(UpdateOpHelper helper) {
Iterator<ModelState> oldItemIterator = oldStateList.iterator();
for (ModelState itemToInsert : currentStateList) {
if (itemToInsert.pair != null) {
// Update the position of the next item in the old list to take any insertions into account
ModelState nextOldItem = getNextItemWithPair(oldItemIterator);
if (nextOldItem != null) {
nextOldItem.position += helper.getNumInsertions();
}
continue;
}
helper.add(itemToInsert.position);
}
}
/**
* Check if any items have had their values changed, batching if possible.
*/
private void collectChanges(UpdateOpHelper helper) {
for (ModelState newItem : currentStateList) {
ModelState previousItem = newItem.pair;
if (previousItem == null) {
continue;
}
// We use equals when we know the models are immutable and available, otherwise we have to
// rely on the stored hashCode
boolean modelChanged;
if (immutableModels) {
// Make sure that the old model hasn't changed, otherwise comparing it with the new one
// won't be accurate.
if (previousItem.model.isDebugValidationEnabled()) {
previousItem.model
.validateStateHasNotChangedSinceAdded("Model was changed before it could be diffed.",
previousItem.position);
}
modelChanged = !previousItem.model.equals(newItem.model);
} else {
modelChanged = previousItem.hashCode != newItem.hashCode;
}
if (modelChanged) {
helper.update(newItem.position, previousItem.model);
}
}
}
/**
* Check which items have had a position changed. Recyclerview does not support batching these.
*/
private void collectMoves(UpdateOpHelper helper) {
// This walks through both the new and old list simultaneous and checks for position changes.
Iterator<ModelState> oldItemIterator = oldStateList.iterator();
ModelState nextOldItem = null;
for (ModelState newItem : currentStateList) {
if (newItem.pair == null) {
// This item was inserted. However, insertions are done at the item's final position, and
// aren't smart about inserting at a different position to take future moves into account.
// As the old state list is updated to reflect moves, it needs to also consider insertions
// affected by those moves in order for the final change set to be correct
if (helper.moves.isEmpty()) {
// There have been no moves, so the item is still at it's correct position
continue;
} else {
// There have been moves, so the old list needs to take this inserted item
// into account. The old list doesn't have this item inserted into it
// (for optimization purposes), but we can create a pair for this item to
// track its position in the old list and move it back to its final position if necessary
newItem.pairWithSelf();
}
}
// We could iterate through only the new list and move each
// item that is out of place, however in cases such as moving the first item
// to the end, that strategy would do many moves to move all
// items up one instead of doing one move to move the first item to the end.
// To avoid this we compare the old item to the new item at
// each index and move the one that is farthest from its correct position.
// We only move on from a new item once its pair is placed in
// the correct spot. Since we move from start to end, all new items we've
// already iterated through are guaranteed to have their pair
// be already in the right spot, which won't be affected by future MOVEs.
if (nextOldItem == null) {
nextOldItem = getNextItemWithPair(oldItemIterator);
// We've already iterated through all old items and moved each
// item once. However, subsequent moves may have shifted an item out of
// its correct space once it was already moved. We finish
// iterating through all the new items to ensure everything is still correct
if (nextOldItem == null) {
nextOldItem = newItem.pair;
}
}
while (nextOldItem != null) {
// Make sure the positions are updated to the latest
// move operations before we calculate the next move
updateItemPosition(newItem.pair, helper.moves);
updateItemPosition(nextOldItem, helper.moves);
// The item is the same and its already in the correct place
if (newItem.id == nextOldItem.id && newItem.position == nextOldItem.position) {
nextOldItem = null;
break;
}
int newItemDistance = newItem.pair.position - newItem.position;
int oldItemDistance = nextOldItem.pair.position - nextOldItem.position;
// Both items are already in the correct position
if (newItemDistance == 0 && oldItemDistance == 0) {
nextOldItem = null;
break;
}
if (oldItemDistance > newItemDistance) {
helper.move(nextOldItem.position, nextOldItem.pair.position);
nextOldItem.position = nextOldItem.pair.position;
nextOldItem.lastMoveOp = helper.getNumMoves();
nextOldItem = getNextItemWithPair(oldItemIterator);
} else {
helper.move(newItem.pair.position, newItem.position);
newItem.pair.position = newItem.position;
newItem.pair.lastMoveOp = helper.getNumMoves();
break;
}
}
}
}
/**
* Apply the movement operations to the given item to update its position. Only applies the
* operations that have not been applied yet, and stores how many operations have been applied so
* we know which ones to apply next time.
*/
private void updateItemPosition(ModelState item, List<UpdateOp> moveOps) {
int size = moveOps.size();
for (int i = item.lastMoveOp; i < size; i++) {
UpdateOp moveOp = moveOps.get(i);
int fromPosition = moveOp.positionStart;
int toPosition = moveOp.itemCount;
if (item.position > fromPosition && item.position <= toPosition) {
item.position--;
} else if (item.position < fromPosition && item.position >= toPosition) {
item.position++;
}
}
item.lastMoveOp = size;
}
/**
* Gets the next item in the list that has a pair, meaning it wasn't inserted or removed.
*/
@Nullable
private ModelState getNextItemWithPair(Iterator<ModelState> iterator) {
ModelState nextItem = null;
while (nextItem == null && iterator.hasNext()) {
nextItem = iterator.next();
if (nextItem.pair == null) {
// Skip this one and go on to the next
nextItem = null;
}
}
return nextItem;
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/DiffPayload.java
================================================
package com.airbnb.epoxy;
import java.util.Collections;
import java.util.List;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.collection.LongSparseArray;
/**
* A helper class for tracking changed models found by the {@link com.airbnb.epoxy.DiffHelper} to
* be included as a payload in the
* {@link androidx.recyclerview.widget.RecyclerView.Adapter#notifyItemChanged(int, Object)}
* call.
*/
public class DiffPayload {
private final EpoxyModel<?> singleModel;
private final LongSparseArray<EpoxyModel<?>> modelsById;
DiffPayload(List<? extends EpoxyModel<?>> models) {
if (models.isEmpty()) {
throw new IllegalStateException("Models must not be empty");
}
int modelCount = models.size();
if (modelCount == 1) {
// Optimize for the common case of only one model changed.
singleModel = models.get(0);
modelsById = null;
} else {
singleModel = null;
modelsById = new LongSparseArray<>(modelCount);
for (EpoxyModel<?> model : models) {
modelsById.put(model.id(), model);
}
}
}
public DiffPayload(EpoxyModel<?> changedItem) {
this(Collections.singletonList(changedItem));
}
/**
* Looks through the payloads list and returns the first model found with the given model id. This
* assumes that the payloads list will only contain objects of type {@link DiffPayload}, and will
* throw if an unexpected type is found.
*/
@Nullable
public static EpoxyModel<?> getModelFromPayload(List<Object> payloads, long modelId) {
if (payloads.isEmpty()) {
return null;
}
for (Object payload : payloads) {
DiffPayload diffPayload = (DiffPayload) payload;
if (diffPayload.singleModel != null) {
if (diffPayload.singleModel.id() == modelId) {
return diffPayload.singleModel;
}
} else {
EpoxyModel<?> modelForId = diffPayload.modelsById.get(modelId);
if (modelForId != null) {
return modelForId;
}
}
}
return null;
}
@VisibleForTesting
boolean equalsForTesting(DiffPayload that) {
if (singleModel != null) {
return that.singleModel == singleModel;
}
int thisSize = modelsById.size();
int thatSize = that.modelsById.size();
if (thisSize != thatSize) {
return false;
}
for (int i = 0; i < thisSize; i++) {
long thisKey = modelsById.keyAt(i);
long thatKey = that.modelsById.keyAt(i);
if (thisKey != thatKey) {
return false;
}
EpoxyModel<?> thisModel = modelsById.valueAt(i);
EpoxyModel<?> thatModel = that.modelsById.valueAt(i);
if (thisModel != thatModel) {
return false;
}
}
return true;
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/DiffResult.java
================================================
package com.airbnb.epoxy;
import java.util.Collections;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.AdapterListUpdateCallback;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView.Adapter;
/**
* Wraps the result of {@link AsyncEpoxyDiffer#submitList(List)}.
*/
public class DiffResult {
@NonNull final List<? extends EpoxyModel<?>> previousModels;
@NonNull final List<? extends EpoxyModel<?>> newModels;
/**
* If this is non null it means the full differ ran and the result is contained
* in this object. If it is null, it means that either the old list or the new list was empty, so
* we can simply add all or clear all items and skipped running the full diffing.
*/
@Nullable final DiffUtil.DiffResult differResult;
/** No changes were made to the models. */
static DiffResult noOp(@Nullable List<? extends EpoxyModel<?>> models) {
if (models == null) {
models = Collections.emptyList();
}
return new DiffResult(models, models, null);
}
/** The previous list was empty and the given non empty list was inserted. */
static DiffResult inserted(@NonNull List<? extends EpoxyModel<?>> newModels) {
//noinspection unchecked
return new DiffResult(Collections.EMPTY_LIST, newModels, null);
}
/** The previous list was non empty and the new list is empty. */
static DiffResult clear(@NonNull List<? extends EpoxyModel<?>> previousModels) {
//noinspection unchecked
return new DiffResult(previousModels, Collections.EMPTY_LIST, null);
}
/**
* The previous and new models are both non empty and a full differ pass was run on them.
* There may be no changes, however.
*/
static DiffResult diff(
@NonNull List<? extends EpoxyModel<?>> previousModels,
@NonNull List<? extends EpoxyModel<?>> newModels,
@NonNull DiffUtil.DiffResult differResult
) {
return new DiffResult(previousModels, newModels, differResult);
}
private DiffResult(
@NonNull List<? extends EpoxyModel<?>> previousModels,
@NonNull List<? extends EpoxyModel<?>> newModels,
@Nullable DiffUtil.DiffResult differResult
) {
this.previousModels = previousModels;
this.newModels = newModels;
this.differResult = differResult;
}
public void dispatchTo(Adapter adapter) {
dispatchTo(new AdapterListUpdateCallback(adapter));
}
public void dispatchTo(ListUpdateCallback callback) {
if (differResult != null) {
differResult.dispatchUpdatesTo(callback);
} else if (newModels.isEmpty() && !previousModels.isEmpty()) {
callback.onRemoved(0, previousModels.size());
} else if (!newModels.isEmpty() && previousModels.isEmpty()) {
callback.onInserted(0, newModels.size());
}
// Else nothing changed!
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyAdapter.java
================================================
package com.airbnb.epoxy;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import androidx.annotation.Nullable;
/**
* Allows you to easily combine different view types in the same adapter, and handles view holder
* creation, binding, and ids for you. Subclasses just need to add their desired {@link EpoxyModel}
* objects and the rest is done automatically.
* <p/>
* {@link androidx.recyclerview.widget.RecyclerView.Adapter#setHasStableIds(boolean)} is set to true
* by default, since {@link EpoxyModel} makes it easy to support unique ids. If you don't want to
* support this then disable it in your base class (not recommended).
*/
@SuppressWarnings("WeakerAccess")
public abstract class EpoxyAdapter extends BaseEpoxyAdapter {
private final HiddenEpoxyModel hiddenModel = new HiddenEpoxyModel();
/**
* Subclasses should modify this list as necessary with the models they want to show. Subclasses
* are responsible for notifying data changes whenever this list is changed.
*/
protected final List<EpoxyModel<?>> models = new ModelList();
private DiffHelper diffHelper;
@Override
List<EpoxyModel<?>> getCurrentModels() {
return models;
}
/**
* Enables support for automatically notifying model changes via {@link #notifyModelsChanged()}.
* If used, this should be called in the constructor, before any models are changed.
*
* @see #notifyModelsChanged()
*/
protected void enableDiffing() {
if (diffHelper != null) {
throw new IllegalStateException("Diffing was already enabled");
}
if (!models.isEmpty()) {
throw new IllegalStateException("You must enable diffing before modifying models");
}
if (!hasStableIds()) {
throw new IllegalStateException("You must have stable ids to use diffing");
}
diffHelper = new DiffHelper(this, false);
}
@Override
EpoxyModel<?> getModelForPosition(int position) {
EpoxyModel<?> model = models.get(position);
return model.isShown() ? model : hiddenModel;
}
/**
* Intelligently notify item changes by comparing the current {@link #models} list against the
* previous so you don't have to micromanage notification calls yourself. This may be
* prohibitively slow for large model lists (in the hundreds), in which case consider doing
* notification calls yourself. If you use this, all your view models must implement {@link
* EpoxyModel#hashCode()} and {@link EpoxyModel#equals(Object)} to completely identify their
* state, so that changes to a model's content can be detected. Before using this you must enable
* it with {@link #enableDiffing()}, since keeping track of the model state adds extra computation
* time to all other data change notifications.
*
* @see #enableDiffing()
*/
protected void notifyModelsChanged() {
if (diffHelper == null) {
throw new IllegalStateException("You must enable diffing before notifying models changed");
}
diffHelper.notifyModelChanges();
}
/**
* Notify that the given model has had its data changed. It should only be called if the model
* retained the same position.
*/
protected void notifyModelChanged(EpoxyModel<?> model) {
notifyModelChanged(model, null);
}
/**
* Notify that the given model has had its data changed. It should only be called if the model
* retained the same position.
*/
protected void notifyModelChanged(EpoxyModel<?> model, @Nullable Object payload) {
int index = getModelPosition(model);
if (index != -1) {
notifyItemChanged(index, payload);
}
}
/**
* Adds the model to the end of the {@link #models} list and notifies that the item was inserted.
*/
protected void addModel(EpoxyModel<?> modelToAdd) {
int initialSize = models.size();
pauseModelListNotifications();
models.add(modelToAdd);
resumeModelListNotifications();
notifyItemRangeInserted(initialSize, 1);
}
/**
* Adds the models to the end of the {@link #models} list and notifies that the items were
* inserted.
*/
protected void addModels(EpoxyModel<?>... modelsToAdd) {
int initialSize = models.size();
int numModelsToAdd = modelsToAdd.length;
((ModelList) models).ensureCapacity(initialSize + numModelsToAdd);
pauseModelListNotifications();
Collections.addAll(models, modelsToAdd);
resumeModelListNotifications();
notifyItemRangeInserted(initialSize, numModelsToAdd);
}
/**
* Adds the models to the end of the {@link #models} list and notifies that the items were
* inserted.
*/
protected void addModels(Collection<? extends EpoxyModel<?>> modelsToAdd) {
int initialSize = models.size();
pauseModelListNotifications();
models.addAll(modelsToAdd);
resumeModelListNotifications();
notifyItemRangeInserted(initialSize, modelsToAdd.size());
}
/**
* Inserts the given model before the other in the {@link #models} list, and notifies that the
* item was inserted.
*/
protected void insertModelBefore(EpoxyModel<?> modelToInsert, EpoxyModel<?> modelToInsertBefore) {
int targetIndex = getModelPosition(modelToInsertBefore);
if (targetIndex == -1) {
throw new IllegalStateException("Model is not added: " + modelToInsertBefore);
}
pauseModelListNotifications();
models.add(targetIndex, modelToInsert);
resumeModelListNotifications();
notifyItemInserted(targetIndex);
}
/**
* Inserts the given model after the other in the {@link #models} list, and notifies that the item
* was inserted.
*/
protected void insertModelAfter(EpoxyModel<?> modelToInsert, EpoxyModel<?> modelToInsertAfter) {
int modelIndex = getModelPosition(modelToInsertAfter);
if (modelIndex == -1) {
throw new IllegalStateException("Model is not added: " + modelToInsertAfter);
}
int targetIndex = modelIndex + 1;
pauseModelListNotifications();
models.add(targetIndex, modelToInsert);
resumeModelListNotifications();
notifyItemInserted(targetIndex);
}
/**
* If the given model exists it is removed and an item removal is notified. Otherwise this does
* nothing.
*/
protected void removeModel(EpoxyModel<?> model) {
int index = getModelPosition(model);
if (index != -1) {
pauseModelListNotifications();
models.remove(index);
resumeModelListNotifications();
notifyItemRemoved(index);
}
}
/**
* Removes all models
*/
protected void removeAllModels() {
int numModelsRemoved = models.size();
pauseModelListNotifications();
models.clear();
resumeModelListNotifications();
notifyItemRangeRemoved(0, numModelsRemoved);
}
/**
* Removes all models after the given model, which must have already been added. An example use
* case is you want to keep a header but clear everything else, like in the case of refreshing
* data.
*/
protected void removeAllAfterModel(EpoxyModel<?> model) {
List<EpoxyModel<?>> modelsToRemove = getAllModelsAfter(model);
int numModelsRemoved = modelsToRemove.size();
int initialModelCount = models.size();
// This is a sublist, so clearing it will clear the models in the original list
pauseModelListNotifications();
modelsToRemove.clear();
resumeModelListNotifications();
notifyItemRangeRemoved(initialModelCount - numModelsRemoved, numModelsRemoved);
}
/**
* Sets the visibility of the given model, and notifies that the item changed if the new
* visibility is different from the previous.
*
* @param model The model to show. It should already be added to the {@link #models} list.
* @param show True to show the model, false to hide it.
*/
protected void showModel(EpoxyModel<?> model, boolean show) {
if (model.isShown() == show) {
return;
}
model.show(show);
notifyModelChanged(model);
}
/**
* Shows the given model, and notifies that the item changed if the item wasn't already shown.
*
* @param model The model to show. It should already be added to the {@link #models} list.
*/
protected void showModel(EpoxyModel<?> model) {
showModel(model, true);
}
/**
* Shows the given models, and notifies that each item changed if the item wasn't already shown.
*
* @param models The models to show. They should already be added to the {@link #models} list.
*/
protected void showModels(EpoxyModel<?>... models) {
showModels(Arrays.asList(models));
}
/**
* Sets the visibility of the given models, and notifies that the items changed if the new
* visibility is different from the previous.
*
* @param models The models to show. They should already be added to the {@link #models} list.
* @param show True to show the models, false to hide them.
*/
protected void showModels(boolean show, EpoxyModel<?>... models) {
showModels(Arrays.asList(models), show);
}
/**
* Shows the given models, and notifies that each item changed if the item wasn't already shown.
*
* @param models The models to show. They should already be added to the {@link #models} list.
*/
protected void showModels(Iterable<EpoxyModel<?>> models) {
showModels(models, true);
}
/**
* Sets the visibility of the given models, and notifies that the items changed if the new
* visibility is different from the previous.
*
* @param models The models to show. They should already be added to the {@link #models} list.
* @param show True to show the models, false to hide them.
*/
protected void showModels(Iterable<EpoxyModel<?>> models, boolean show) {
for (EpoxyModel<?> model : models) {
showModel(model, show);
}
}
/**
* Hides the given model, and notifies that the item changed if the item wasn't already hidden.
*
* @param model The model to hide. This should already be added to the {@link #models} list.
*/
protected void hideModel(EpoxyModel<?> model) {
showModel(model, false);
}
/**
* Hides the given models, and notifies that each item changed if the item wasn't already hidden.
*
* @param models The models to hide. They should already be added to the {@link #models} list.
*/
protected void hideModels(Iterable<EpoxyModel<?>> models) {
showModels(models, false);
}
/**
* Hides the given models, and notifies that each item changed if the item wasn't already hidden.
*
* @param models The models to hide. They should already be added to the {@link #models} list.
*/
protected void hideModels(EpoxyModel<?>... models) {
hideModels(Arrays.asList(models));
}
/**
* Hides all models currently located after the given model in the {@link #models} list.
*
* @param model The model after which to hide. It must exist in the {@link #models} list.
*/
protected void hideAllAfterModel(EpoxyModel<?> model) {
hideModels(getAllModelsAfter(model));
}
/**
* Returns a sub list of all items in {@link #models} that occur after the given model. This list
* is backed by the original models list, any changes to the returned list will be reflected in
* the original {@link #models} list.
*
* @param model Must exist in {@link #models}.
*/
protected List<EpoxyModel<?>> getAllModelsAfter(EpoxyModel<?> model) {
int index = getModelPosition(model);
if (index == -1) {
throw new IllegalStateException("Model is not added: " + model);
}
return models.subList(index + 1, models.size());
}
/**
* We pause the list's notifications when we modify models internally, since we already do the
* proper adapter notifications for those modifications. By pausing these list notifications we
* prevent the differ having to do work to track them.
*/
private void pauseModelListNotifications() {
((ModelList) models).pauseNotifications();
}
private void resumeModelListNotifications() {
((ModelList) models).resumeNotifications();
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyAsyncUtil.java
================================================
package com.airbnb.epoxy;
import android.os.Build;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import androidx.annotation.MainThread;
/**
* Various helpers for running Epoxy operations off the main thread.
*/
public final class EpoxyAsyncUtil {
private EpoxyAsyncUtil() {
}
/**
* A Handler class that uses the main thread's Looper.
*/
public static final Handler MAIN_THREAD_HANDLER =
createHandler(Looper.getMainLooper(), false);
/**
* A Handler class that uses the main thread's Looper. Additionally, this handler calls
* {@link Message#setAsynchronous(boolean)} for
* each {@link Message} that is sent to it or {@link Runnable} that is posted to it
*/
public static final Handler AYSNC_MAIN_THREAD_HANDLER =
createHandler(Looper.getMainLooper(), true);
private static Handler asyncBackgroundHandler;
/**
* A Handler class that uses a separate background thread dedicated to Epoxy. Additionally,
* this handler calls {@link Message#setAsynchronous(boolean)} for
* each {@link Message} that is sent to it or {@link Runnable} that is posted to it
*/
@MainThread
public static Handler getAsyncBackgroundHandler() {
// This is initialized lazily so we don't create the thread unless it will be used.
// It isn't synchronized so it should only be accessed on the main thread.
if (asyncBackgroundHandler == null) {
asyncBackgroundHandler = createHandler(buildBackgroundLooper("epoxy"), true);
}
return asyncBackgroundHandler;
}
/**
* Create a Handler with the given Looper
*
* @param async If true the Handler will calls {@link Message#setAsynchronous(boolean)} for
* each {@link Message} that is sent to it or {@link Runnable} that is posted to it.
*/
public static Handler createHandler(Looper looper, boolean async) {
if (!async) {
return new Handler(looper);
}
// Standard way of exposing async handler on older api's from the support library
// https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/core
// /src/main/java/androidx/core/os/HandlerCompat.java#51
if (Build.VERSION.SDK_INT >= 28) {
return Handler.createAsync(looper);
}
if (Build.VERSION.SDK_INT >= 16) {
try {
//noinspection JavaReflectionMemberAccess
return Handler.class.getDeclaredConstructor(Looper.class, Callback.class, boolean.class)
.newInstance(looper, null, true);
} catch (Throwable ignored) {
}
}
return new Handler(looper);
}
/**
* Create a new looper that runs on a new background thread.
*/
public static Looper buildBackgroundLooper(String threadName) {
HandlerThread handlerThread = new HandlerThread(threadName);
handlerThread.start();
return handlerThread.getLooper();
}
}
================================================
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyController.java
================================================
package com.airbnb.epoxy;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import com.airbnb.epoxy.stickyheader.StickyHeaderCallbacks;
import org.jetbrains.annotations.NotNull;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup;
import static com.airbnb.epoxy.ControllerHelperLookup.getHelperForController;
/**
* A controller for easily combining {@link EpoxyModel} instances in a {@link RecyclerView.Adapter}.
* Simply implement {@link #buildModels()} to declare which models should be used, and in which
* order. Call {@link #requestModelBuild()} whenever your data changes, and the controller will call
* {@link #buildModels()}, update the adapter with the new models, and notify any changes between
* the new and old models.
* <p>
* The controller maintains a {@link androidx.recyclerview.widget.RecyclerView.Adapter} with the
* latest models, which you can get via {@link #getAdapter()} to set on your RecyclerView.
* <p>
* All data change notifications are applied automatically via Epoxy's diffing algorithm. All of
* your models must have a unique id set on them for diffing to work. You may choose to use {@link
* AutoModel} annotations to have the controller create models with unique ids for you
* automatically.
* <p>
* Once a model is created and added to the controller in {@link #buildModels()} it should be
* treated as immutable and never modified again. This is necessary for adapter updates to be
* accurate.
*/
public abstract class EpoxyController implements ModelCollector, StickyHeaderCallbacks {
/**
* We check that the adapter is not connected to multiple recyclerviews, but when a fragment has
* its view quickly destroyed and recreated it may temporarily attach the same adapter to the
* previous view and the new view (eg because of fragment transitions) if the controller is reused
* across views. We want to allow this case since it is a brief transient state. This should be
* enough time for screen transitions to happen.
*/
private static final int DELAY_TO_CHECK_ADAPTER_COUNT_MS = 3000;
private static final Timer NO_OP_TIMER = new NoOpTimer();
public static Handler defaultModelBuildingHandler = MainThreadExecutor.INSTANCE.handler;
public static Handler defaultDiffingHandler = MainThreadExecutor.INSTANCE.handler;
private static boolean filterDuplicatesDefault = false;
private static boolean globalDebugLoggingEnabled = false;
private final EpoxyControllerAdapter adapter;
private EpoxyDiffLogger debugObserver;
private int recyclerViewAttachCount = 0;
private final Handler modelBuildHandler;
/**
* This is iterated over in the build models thread, but items can be inserted or removed from
* other threads at any time.
*/
private final List<Interceptor> interceptors = new CopyOnWriteArrayList<>();
// Volatile because -> write only on main thread, read from builder thread
private volatile boolean filterDuplicates = filterDuplicatesDefault;
/**
* This is used to track whether we are currently building models. If it is non null it means
* a thread is in the building models method. We store the thread so we can know which one
* is building models.
* <p>
* Volatile because -> write only on handler, read from any thread
*/
private volatile Thread threadBuildingModels = null;
/**
* Used to know that we should build models synchronously the first time.
* <p>
* Volatile because -> written from the build models thread, read from the main thread.
*/
private volatile boolean hasBuiltModelsEver;
//////////////////////////////////////////////////////////////////////////////////////////
/*
* These fields are expected to only be used on the model building thread so they are not
* synchronized.
*/
/** Used to time operations and log their duration when in debug mode. */
private Timer timer = NO_OP_TIMER;
private final ControllerHelper helper = getHelperForController(this);
private ControllerModelList modelsBeingBuilt;
private List<ModelInterceptorCallback> modelInterceptorCallbacks;
private EpoxyModel<?> stagedModel;
//////////////////////////////////////////////////////////////////////////////////////////
public EpoxyController() {
this(defaultModelBuildingHandler, defaultDiffingHandler);
}
public EpoxyController(Handler modelBuildingHandler, Handler diffingHandler) {
adapter = new EpoxyControllerAdapter(this, diffingHandler);
modelBuildHandler = modelBuildingHandler;
setDebugLoggingEnabled(globalDebugLoggingEnabled);
}
/**
* Posting and canceling runnables is a bit expensive - it is synchronizes and iterates the
* list of runnables. We want clients to be able to request model builds as often as they want and
* have it act as a no-op if one is already requested, without being a performance hit. To do that
* we track whether we have a call to build models posted already so we can avoid canceling a
* current call and posting it again.
*/
@RequestedModelBuildType private volatile int requestedModelBuildType =
RequestedModelBuildType.NONE;
@Retention(RetentionPolicy.SOURCE)
@IntDef({RequestedModelBuildType.NONE,
RequestedModelBuildType.NEXT_FRAME,
RequestedModelBuildType.DELAYED})
private @interface RequestedModelBuildType {
int NONE = 0;
/** A request has been made to build models immediately. It is posted. */
int NEXT_FRAME = 1;
/** A request has been made to build models after a delay. It is post delayed. */
int DELAYED = 2;
}
/**
* Call this to request a model update. The controller will schedule a call to {@link
* #buildModels()} so that models can be rebuilt for the current data. Once a build is requested
* all subsequent requests are ignored until the model build runs. Therefore, the calling code
* need not worry about calling this multiple times in a row.
* <p>
* The exception is that the first time this is called on a new instance of {@link
* EpoxyController} it is run synchronously. This allows state to be restored and the initial view
* to be draw quicker.
* <p>
* If you would like to be alerted when models have finished building use
* {@link #addModelBuildListener(OnModelBuildFinishedListener)}
*/
public void requestModelBuild() {
if (isBuildingModels()) {
throw new IllegalEpoxyUsage("Cannot call `requestModelBuild` from inside `buildModels`");
}
// If it is the first time building models then we do it right away, otherwise we post the call.
// We want to do it right away the first time so that scroll position can be restored correctly,
// shared element transitions aren't delayed, and content is shown asap. We post later calls
// so that they are debounced, and so any updates to data can be completely finished before
// the models are built.
if (hasBuiltModelsEver) {
requestDelayedModelBuild(0);
} else {
buildModelsRunnable.run();
}
}
/**
* Whether an update to models is currently pending. This can either be because
* {@link #requestModelBuild()} was called, or because models are currently being built or diff
* on a background thread.
*/
public boolean hasPendingModelBuild() {
return requestedModelBuildType != RequestedModelBuildType.NONE // model build is posted
|| threadBuildingModels != null // model build is in progress
|| adapter.isDiffInProgress(); // Diff in progress
}
/**
* Add a listener that will be called every time {@link #buildModels()} has finished running
* and changes have been dispatched to the RecyclerView.
* <p>
* Since buildModels can be called once for many calls to {@link #requestModelBuild()}, this is
* called just once for each buildModels execution, not for every request.
* <p>
* Use this to react to changes in your models that need to happen after the RecyclerView has
* been notified, such as scrolling.
*/
public void addModelBuildListener(OnModelBuildFinishedListener listener) {
adapter.addModelBuildListener(listener);
}
/**
* Remove a listener added with {@link #addModelBuildListener(OnModelBuildFinishedListener)}.
* This is safe to call from inside the callback
* {@link OnModelBuildFinishedListener#onModelBuildFinished(DiffResult)}
*/
public void removeModelBuildListener(OnModelBuildFinishedListener listener) {
adapter.removeModelBuildListener(listener);
}
/**
* Call this to request a delayed model update. The controller will schedule a call to {@link
* #buildModels()} so that models can be rebuilt for the current data.
* <p>
* Using this to delay a model update may be helpful in cases where user input is causing many
* rapid changes in the models, such as typing. In that case, the view is already updated on
* screen and constantly rebuilding models is potentially slow and unnecessary. The downside to
* delaying the model build too long is that models will not be in sync with the data or view, and
* scrolling the view offscreen and back onscreen will cause the model to bind old data.
* <p>
* If a previous request is still pending it will be removed in favor of this new delay
* <p>
* Any call to {@link #requestModelBuild()} will override a delayed request.
* <p>
* In most cases you should use {@link #requestModelBuild()} instead of this.
*
* @param delayMs The time in milliseconds to delay the model build by. Should be greater than or
* equal to 0. A value of 0 is equivalent to calling {@link #requestModelBuild()}
*/
public synchronized void requestDelayedModelBuild(int delayMs) {
if (isBuildingModels()) {
throw new IllegalEpoxyUsage(
"Cannot call `requestDelayedModelBuild` from inside `buildModels`");
}
if (requestedModelBuildType == RequestedModelBuildType.DELAYED) {
cancelPendingModelBuild();
} else if (requestedModelBuildType == RequestedModelBuildType.NEXT_FRAME) {
return;
}
requestedModelBuildType =
delayMs == 0 ? RequestedModelBuildType.NEXT_FRAME : RequestedModelBuildType.DELAYED;
modelBuildHandler.postDelayed(buildModelsRunnable, delayMs);
}
/**
* Cancels a pending call to {@link #buildModels()} if one has been queued by {@link
* #requestModelBuild()}.
*/
public synchronized void cancelPendingModelBuild() {
// Access to requestedModelBuildType is synchronized because the model building thread clears
// it when model building starts, and the main thread needs to set it to indicate a build
// request.
// Additionally, it is crucial to guarantee that the state of requestedModelBuildType is in sync
// with the modelBuildHandler, otherwise we could end up in a state where we think a model build
// is queued, but it isn't, and model building never happens - stuck forever.
if (requestedModelBuildType != RequestedModelBuildType.NONE) {
requestedModelBuildType = RequestedModelBuildType.NONE;
modelBuildHandler.removeCallbacks(buildModelsRunnable);
}
}
private final Runnable buildModelsRunnable = new Runnable() {
@Override
public void run() {
// Do this first to m
gitextract_6mir2ezo/ ├── .github/ │ └── workflows/ │ └── build_test.yml ├── .gitignore ├── .idea/ │ └── codeStyleSettings.xml ├── CHANGELOG.md ├── CONTRIBUTING.MD ├── LICENSE ├── README.md ├── RELEASING.md ├── UpdateProcessorTestResources.kt ├── blessedDeps.gradle ├── build.gradle ├── epoxy-adapter/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── lint.xml │ ├── proguard-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── airbnb/ │ │ │ └── epoxy/ │ │ │ ├── ActivityRecyclerPool.kt │ │ │ ├── AsyncEpoxyController.java │ │ │ ├── AsyncEpoxyDiffer.java │ │ │ ├── BaseEpoxyAdapter.java │ │ │ ├── BaseEpoxyTouchCallback.java │ │ │ ├── BoundViewHolders.java │ │ │ ├── Carousel.java │ │ │ ├── ControllerHelper.java │ │ │ ├── ControllerHelperLookup.java │ │ │ ├── ControllerModelList.java │ │ │ ├── DebugTimer.java │ │ │ ├── DiffHelper.java │ │ │ ├── DiffPayload.java │ │ │ ├── DiffResult.java │ │ │ ├── EpoxyAdapter.java │ │ │ ├── EpoxyAsyncUtil.java │ │ │ ├── EpoxyController.java │ │ │ ├── EpoxyControllerAdapter.java │ │ │ ├── EpoxyDiffLogger.java │ │ │ ├── EpoxyDragCallback.java │ │ │ ├── EpoxyHolder.java │ │ │ ├── EpoxyItemSpacingDecorator.java │ │ │ ├── EpoxyModel.java │ │ │ ├── EpoxyModelGroup.java │ │ │ ├── EpoxyModelTouchCallback.java │ │ │ ├── EpoxyModelWithHolder.java │ │ │ ├── EpoxyModelWithView.java │ │ │ ├── EpoxyRecyclerView.kt │ │ │ ├── EpoxySwipeCallback.java │ │ │ ├── EpoxyTouchHelper.java │ │ │ ├── EpoxyTouchHelperCallback.kt │ │ │ ├── EpoxyViewHolder.java │ │ │ ├── EpoxyVisibilityItem.kt │ │ │ ├── EpoxyVisibilityTracker.kt │ │ │ ├── GeneratedModel.java │ │ │ ├── GroupModel.kt │ │ │ ├── HandlerExecutor.java │ │ │ ├── HiddenEpoxyModel.java │ │ │ ├── IdUtils.java │ │ │ ├── IllegalEpoxyUsage.java │ │ │ ├── ImmutableModelException.java │ │ │ ├── InternalExposer.kt │ │ │ ├── ListenersUtils.java │ │ │ ├── MainThreadExecutor.java │ │ │ ├── ModelCollector.kt │ │ │ ├── ModelGroupHolder.kt │ │ │ ├── ModelList.java │ │ │ ├── ModelState.java │ │ │ ├── NoOpControllerHelper.java │ │ │ ├── NoOpTimer.java │ │ │ ├── NotifyBlocker.java │ │ │ ├── OnModelBoundListener.java │ │ │ ├── OnModelBuildFinishedListener.java │ │ │ ├── OnModelCheckedChangeListener.java │ │ │ ├── OnModelClickListener.java │ │ │ ├── OnModelLongClickListener.java │ │ │ ├── OnModelUnboundListener.java │ │ │ ├── OnModelVisibilityChangedListener.java │ │ │ ├── OnModelVisibilityStateChangedListener.java │ │ │ ├── QuantityStringResAttribute.java │ │ │ ├── SimpleEpoxyAdapter.java │ │ │ ├── SimpleEpoxyController.java │ │ │ ├── SimpleEpoxyModel.java │ │ │ ├── StringAttributeData.java │ │ │ ├── StyleBuilderCallback.java │ │ │ ├── Timer.java │ │ │ ├── Typed2EpoxyController.java │ │ │ ├── Typed3EpoxyController.java │ │ │ ├── Typed4EpoxyController.java │ │ │ ├── TypedEpoxyController.java │ │ │ ├── UnboundedViewPool.kt │ │ │ ├── UpdateOp.java │ │ │ ├── UpdateOpHelper.java │ │ │ ├── ViewHolderState.java │ │ │ ├── ViewTypeManager.java │ │ │ ├── VisibilityState.java │ │ │ ├── WrappedEpoxyModelCheckedChangeListener.java │ │ │ ├── WrappedEpoxyModelClickListener.kt │ │ │ ├── preload/ │ │ │ │ ├── EpoxyModelPreloader.kt │ │ │ │ ├── EpoxyPreloader.kt │ │ │ │ ├── PreloadTargetProvider.kt │ │ │ │ ├── Preloadable.kt │ │ │ │ ├── PreloadableViewDataProvider.kt │ │ │ │ └── PreloaderExtensions.kt │ │ │ ├── stickyheader/ │ │ │ │ ├── StickyHeaderCallbacks.kt │ │ │ │ └── StickyHeaderLinearLayoutManager.kt │ │ │ └── utils/ │ │ │ └── utils.kt │ │ └── res/ │ │ ├── layout/ │ │ │ └── view_holder_empty_view.xml │ │ └── values/ │ │ ├── attrs.xml │ │ └── ids.xml │ └── test/ │ └── java/ │ └── com/ │ └── airbnb/ │ └── epoxy/ │ ├── DiffPayloadTest.java │ ├── DifferCorrectnessTest.java │ ├── DifferNotifyTest.java │ ├── EpoxyAdapterTest.java │ ├── EpoxyControllerTest.java │ ├── EpoxyModelGroupTest.kt │ ├── EpoxyRecyclerViewTest.kt │ ├── EpoxyViewHolderTest.kt │ ├── EpoxyVisibilityTrackerNestedTest.kt │ ├── EpoxyVisibilityTrackerTest.kt │ ├── InsertedModel.java │ ├── ModelListTest.java │ ├── ModelTestUtils.java │ ├── TestAdapter.java │ ├── TestModel.java │ ├── TestObserver.java │ ├── TypedEpoxyControllerTest.java │ ├── UnboundedViewPoolTests.kt │ ├── UpdateOpHelperTest.java │ ├── ViewTypeManagerIntegrationTest.java │ └── test/ │ └── CarouselTest.java ├── epoxy-annotations/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── airbnb/ │ └── epoxy/ │ ├── AfterPropsSet.java │ ├── AutoModel.java │ ├── CallbackProp.java │ ├── EpoxyAttribute.java │ ├── EpoxyBuildScope.kt │ ├── EpoxyDataBindingLayouts.java │ ├── EpoxyDataBindingPattern.java │ ├── EpoxyModelClass.java │ ├── ModelProp.java │ ├── ModelView.java │ ├── OnViewRecycled.java │ ├── OnVisibilityChanged.java │ ├── OnVisibilityStateChanged.java │ ├── PackageEpoxyConfig.java │ ├── PackageModelViewConfig.java │ └── TextProp.java ├── epoxy-compose/ │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── com/ │ └── airbnb/ │ └── epoxy/ │ └── ComposeInterop.kt ├── epoxy-composeinterop-maverickssample/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ └── composeinterop/ │ │ └── maverickssample/ │ │ └── MultiKeyComposeInteropFragmentTest.kt │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ └── composeinterop/ │ │ └── maverickssample/ │ │ ├── ComposeInteropListFragmnet.kt │ │ ├── MainActivity.kt │ │ ├── MultiKeyComposeInteropFragment.kt │ │ ├── SampleApplication.kt │ │ └── epoxyviews/ │ │ └── HeaderView.kt │ └── res/ │ ├── drawable/ │ │ └── ic_launcher_background.xml │ ├── drawable-v24/ │ │ └── ic_launcher_foreground.xml │ ├── layout/ │ │ ├── activity_main.xml │ │ ├── fragment_multi_key_compose_interop.xml │ │ ├── fragment_my.xml │ │ └── header_view.xml │ ├── mipmap-anydpi-v26/ │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ ├── values/ │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ └── values-night/ │ └── themes.xml ├── epoxy-composesample/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ └── compose/ │ │ └── sample/ │ │ ├── ComposableInteropActivity.kt │ │ ├── EpoxyInteropActivity.kt │ │ ├── MainActivity.kt │ │ ├── epoxyviews/ │ │ │ └── HeaderView.kt │ │ └── ui/ │ │ └── theme/ │ │ ├── Color.kt │ │ ├── Shape.kt │ │ ├── Theme.kt │ │ └── Type.kt │ └── res/ │ ├── drawable/ │ │ └── ic_launcher_background.xml │ ├── drawable-v24/ │ │ └── ic_launcher_foreground.xml │ ├── layout/ │ │ ├── activity_composable_interop.xml │ │ ├── activity_epoxy_interop.xml │ │ ├── activity_main.xml │ │ └── header_view.xml │ ├── mipmap-anydpi-v26/ │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ ├── values/ │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ └── values-night/ │ └── themes.xml ├── epoxy-databinding/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── com/ │ └── airbnb/ │ └── epoxy/ │ └── DataBindingEpoxyModel.java ├── epoxy-glide-preloader/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ └── preloader/ │ │ └── ExampleInstrumentedTest.java │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── com/ │ └── airbnb/ │ └── epoxy/ │ ├── GlidePreloadExtensions.kt │ └── GlidePreloadRequestHolder.kt ├── epoxy-integrationtest/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── airbnb/ │ │ │ └── epoxy/ │ │ │ └── integrationtest/ │ │ │ ├── AdapterWithFieldAssigned.java │ │ │ ├── AdapterWithIdChanged.java │ │ │ ├── BasicAutoModelsAdapter.java │ │ │ ├── ControllerWithAutoModel.java │ │ │ ├── ControllerWithoutImplicityAdding.java │ │ │ ├── EpoxyDataBindingConfig.java │ │ │ ├── KotlinViewWithDefaultParams.kt │ │ │ ├── Model.java │ │ │ ├── ModelChangesDuringBind.java │ │ │ ├── ModelGroupWithAnnotation.java │ │ │ ├── ModelWithCheckedChangeListener.java │ │ │ ├── ModelWithClickListener.java │ │ │ ├── ModelWithConstructors.java │ │ │ ├── ModelWithLongClickListener.java │ │ │ ├── ModelWithNoGeneratedClass.java │ │ │ ├── ModelsWithCustomTypes.java │ │ │ ├── TestActivity.kt │ │ │ ├── ViewWithAnnotationsForIntegrationTest.java │ │ │ ├── ViewWithDelegate.kt │ │ │ ├── ViewWithInterface.kt │ │ │ └── autoaddautomodels/ │ │ │ ├── ControllerWithImplicitlyAddedModels.java │ │ │ ├── ControllerWithImplicitlyAddedModels2.java │ │ │ ├── ControllerWithImplicitlyAddedModels3.java │ │ │ └── PackageConfig.java │ │ └── res/ │ │ ├── layout/ │ │ │ ├── model_with_checked_change.xml │ │ │ ├── model_with_click_listener.xml │ │ │ ├── model_with_data_binding.xml │ │ │ ├── vertical_linear_group.xml │ │ │ ├── view_holder_databinding_test.xml │ │ │ ├── view_holder_nested_databinding_test.xml │ │ │ ├── view_holder_no_databinding.xml │ │ │ └── view_with_annotations_for_integration_test.xml │ │ └── values/ │ │ ├── plurals.xml │ │ └── strings.xml │ └── test/ │ └── java/ │ └── com/ │ └── airbnb/ │ └── epoxy/ │ ├── AutoModelIntegrationTest.java │ ├── BindDiffTest.kt │ ├── BindModelIntegrationTest.java │ ├── ControllerLifecycleHelper.kt │ ├── DataBindingModelIntegrationTest.java │ ├── DiffPayloadTestUtil.java │ ├── EpoxyAdapterIntegrationTest.java │ ├── EpoxyModelGroupRecyclingTest.kt │ ├── EpoxyModelIntegrationTest.java │ ├── EpoxyModelValidationTest.java │ ├── EpoxyViewBinderIntegrationTest.kt │ ├── EpoxyViewBinderVisibilityTrackerTest.kt │ ├── EpoxyVisibilityItemTest.kt │ ├── EpoxyVisibilityTrackerModelGroupTest.kt │ ├── KotlinDefaultParamTest.kt │ ├── ModelBuilderExtensionIntegrationTest.kt │ ├── ModelClickListenerTest.java │ ├── ModelGroupIntegrationTest.kt │ ├── ModelViewDelegateTest.kt │ ├── ModelViewInterfaceTest.kt │ ├── OnModelBindListenerTest.java │ ├── ViewAnnotationsStringOverloadsIntegrationTest.java │ ├── models/ │ │ ├── TrackerTestModel.kt │ │ └── TrackerTestModelGroup.kt │ └── utils/ │ └── VisibilityAssertHelper.kt ├── epoxy-kspsample/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ └── ksp/ │ │ └── sample/ │ │ ├── MainActivity.kt │ │ └── epoxyviews/ │ │ ├── EpoxyConfig.kt │ │ └── HeaderView.kt │ └── res/ │ ├── layout/ │ │ ├── activity_main.xml │ │ └── header_view.xml │ └── values/ │ └── strings.xml ├── epoxy-modelfactory/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── com/ │ └── airbnb/ │ └── epoxy/ │ └── ModelProperties.java ├── epoxy-modelfactorytest/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── airbnb/ │ │ │ └── epoxy/ │ │ │ ├── TestModelPropertiesKotlinView.kt │ │ │ └── TestModelPropertiesView.java │ │ └── res/ │ │ └── values/ │ │ └── strings.xml │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ ├── FromModelPropertiesKotlinTest.kt │ │ ├── FromModelPropertiesTest.kt │ │ ├── ModelFactoryViewProcessorTest.kt │ │ ├── ParisConfig.kt │ │ └── ProcessorTestUtils.kt │ └── resources/ │ ├── AllTypesModelView.java │ ├── AllTypesModelViewModel_.java │ ├── BasicModelWithFinalAttribute.java │ ├── BasicModelWithFinalAttribute_.java │ ├── CallbackPropModelView.java │ ├── CallbackPropModelViewModel_.java │ ├── GroupPropMultipleSupportedAttributeDifferentNameModelView.java │ ├── GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_.java │ ├── GroupPropMultipleSupportedAttributeSameNameModelView.java │ ├── GroupPropMultipleSupportedAttributeSameNameModelViewModel_.java │ ├── GroupPropSingleSupportedAttributeModelView.java │ ├── GroupPropSingleSupportedAttributeModelViewModel_.java │ ├── ListSubtypeModelView.java │ ├── ListSubtypeModelViewModel_.java │ ├── ModelFactoryBaseModelView.java │ ├── ModelFactoryBaseModelViewModel_.java │ ├── ModelFactoryBasicModelWithAttribute.java │ ├── ModelFactoryBasicModelWithAttribute_.java │ ├── StyleableModelView.java │ ├── StyleableModelViewModel_.java │ ├── TextPropModelView.java │ ├── TextPropModelViewModel_.java │ ├── ksp/ │ │ ├── AllTypesModelViewModel_.java │ │ ├── BasicModelWithFinalAttribute_.java │ │ ├── CallbackPropModelViewModel_.java │ │ ├── GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_.java │ │ ├── GroupPropMultipleSupportedAttributeSameNameModelViewModel_.java │ │ ├── GroupPropSingleSupportedAttributeModelViewModel_.java │ │ ├── ListSubtypeModelViewModel_.java │ │ ├── ModelFactoryBaseModelViewModel_.java │ │ ├── ModelFactoryBasicModelWithAttribute_.java │ │ └── TextPropModelViewModel_.java │ └── test.json ├── epoxy-paging3/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ └── paging3/ │ │ ├── Item.kt │ │ ├── ListDataSource.kt │ │ └── PagedListModelCacheTest.kt │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ └── paging3/ │ │ ├── PagedDataModelCache.kt │ │ ├── PagedListEpoxyController.kt │ │ ├── PagedListModelCache.kt │ │ └── PagingDataEpoxyController.kt │ └── test/ │ └── java/ │ └── com/ │ └── airbnb/ │ └── epoxy/ │ └── paging3/ │ ├── DummyItem.kt │ ├── ListPagingSource.kt │ └── PagedDataModelCacheTest.kt ├── epoxy-preloadersample/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ └── preloadersample/ │ │ ├── ImageModel.kt │ │ ├── ImagesController.kt │ │ ├── KotlinHolder.kt │ │ ├── MainActivity.kt │ │ ├── NoPreloadActivity.kt │ │ └── PreloadActivity.kt │ └── res/ │ ├── drawable/ │ │ └── ic_launcher_background.xml │ ├── layout/ │ │ ├── activity_main.xml │ │ ├── list_activity.xml │ │ └── list_item.xml │ └── values/ │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── epoxy-processor/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── airbnb/ │ │ │ └── epoxy/ │ │ │ └── processor/ │ │ │ ├── Asyncable.kt │ │ │ ├── AttributeInfo.kt │ │ │ ├── BaseModelAttributeInfo.kt │ │ │ ├── BaseProcessor.kt │ │ │ ├── BaseProcessorWithPackageConfigs.kt │ │ │ ├── BasicGeneratedModelInfo.kt │ │ │ ├── ClassNames.kt │ │ │ ├── ConfigManager.kt │ │ │ ├── ControllerClassInfo.kt │ │ │ ├── ControllerModelField.kt │ │ │ ├── ControllerProcessor.kt │ │ │ ├── DataBindingAttributeInfo.kt │ │ │ ├── DataBindingModelInfo.kt │ │ │ ├── DataBindingModuleLookup.kt │ │ │ ├── DataBindingProcessor.kt │ │ │ ├── EpoxyProcessor.kt │ │ │ ├── EpoxyProcessorException.kt │ │ │ ├── Extensions.kt │ │ │ ├── GeneratedModelInfo.kt │ │ │ ├── GeneratedModelWriter.kt │ │ │ ├── GroupedAttribute.kt │ │ │ ├── HashCodeValidator.kt │ │ │ ├── ImportScanner.java │ │ │ ├── JavaPoetDsl.kt │ │ │ ├── KClassNames.kt │ │ │ ├── KotlinModelBuilderExtensionWriter.kt │ │ │ ├── KotlinUtils.kt │ │ │ ├── Logger.kt │ │ │ ├── Memoizer.kt │ │ │ ├── MethodInfo.kt │ │ │ ├── ModelBuilderInterfaceWriter.kt │ │ │ ├── ModelViewInfo.kt │ │ │ ├── ModelViewProcessor.kt │ │ │ ├── ModelViewWriter.kt │ │ │ ├── MultiParamAttribute.kt │ │ │ ├── PackageConfigSettings.kt │ │ │ ├── PackageModelViewSettings.kt │ │ │ ├── ParisStyleAttributeInfo.kt │ │ │ ├── PoetExtensions.kt │ │ │ ├── StringOverloadWriter.kt │ │ │ ├── StyleWriter.kt │ │ │ ├── Synchronization.kt │ │ │ ├── Timer.kt │ │ │ ├── Type.kt │ │ │ ├── TypeNameWorkaround.kt │ │ │ ├── Utils.kt │ │ │ ├── ViewAttributeInfo.kt │ │ │ ├── XProcessingUtils.kt │ │ │ └── resourcescanning/ │ │ │ ├── JavacResourceScanner.kt │ │ │ ├── KspResourceScanner.kt │ │ │ ├── ResourceScanner.kt │ │ │ └── ResourceValue.kt │ │ └── resources/ │ │ └── META-INF/ │ │ └── services/ │ │ ├── com.google.devtools.ksp.processing.SymbolProcessorProvider │ │ └── javax.annotation.processing.Processor │ └── test/ │ └── java/ │ └── com/ │ └── airbnb/ │ └── epoxy/ │ ├── KspResourceScannerTest.kt │ ├── PoetExtensionsTest.kt │ └── UtilsTests.kt ├── epoxy-processortest/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── airbnb/ │ │ │ └── integrationtest/ │ │ │ └── processortest/ │ │ │ ├── ProcessorTestModel.java │ │ │ └── differentpackage/ │ │ │ └── Model.java │ │ └── res/ │ │ ├── layout/ │ │ │ └── model_with_data_binding_without_donothash.xml │ │ └── values/ │ │ └── strings.xml │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ ├── ConfigTest.kt │ │ ├── ControllerProcessorTest.kt │ │ ├── DataBindingModelTest.kt │ │ ├── EpoxyResourceProcessorTest.kt │ │ ├── GuavaPatch.kt │ │ ├── ModelProcessorTest.kt │ │ ├── ProcessorTestUtils.kt │ │ ├── ViewProcessorTest.kt │ │ └── testpackage/ │ │ └── DifferentPackageTest.java │ └── resources/ │ ├── AbstractEpoxyModelWithView.java │ ├── AbstractEpoxyModelWithView_.java │ ├── AbstractModelWithHolder.java │ ├── AbstractModelWithHolder_.java │ ├── AutoLayoutModelView.java │ ├── AutoLayoutModelViewManualLayoutParams.java │ ├── AutoLayoutModelViewManualLayoutParamsModel_.java │ ├── AutoLayoutModelViewMatchParent.java │ ├── AutoLayoutModelViewMatchParentModel_.java │ ├── AutoLayoutModelViewModel_.java │ ├── AutoModelNotInAutoAdapter.java │ ├── AutoModelNotOnModelField.java │ ├── BaseModelView.java │ ├── BaseModelViewModel_.java │ ├── BasicModelWithAttribute.java │ ├── BasicModelWithAttribute_.java │ ├── ControllerProcessorTest/ │ │ └── controllerWithAutoModel/ │ │ ├── BasicModelWithAttribute.kt │ │ ├── ControllerWithAutoModel.kt │ │ ├── ControllerWithAutoModel_EpoxyHelper.java │ │ └── ksp/ │ │ └── ControllerWithAutoModel_EpoxyHelper.java │ ├── ControllerWithAutoModel.java │ ├── ControllerWithAutoModelAndImplicitAdding.java │ ├── ControllerWithAutoModelAndImplicitAdding_EpoxyHelper.java │ ├── ControllerWithAutoModelWithSuperClass$SubControllerWithAutoModelWithSuperClass_EpoxyHelper.java │ ├── ControllerWithAutoModelWithSuperClass.java │ ├── ControllerWithAutoModelWithSuperClass_EpoxyHelper.java │ ├── ControllerWithAutoModelWithoutValidation.java │ ├── ControllerWithAutoModelWithoutValidation_EpoxyHelper.java │ ├── ControllerWithAutoModel_EpoxyHelper.java │ ├── CustomPackageLayoutPatternViewModel_.java │ ├── DataBindingConfig.java │ ├── DataBindingModelWithAllFieldTypes.java │ ├── DataBindingModelWithAllFieldTypesNoValidation.java │ ├── DataBindingModelWithAllFieldTypesNoValidation_.java │ ├── DataBindingModelWithAllFieldTypes_.java │ ├── DefaultPackageLayoutPatternViewModel_.java │ ├── DoNotHashView.java │ ├── DoNotHashViewModel_.java │ ├── EpoxyModelGroupWithAnnotations.java │ ├── EpoxyModelGroupWithAnnotations_.java │ ├── GenerateDefaultLayoutMethod.java │ ├── GenerateDefaultLayoutMethodNextParentLayout$NoLayout_.java │ ├── GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_.java │ ├── GenerateDefaultLayoutMethodNextParentLayout$WithLayout_.java │ ├── GenerateDefaultLayoutMethodNextParentLayout.java │ ├── GenerateDefaultLayoutMethodNoLayout.java │ ├── GenerateDefaultLayoutMethodParentLayout$NoLayout_.java │ ├── GenerateDefaultLayoutMethodParentLayout$WithLayout_.java │ ├── GenerateDefaultLayoutMethodParentLayout.java │ ├── GenerateDefaultLayoutMethodParentStillNoLayout.java │ ├── GenerateDefaultLayoutMethod_.java │ ├── GeneratedModelSuffixViewSuffix_.java │ ├── GridSpanCountView.java │ ├── GridSpanCountViewModel_.java │ ├── IgnoreRequireHashCodeView.java │ ├── IgnoreRequireHashCodeViewModel_.java │ ├── LayoutOverloadsViewModel_.java │ ├── ModelAsInnerClass.java │ ├── ModelConfigRequireHashCodeAllowsMarkedAttributes.java │ ├── ModelConfigRequireHashCodeCharSequencePasses.java │ ├── ModelConfigRequireHashCodeInterfaceWithHashCodePasses.java │ ├── ModelConfigSubPackageOverridesParent.java │ ├── ModelDoNotHash.java │ ├── ModelDoNotHash_.java │ ├── ModelDoNotUseInToString.java │ ├── ModelDoNotUseInToString_.java │ ├── ModelForRProcessingTest.java │ ├── ModelForRProcessingTest_.java │ ├── ModelForTestingDuplicateRValues.java │ ├── ModelForTestingDuplicateRValues_.java │ ├── ModelNoValidation.java │ ├── ModelNoValidation_.java │ ├── ModelPackageWithNoConfigInheritsNearestParentConfig.java │ ├── ModelProcessorTest/ │ │ └── testKotlinModel/ │ │ ├── Model.kt │ │ ├── Model_.java │ │ └── ksp/ │ │ └── Model_.java │ ├── ModelRequiresEqualsFailsBasicObject.java │ ├── ModelRequiresHashCodeArrayFails.java │ ├── ModelRequiresHashCodeArraySucceeds.java │ ├── ModelRequiresHashCodeAutoValueClassPasses.java │ ├── ModelRequiresHashCodeEnumPasses.java │ ├── ModelRequiresHashCodeFailsBasicObject.java │ ├── ModelRequiresHashCodeIterableFails.java │ ├── ModelRequiresHashCodeIterableSucceeds.java │ ├── ModelReturningClassType.java │ ├── ModelReturningClassTypeWithVarargs.java │ ├── ModelReturningClassTypeWithVarargs_.java │ ├── ModelReturningClassType_.java │ ├── ModelViewExtendingSuperClass.java │ ├── ModelViewExtendingSuperClassModel_.java │ ├── ModelViewSuperClass.java │ ├── ModelViewSuperClassModel_.java │ ├── ModelViewWithParis.java │ ├── ModelViewWithParisModel_.java │ ├── ModelWithAbstractClass.java │ ├── ModelWithAbstractClassAndAnnotation.java │ ├── ModelWithAbstractClassAndAnnotation_.java │ ├── ModelWithAllFieldTypes.java │ ├── ModelWithAllFieldTypesBuilder.java │ ├── ModelWithAllFieldTypes_.java │ ├── ModelWithAllPrivateFieldTypes.java │ ├── ModelWithAllPrivateFieldTypes_.java │ ├── ModelWithAnnotatedClass.java │ ├── ModelWithAnnotatedClassAndSuperAttributes$SubModelWithAnnotatedClassAndSuperAttributes_.java │ ├── ModelWithAnnotatedClassAndSuperAttributes.java │ ├── ModelWithAnnotatedClassAndSuperAttributes_.java │ ├── ModelWithAnnotatedClass_.java │ ├── ModelWithAnnotation.java │ ├── ModelWithAnnotation_.java │ ├── ModelWithCheckedChangeListener.java │ ├── ModelWithCheckedChangeListener_.java │ ├── ModelWithConstructors.java │ ├── ModelWithConstructors_.java │ ├── ModelWithDataBindingBinding.java │ ├── ModelWithDataBindingBindingModel_.java │ ├── ModelWithDataBindingWithoutDonothashBinding.java │ ├── ModelWithDataBindingWithoutDonothashBindingModel_.java │ ├── ModelWithFieldAnnotation.java │ ├── ModelWithFieldAnnotation_.java │ ├── ModelWithFinalClass.java │ ├── ModelWithFinalField.java │ ├── ModelWithFinalField_.java │ ├── ModelWithIntDef.java │ ├── ModelWithIntDef_.java │ ├── ModelWithPrivateFieldWithGetterWithParams.java │ ├── ModelWithPrivateFieldWithIsPrefixGetter.java │ ├── ModelWithPrivateFieldWithPrivateGetter.java │ ├── ModelWithPrivateFieldWithPrivateSetter.java │ ├── ModelWithPrivateFieldWithSameAsFieldGetterAndSetterName.java │ ├── ModelWithPrivateFieldWithSameAsFieldGetterAndSetterName_.java │ ├── ModelWithPrivateFieldWithSettterWithoutParams.java │ ├── ModelWithPrivateFieldWithStaticGetter.java │ ├── ModelWithPrivateFieldWithStaticSetter.java │ ├── ModelWithPrivateFieldWithoutGetter.java │ ├── ModelWithPrivateFieldWithoutGetterAndSetter.java │ ├── ModelWithPrivateFieldWithoutSetter.java │ ├── ModelWithPrivateInnerClass.java │ ├── ModelWithPrivateViewClickListener.java │ ├── ModelWithPrivateViewClickListener_.java │ ├── ModelWithStaticField.java │ ├── ModelWithSuper.java │ ├── ModelWithSuperAttributes$SubModelWithSuperAttributes_.java │ ├── ModelWithSuperAttributes.java │ ├── ModelWithSuperAttributes_.java │ ├── ModelWithSuper_.java │ ├── ModelWithType.java │ ├── ModelWithType_.java │ ├── ModelWithVarargsConstructors.java │ ├── ModelWithVarargsConstructors_.java │ ├── ModelWithViewClickListener.java │ ├── ModelWithViewClickListener_.java │ ├── ModelWithViewLongClickListener.java │ ├── ModelWithViewLongClickListener_.java │ ├── ModelWithoutEpoxyExtension.java │ ├── ModelWithoutHash.java │ ├── ModelWithoutHash_.java │ ├── ModelWithoutSetter.java │ ├── ModelWithoutSetter_.java │ ├── NullOnRecycleView.java │ ├── NullOnRecycleViewModel_.java │ ├── NullOnRecycleView_throwsIfNotNullable.java │ ├── ObjectWithoutEqualsThrowsView.java │ ├── OnViewRecycledView.java │ ├── OnViewRecycledViewModel_.java │ ├── OnViewRecycledView_throwsIfHasParams.java │ ├── OnViewRecycledView_throwsIfPrivate.java │ ├── OnViewRecycledView_throwsIfStatic.java │ ├── OnVisibilityChangedView.java │ ├── OnVisibilityChangedViewModel_.java │ ├── OnVisibilityChangedView_throwsIfInvalidParams.java │ ├── OnVisibilityChangedView_throwsIfNoParams.java │ ├── OnVisibilityChangedView_throwsIfPrivate.java │ ├── OnVisibilityChangedView_throwsIfStatic.java │ ├── OnVisibilityStateChangedView.java │ ├── OnVisibilityStateChangedViewModel_.java │ ├── OnVisibilityStateChangedView_throwsIfInvalidParams.java │ ├── OnVisibilityStateChangedView_throwsIfNoParams.java │ ├── OnVisibilityStateChangedView_throwsIfPrivate.java │ ├── OnVisibilityStateChangedView_throwsIfStatic.java │ ├── PropDefaultsView.java │ ├── PropDefaultsViewModel_.java │ ├── PropDefaultsView_throwsForNonFinalValue.java │ ├── PropDefaultsView_throwsForNonStaticValue.java │ ├── PropDefaultsView_throwsForNotFound.java │ ├── PropDefaultsView_throwsForPrivateValue.java │ ├── PropDefaultsView_throwsForWrongType.java │ ├── PropGroupsView.java │ ├── PropGroupsViewModel_.java │ ├── Prop_throwsIfMultipleParams.java │ ├── Prop_throwsIfNoParams.java │ ├── Prop_throwsIfPrivate.java │ ├── Prop_throwsIfStatic.java │ ├── RLayoutInViewModelAnnotationWorksViewModel_.java │ ├── RequireAbstractModelFailsClassWithAttribute.java │ ├── RequireAbstractModelFailsEpoxyModelClass.java │ ├── RequireAbstractModelPassesClassWithAttribute.java │ ├── RequireAbstractModelPassesEpoxyModelClass.java │ ├── SavedStateView.java │ ├── SavedStateViewModel_.java │ ├── StringOverloads_throwsIfNotCharSequence.java │ ├── TestAfterBindPropsSuperView.java │ ├── TestAfterBindPropsView.java │ ├── TestAfterBindPropsViewModel_.java │ ├── TestCallbackPropMustBeNullableView.java │ ├── TestCallbackPropView.java │ ├── TestCallbackPropViewModel_.java │ ├── TestFieldPropCallbackPropView.java │ ├── TestFieldPropCallbackPropViewModel_.java │ ├── TestFieldPropChildView.java │ ├── TestFieldPropChildViewModel_.java │ ├── TestFieldPropDoNotHashOptionView.java │ ├── TestFieldPropDoNotHashOptionViewModel_.java │ ├── TestFieldPropGenerateStringOverloadsOptionView.java │ ├── TestFieldPropGenerateStringOverloadsOptionViewModel_.java │ ├── TestFieldPropIgnoreRequireHashCodeOptionView.java │ ├── TestFieldPropIgnoreRequireHashCodeOptionViewModel_.java │ ├── TestFieldPropModelPropView.java │ ├── TestFieldPropModelPropViewModel_.java │ ├── TestFieldPropNullOnRecycleOptionView.java │ ├── TestFieldPropNullOnRecycleOptionViewModel_.java │ ├── TestFieldPropParentView.java │ ├── TestFieldPropStringOverloadsIfNotCharSequenceView.java │ ├── TestFieldPropTextPropView.java │ ├── TestFieldPropTextPropViewModel_.java │ ├── TestFieldPropThrowsIfPrivateView.java │ ├── TestFieldPropThrowsIfStaticView.java │ ├── TestManyTypesView.java │ ├── TestManyTypesViewModelBuilder.java │ ├── TestManyTypesViewModel_.java │ ├── TestNullStringOverloadsView.java │ ├── TestNullStringOverloadsViewModel_.java │ ├── TestStringOverloadsView.java │ ├── TestStringOverloadsViewModel_.java │ ├── TestTextPropIfNotCharSequenceView.java │ ├── TestTextPropMustBeCharSequenceView.java │ ├── TestTextPropView.java │ ├── TestTextPropViewModel_.java │ ├── TextPropDefaultView.java │ ├── TextPropDefaultViewModel_.java │ ├── TextPropDefaultView_throwsForNonStringRes.java │ ├── ViewProcessorTest/ │ │ ├── annotationsAreCopied/ │ │ │ ├── SourceView.kt │ │ │ ├── SourceViewModelBuilder.java │ │ │ ├── SourceViewModel_.java │ │ │ └── ksp/ │ │ │ ├── SourceViewModelBuilder.java │ │ │ └── SourceViewModel_.java │ │ ├── annotationsAreCopied_java/ │ │ │ ├── SourceView.java │ │ │ ├── SourceViewModelBuilder.java │ │ │ ├── SourceViewModel_.java │ │ │ └── ksp/ │ │ │ ├── SourceViewModelBuilder.java │ │ │ └── SourceViewModel_.java │ │ ├── inheritingAttributesWorksCorrectly/ │ │ │ ├── SourceView.kt │ │ │ ├── SourceViewModelBuilder.java │ │ │ ├── SourceViewModel_.java │ │ │ └── ksp/ │ │ │ ├── SourceViewModelBuilder.java │ │ │ └── SourceViewModel_.java │ │ ├── inheritingAttributesWorksCorrectlyJavaClassPath/ │ │ │ ├── SourceView.kt │ │ │ ├── SourceViewModelBuilder.java │ │ │ ├── SourceViewModel_.java │ │ │ └── ksp/ │ │ │ ├── SourceViewModelBuilder.java │ │ │ └── SourceViewModel_.java │ │ ├── inheritingAttributesWorksCorrectlyJavaSources/ │ │ │ ├── AirEpoxyModel.java │ │ │ ├── SourceView.kt │ │ │ ├── SourceViewModelBuilder.java │ │ │ ├── SourceViewModel_.java │ │ │ └── ksp/ │ │ │ ├── SourceViewModelBuilder.java │ │ │ └── SourceViewModel_.java │ │ ├── testManyTypes/ │ │ │ ├── EpoxyModelViewProcessorKotlinExtensions.kt │ │ │ ├── TestManyTypesView.kt │ │ │ ├── TestManyTypesViewModelBuilder.java │ │ │ ├── TestManyTypesViewModel_.java │ │ │ └── ksp/ │ │ │ ├── EpoxyModelViewProcessorKotlinExtensions.kt │ │ │ ├── TestManyTypesViewModelBuilder.java │ │ │ └── TestManyTypesViewModel_.java │ │ ├── testStyleableViewKotlinSources/ │ │ │ ├── ModelViewWithParis.kt │ │ │ ├── ModelViewWithParisModel_.java │ │ │ └── ksp/ │ │ │ └── ModelViewWithParisModel_.java │ │ └── wildcardHandling/ │ │ ├── AirEpoxyModel.java │ │ ├── SourceView.kt │ │ ├── SourceViewModelBuilder.java │ │ ├── SourceViewModel_.java │ │ └── ksp/ │ │ ├── SourceViewModelBuilder.java │ │ └── SourceViewModel_.java │ ├── baseModelFromPackageConfig/ │ │ ├── BaseModelViewModel_.java │ │ └── ksp/ │ │ ├── BaseModelViewModel_.java │ │ └── actual/ │ │ └── BaseModelViewModel_.java │ ├── baseModelFromPackageConfigIsOverriddenByViewSetting/ │ │ ├── BaseModelViewModel_.java │ │ └── ksp/ │ │ ├── BaseModelViewModel_.java │ │ └── actual/ │ │ └── BaseModelViewModel_.java │ ├── baseModelWithAttribute/ │ │ ├── BaseModelViewModel_.java │ │ └── ksp/ │ │ ├── BaseModelViewModel_.java │ │ └── actual/ │ │ └── BaseModelViewModel_.java │ ├── baseModelWithDiffBind/ │ │ ├── BaseModelViewModel_.java │ │ └── ksp/ │ │ ├── BaseModelViewModel_.java │ │ └── actual/ │ │ └── BaseModelViewModel_.java │ ├── ksp/ │ │ ├── AbstractEpoxyModelWithView_.java │ │ ├── AutoLayoutModelViewManualLayoutParamsModel_.java │ │ ├── AutoLayoutModelViewMatchParentModel_.java │ │ ├── AutoLayoutModelViewModel_.java │ │ ├── BaseModelViewModel_.java │ │ ├── BasicModelWithAttribute_.java │ │ ├── ControllerWithAutoModelWithSuperClass$SubControllerWithAutoModelWithSuperClass_EpoxyHelper.java │ │ ├── ControllerWithAutoModelWithSuperClass_EpoxyHelper.java │ │ ├── ControllerWithAutoModel_EpoxyHelper.java │ │ ├── CustomPackageLayoutPatternViewModel_.java │ │ ├── DataBindingModelWithAllFieldTypes_.java │ │ ├── DefaultPackageLayoutPatternViewModel_.java │ │ ├── DoNotHashViewModel_.java │ │ ├── EpoxyModelGroupWithAnnotations_.java │ │ ├── GenerateDefaultLayoutMethodNextParentLayout$NoLayout_.java │ │ ├── GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_.java │ │ ├── GenerateDefaultLayoutMethodNextParentLayout$WithLayout_.java │ │ ├── GenerateDefaultLayoutMethodParentLayout$NoLayout_.java │ │ ├── GenerateDefaultLayoutMethodParentLayout$WithLayout_.java │ │ ├── GenerateDefaultLayoutMethod_.java │ │ ├── GeneratedModelSuffixViewSuffix_.java │ │ ├── GridSpanCountViewModel_.java │ │ ├── IgnoreRequireHashCodeViewModel_.java │ │ ├── LayoutOverloadsViewModel_.java │ │ ├── ModelDoNotHash_.java │ │ ├── ModelDoNotUseInToString_.java │ │ ├── ModelForRProcessingTest_.java │ │ ├── ModelReturningClassTypeWithVarargs_.java │ │ ├── ModelReturningClassType_.java │ │ ├── ModelViewExtendingSuperClassModel_.java │ │ ├── ModelViewSuperClassModel_.java │ │ ├── ModelViewWithParisModel_.java │ │ ├── ModelWithAbstractClassAndAnnotation_.java │ │ ├── ModelWithAllFieldTypesBuilder.java │ │ ├── ModelWithAllFieldTypes_.java │ │ ├── ModelWithAllPrivateFieldTypes_.java │ │ ├── ModelWithAnnotatedClass_.java │ │ ├── ModelWithAnnotation_.java │ │ ├── ModelWithCheckedChangeListener_.java │ │ ├── ModelWithConstructors_.java │ │ ├── ModelWithFieldAnnotation_.java │ │ ├── ModelWithFinalField_.java │ │ ├── ModelWithPrivateFieldWithSameAsFieldGetterAndSetterName_.java │ │ ├── ModelWithPrivateViewClickListener_.java │ │ ├── ModelWithSuperAttributes$SubModelWithSuperAttributes_.java │ │ ├── ModelWithSuperAttributes_.java │ │ ├── ModelWithSuper_.java │ │ ├── ModelWithViewClickListener_.java │ │ ├── ModelWithViewLongClickListener_.java │ │ ├── ModelWithoutHash_.java │ │ ├── ModelWithoutSetter_.java │ │ ├── NullOnRecycleViewModel_.java │ │ ├── OnViewRecycledViewModel_.java │ │ ├── OnVisibilityChangedViewModel_.java │ │ ├── OnVisibilityStateChangedViewModel_.java │ │ ├── PropDefaultsViewModel_.java │ │ ├── PropGroupsViewModel_.java │ │ ├── RLayoutInViewModelAnnotationWorksViewModel_.java │ │ ├── SavedStateViewModel_.java │ │ ├── TestAfterBindPropsViewModel_.java │ │ ├── TestCallbackPropViewModel_.java │ │ ├── TestFieldPropCallbackPropViewModel_.java │ │ ├── TestFieldPropChildViewModel_.java │ │ ├── TestFieldPropDoNotHashOptionViewModel_.java │ │ ├── TestFieldPropGenerateStringOverloadsOptionViewModel_.java │ │ ├── TestFieldPropIgnoreRequireHashCodeOptionViewModel_.java │ │ ├── TestFieldPropModelPropViewModel_.java │ │ ├── TestFieldPropNullOnRecycleOptionViewModel_.java │ │ ├── TestFieldPropTextPropViewModel_.java │ │ ├── TestManyTypesViewModelBuilder.java │ │ ├── TestManyTypesViewModel_.java │ │ ├── TestNullStringOverloadsViewModel_.java │ │ ├── TestStringOverloadsViewModel_.java │ │ ├── TestTextPropViewModel_.java │ │ └── TextPropDefaultViewModel_.java │ └── testModelWithHolderGeneratesNewHolderMethod/ │ ├── AbstractModelWithHolder.kt │ ├── AbstractModelWithHolder_.java │ └── ksp/ │ └── AbstractModelWithHolder_.java ├── epoxy-processortest2/ │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ └── processortest2/ │ │ └── ProcessorTest2Model.java │ └── res/ │ └── values/ │ └── strings.xml ├── epoxy-sample/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── assets/ │ │ ├── exploding_heart.json │ │ └── favourite_app_icon.json │ ├── java/ │ │ └── com/ │ │ └── airbnb/ │ │ └── epoxy/ │ │ └── sample/ │ │ ├── CarouselData.java │ │ ├── ColorData.java │ │ ├── EpoxyConfig.java │ │ ├── MainActivity.java │ │ ├── SampleController.kt │ │ ├── models/ │ │ │ ├── BaseEpoxyHolder.kt │ │ │ ├── BaseView.java │ │ │ ├── CarouselModelGroup.java │ │ │ ├── ColorModel.kt │ │ │ ├── ImageButtonModel.kt │ │ │ ├── SimpleAnimatorListener.java │ │ │ ├── TestModel1.kt │ │ │ ├── TestModel2.kt │ │ │ ├── TestModel3.kt │ │ │ ├── TestModel4.kt │ │ │ ├── TestModel5.kt │ │ │ ├── TestModel6.kt │ │ │ └── TestModel7.kt │ │ └── views/ │ │ ├── GridCarousel.java │ │ └── HeaderView.java │ └── res/ │ ├── drawable/ │ │ ├── ic_add_circle.xml │ │ ├── ic_change.xml │ │ ├── ic_delete.xml │ │ └── ic_shuffle.xml │ ├── layout/ │ │ ├── activity_main.xml │ │ ├── button.xml │ │ ├── model_carousel_group.xml │ │ ├── model_color.xml │ │ ├── model_image_button.xml │ │ ├── number_view.xml │ │ └── view_header.xml │ ├── values/ │ │ ├── dimens.xml │ │ └── strings.xml │ └── values-w820dp/ │ └── dimens.xml ├── epoxy-viewbinder/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── airbnb/ │ │ │ └── epoxy/ │ │ │ ├── EpoxyViewBinder.kt │ │ │ ├── EpoxyViewBinderExtensions.kt │ │ │ ├── EpoxyViewBinderVisibilityTracker.kt │ │ │ ├── EpoxyViewStub.kt │ │ │ └── ViewExtensions.kt │ │ └── res/ │ │ └── values/ │ │ └── ids.xml │ └── test/ │ └── java/ │ └── com/ │ └── example/ │ └── epoxy_viewbinder/ │ └── EpoxyViewBinderTest.kt ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── kotlinsample/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── airbnb/ │ │ │ └── epoxy/ │ │ │ └── kotlinsample/ │ │ │ ├── DragAndDropActivity.kt │ │ │ ├── EpoxyDataBindingPatterns.kt │ │ │ ├── MainActivity.kt │ │ │ ├── StickyHeaderActivity.kt │ │ │ ├── StickyHeaderAdapter.kt │ │ │ ├── StickyHeaderController.kt │ │ │ ├── helpers/ │ │ │ │ ├── EpoxyCarouselNoSnapBuilder.kt │ │ │ │ ├── KotlinEpoxyHolder.kt │ │ │ │ ├── KotlinModel.kt │ │ │ │ ├── ViewBindingEpoxyModelWithHolder.kt │ │ │ │ └── ViewBindingKotlinModel.kt │ │ │ ├── models/ │ │ │ │ ├── CarouselItemCustomView.kt │ │ │ │ ├── ColoredSquareView.kt │ │ │ │ ├── DecoratedLinearGroupModel.kt │ │ │ │ ├── ItemCustomView.kt │ │ │ │ ├── ItemDataClass.kt │ │ │ │ ├── ItemEpoxyHolder.kt │ │ │ │ ├── ItemViewBindingDataClass.kt │ │ │ │ ├── ItemViewBindingEpoxyHolder.kt │ │ │ │ ├── ManualLayoutParamsView.kt │ │ │ │ ├── OnVisibilityEventDrawable.kt │ │ │ │ └── StickyItemEpoxyHolder.kt │ │ │ └── views/ │ │ │ └── CarouselNoSnap.kt │ │ └── res/ │ │ ├── drawable/ │ │ │ └── ic_launcher_background.xml │ │ ├── drawable-v24/ │ │ │ └── ic_launcher_foreground.xml │ │ ├── layout/ │ │ │ ├── activity.xml │ │ │ ├── carousel_custom_view_item.xml │ │ │ ├── colored_square_view.xml │ │ │ ├── custom_view_item.xml │ │ │ ├── data_class_item.xml │ │ │ ├── data_class_view_binding_item.xml │ │ │ ├── decorated_linear_group.xml │ │ │ ├── epoxy_layout_data_binding_item.xml │ │ │ ├── sticky_view_holder_item.xml │ │ │ ├── vertical_linear_group.xml │ │ │ ├── view_binding_holder_item.xml │ │ │ └── view_holder_item.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── values/ │ │ ├── colors.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test/ │ └── java/ │ └── com/ │ └── airbnb/ │ └── epoxy/ │ └── kotlinsample/ │ ├── AnnotationModel.kt │ ├── ConstructorWithLambdaModel.kt │ └── ConstructorWithoutLamdaModel.kt ├── ktlint.gradle ├── libs/ │ ├── rt.jar │ └── tools.jar ├── publishing.gradle ├── reports/ │ └── profile/ │ ├── css/ │ │ ├── base-style.css │ │ └── style.css │ ├── js/ │ │ └── report.js │ └── profile-2020-03-31-14-39-05.html └── settings.gradle
Showing preview only (654K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9605 symbols across 526 files)
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/AsyncEpoxyController.java
class AsyncEpoxyController (line 14) | public abstract class AsyncEpoxyController extends EpoxyController {
method AsyncEpoxyController (line 19) | public AsyncEpoxyController() {
method AsyncEpoxyController (line 27) | public AsyncEpoxyController(boolean enableAsync) {
method AsyncEpoxyController (line 34) | public AsyncEpoxyController(boolean enableAsyncModelBuilding, boolean ...
method getHandler (line 38) | private static Handler getHandler(boolean enableAsync) {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/AsyncEpoxyDiffer.java
class AsyncEpoxyDiffer (line 21) | class AsyncEpoxyDiffer {
type ResultCallback (line 23) | interface ResultCallback {
method onResult (line 24) | void onResult(@NonNull DiffResult result);
method AsyncEpoxyDiffer (line 32) | AsyncEpoxyDiffer(
method getCurrentList (line 64) | @AnyThread
method cancelDiff (line 74) | @SuppressWarnings("WeakerAccess")
method isDiffInProgress (line 83) | @SuppressWarnings("WeakerAccess")
method forceListOverride (line 95) | @AnyThread
method submitList (line 114) | @AnyThread
method onRunCompleted (line 160) | private void onRunCompleted(
method tryLatchList (line 185) | @AnyThread
class GenerationTracker (line 214) | private static class GenerationTracker {
method incrementAndGetNextScheduled (line 220) | synchronized int incrementAndGetNextScheduled() {
method finishMaxGeneration (line 224) | synchronized boolean finishMaxGeneration() {
method hasUnfinishedGeneration (line 230) | synchronized boolean hasUnfinishedGeneration() {
method finishGeneration (line 234) | synchronized boolean finishGeneration(int runGeneration) {
class DiffCallback (line 246) | private static class DiffCallback extends DiffUtil.Callback {
method DiffCallback (line 252) | DiffCallback(List<? extends EpoxyModel<?>> oldList, List<? extends E...
method getOldListSize (line 259) | @Override
method getNewListSize (line 264) | @Override
method areItemsTheSame (line 269) | @Override
method areContentsTheSame (line 277) | @Override
method getChangePayload (line 285) | @Nullable
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/BaseEpoxyAdapter.java
class BaseEpoxyAdapter (line 20) | public abstract class BaseEpoxyAdapter
method getSpanSize (line 38) | @Override
method BaseEpoxyAdapter (line 57) | public BaseEpoxyAdapter() {
method onExceptionSwallowed (line 68) | protected void onExceptionSwallowed(RuntimeException exception) {
method getItemCount (line 72) | @Override
method getCurrentModels (line 78) | abstract List<? extends EpoxyModel<?>> getCurrentModels();
method isEmpty (line 80) | public boolean isEmpty() {
method getItemId (line 84) | @Override
method getItemViewType (line 92) | @Override
method onCreateViewHolder (line 97) | @Override
method onBindViewHolder (line 104) | @Override
method onBindViewHolder (line 109) | @Override
method diffPayloadsEnabled (line 136) | boolean diffPayloadsEnabled() {
method onModelBound (line 144) | protected void onModelBound(EpoxyViewHolder holder, EpoxyModel<?> mode...
method onModelBound (line 149) | void onModelBound(EpoxyViewHolder holder, EpoxyModel<?> model, int pos...
method onModelBound (line 158) | protected void onModelBound(EpoxyViewHolder holder, EpoxyModel<?> mode...
method getBoundViewHolders (line 167) | protected BoundViewHolders getBoundViewHolders() {
method getModelForPosition (line 171) | EpoxyModel<?> getModelForPosition(int position) {
method onViewRecycled (line 175) | @Override
method onDetachedFromRecyclerView (line 185) | @CallSuper
method onModelUnbound (line 198) | protected void onModelUnbound(EpoxyViewHolder holder, EpoxyModel<?> mo...
method onFailedToRecycleView (line 202) | @CallSuper
method onViewAttachedToWindow (line 209) | @CallSuper
method onViewDetachedFromWindow (line 216) | @CallSuper
method onSaveInstanceState (line 223) | public void onSaveInstanceState(Bundle outState) {
method onRestoreInstanceState (line 238) | public void onRestoreInstanceState(@Nullable Bundle inState) {
method getModelPosition (line 263) | protected int getModelPosition(EpoxyModel<?> model) {
method getSpanSizeLookup (line 280) | public SpanSizeLookup getSpanSizeLookup() {
method setSpanCount (line 291) | public void setSpanCount(int spanCount) {
method getSpanCount (line 295) | public int getSpanCount() {
method isMultiSpan (line 299) | public boolean isMultiSpan() {
method setupStickyHeaderView (line 312) | @Override
method teardownStickyHeaderView (line 324) | @Override
method isStickyHeader (line 336) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/BaseEpoxyTouchCallback.java
type BaseEpoxyTouchCallback (line 5) | interface BaseEpoxyTouchCallback<T extends EpoxyModel> {
method getMovementFlagsForModel (line 17) | int getMovementFlagsForModel(T model, int adapterPosition);
method clearView (line 29) | void clearView(T model, View itemView);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/BoundViewHolders.java
class BoundViewHolders (line 11) | @SuppressWarnings("WeakerAccess")
method get (line 15) | @Nullable
method put (line 20) | public void put(EpoxyViewHolder holder) {
method remove (line 24) | public void remove(EpoxyViewHolder holder) {
method size (line 28) | public int size() {
method iterator (line 32) | @Override
method getHolderForModel (line 37) | @Nullable
class HolderIterator (line 42) | private class HolderIterator implements Iterator<EpoxyViewHolder> {
method hasNext (line 45) | @Override
method next (line 50) | @Override
method remove (line 58) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/Carousel.java
class Carousel (line 52) | @ModelView(saveViewState = true, autoLayout = Size.MATCH_WIDTH_WRAP_HEIGHT)
method buildSnapHelper (line 59) | @Override
method Carousel (line 71) | public Carousel(Context context) {
method Carousel (line 75) | public Carousel(Context context, @Nullable AttributeSet attrs) {
method Carousel (line 79) | public Carousel(Context context, @Nullable AttributeSet attrs, int def...
method init (line 83) | @Override
method getSnapHelperFactory (line 115) | @Nullable
method setDefaultGlobalSnapHelperFactory (line 128) | public static void setDefaultGlobalSnapHelperFactory(@Nullable SnapHel...
method setHasFixedSize (line 132) | @ModelProp
method setNumViewsToShowOnScreen (line 156) | @ModelProp(group = "prefetch")
method getNumViewsToShowOnScreen (line 165) | public float getNumViewsToShowOnScreen() {
method setInitialPrefetchItemCount (line 176) | @ModelProp(group = "prefetch")
method onChildAttachedToWindow (line 191) | @Override
method getSpaceForChildren (line 220) | private int getSpaceForChildren(boolean horizontal) {
method getTotalWidthPx (line 235) | @Px
method getTotalHeightPx (line 251) | @Px
method onChildDetachedFromWindow (line 266) | @Override
method setDefaultItemSpacingDp (line 283) | public static void setDefaultItemSpacingDp(@Dimension(unit = Dimension...
method getDefaultSpacingBetweenItemsDp (line 293) | @Dimension(unit = Dimension.DP)
method setPaddingRes (line 302) | @ModelProp(group = "padding")
method setPaddingDp (line 315) | @ModelProp(defaultValue = "NO_VALUE_SET", group = "padding")
method setPadding (line 328) | @ModelProp(group = "padding")
class Padding (line 354) | public static class Padding {
type PaddingType (line 362) | enum PaddingType {
method resource (line 373) | public static Padding resource(@DimenRes int paddingRes, @DimenRes i...
method resource (line 386) | public static Padding resource(
method dp (line 401) | public static Padding dp(
method dp (line 415) | public static Padding dp(
method Padding (line 429) | public Padding(@Px int paddingPx, @Px int itemSpacingPx) {
method Padding (line 441) | public Padding(
method Padding (line 455) | private Padding(
method equals (line 466) | @Override
method hashCode (line 492) | @Override
method setModels (line 503) | @ModelProp
method clear (line 508) | @OnViewRecycled
class SnapHelperFactory (line 514) | public abstract static class SnapHelperFactory {
method buildSnapHelper (line 519) | @NonNull
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ControllerHelper.java
class ControllerHelper (line 10) | public abstract class ControllerHelper<T extends EpoxyController> {
method resetAutoModels (line 11) | public abstract void resetAutoModels();
method validateModelHashCodesHaveNotChanged (line 13) | protected void validateModelHashCodesHaveNotChanged(T controller) {
method setControllerToStageTo (line 23) | protected void setControllerToStageTo(EpoxyModel<?> model, T controlle...
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ControllerHelperLookup.java
class ControllerHelperLookup (line 15) | class ControllerHelperLookup {
method getHelperForController (line 20) | static ControllerHelper getHelperForController(EpoxyController control...
method findConstructorForClass (line 44) | @Nullable
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ControllerModelList.java
class ControllerModelList (line 10) | class ControllerModelList extends ModelList {
method onItemRangeInserted (line 13) | @Override
method onItemRangeRemoved (line 19) | @Override
method ControllerModelList (line 26) | ControllerModelList(int expectedModelCount) {
method freeze (line 31) | void freeze() {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/DebugTimer.java
class DebugTimer (line 5) | class DebugTimer implements Timer {
method DebugTimer (line 11) | DebugTimer(String tag) {
method reset (line 16) | private void reset() {
method start (line 21) | @Override
method stop (line 31) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/DiffHelper.java
class DiffHelper (line 16) | class DiffHelper {
method DiffHelper (line 27) | DiffHelper(BaseEpoxyAdapter adapter, boolean immutableModels) {
method onChanged (line 34) | @Override
method onItemRangeChanged (line 40) | @Override
method onItemRangeInserted (line 47) | @Override
method onItemRangeRemoved (line 75) | @Override
method onItemRangeMoved (line 96) | @Override
method notifyModelChanges (line 130) | void notifyModelChanges() {
method notifyChanges (line 142) | private void notifyChanges(UpdateOpHelper opHelper) {
method buildDiff (line 172) | private UpdateOpHelper buildDiff(UpdateOpHelper updateOpHelper) {
method resetOldState (line 197) | private void resetOldState() {
method prepareStateForDiff (line 202) | private void prepareStateForDiff() {
method createStateForPosition (line 232) | private ModelState createStateForPosition(int position) {
method collectRemovals (line 254) | private void collectRemovals(UpdateOpHelper helper) {
method collectInsertions (line 278) | private void collectInsertions(UpdateOpHelper helper) {
method collectChanges (line 298) | private void collectChanges(UpdateOpHelper helper) {
method collectMoves (line 331) | private void collectMoves(UpdateOpHelper helper) {
method updateItemPosition (line 420) | private void updateItemPosition(ModelState item, List<UpdateOp> moveOp...
method getNextItemWithPair (line 441) | @Nullable
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/DiffPayload.java
class DiffPayload (line 16) | public class DiffPayload {
method DiffPayload (line 20) | DiffPayload(List<? extends EpoxyModel<?>> models) {
method DiffPayload (line 40) | public DiffPayload(EpoxyModel<?> changedItem) {
method getModelFromPayload (line 49) | @Nullable
method equalsForTesting (line 73) | @VisibleForTesting
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/DiffResult.java
class DiffResult (line 16) | public class DiffResult {
method noOp (line 28) | static DiffResult noOp(@Nullable List<? extends EpoxyModel<?>> models) {
method inserted (line 36) | static DiffResult inserted(@NonNull List<? extends EpoxyModel<?>> newM...
method clear (line 42) | static DiffResult clear(@NonNull List<? extends EpoxyModel<?>> previou...
method diff (line 51) | static DiffResult diff(
method DiffResult (line 59) | private DiffResult(
method dispatchTo (line 69) | public void dispatchTo(Adapter adapter) {
method dispatchTo (line 73) | public void dispatchTo(ListUpdateCallback callback) {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyAdapter.java
class EpoxyAdapter (line 20) | @SuppressWarnings("WeakerAccess")
method getCurrentModels (line 31) | @Override
method enableDiffing (line 42) | protected void enableDiffing() {
method getModelForPosition (line 58) | @Override
method notifyModelsChanged (line 77) | protected void notifyModelsChanged() {
method notifyModelChanged (line 89) | protected void notifyModelChanged(EpoxyModel<?> model) {
method notifyModelChanged (line 97) | protected void notifyModelChanged(EpoxyModel<?> model, @Nullable Objec...
method addModel (line 107) | protected void addModel(EpoxyModel<?> modelToAdd) {
method addModels (line 121) | protected void addModels(EpoxyModel<?>... modelsToAdd) {
method addModels (line 138) | protected void addModels(Collection<? extends EpoxyModel<?>> modelsToA...
method insertModelBefore (line 152) | protected void insertModelBefore(EpoxyModel<?> modelToInsert, EpoxyMod...
method insertModelAfter (line 169) | protected void insertModelAfter(EpoxyModel<?> modelToInsert, EpoxyMode...
method removeModel (line 187) | protected void removeModel(EpoxyModel<?> model) {
method removeAllModels (line 201) | protected void removeAllModels() {
method removeAllAfterModel (line 216) | protected void removeAllAfterModel(EpoxyModel<?> model) {
method showModel (line 236) | protected void showModel(EpoxyModel<?> model, boolean show) {
method showModel (line 250) | protected void showModel(EpoxyModel<?> model) {
method showModels (line 259) | protected void showModels(EpoxyModel<?>... models) {
method showModels (line 270) | protected void showModels(boolean show, EpoxyModel<?>... models) {
method showModels (line 279) | protected void showModels(Iterable<EpoxyModel<?>> models) {
method showModels (line 290) | protected void showModels(Iterable<EpoxyModel<?>> models, boolean show) {
method hideModel (line 301) | protected void hideModel(EpoxyModel<?> model) {
method hideModels (line 310) | protected void hideModels(Iterable<EpoxyModel<?>> models) {
method hideModels (line 319) | protected void hideModels(EpoxyModel<?>... models) {
method hideAllAfterModel (line 328) | protected void hideAllAfterModel(EpoxyModel<?> model) {
method getAllModelsAfter (line 339) | protected List<EpoxyModel<?>> getAllModelsAfter(EpoxyModel<?> model) {
method pauseModelListNotifications (line 352) | private void pauseModelListNotifications() {
method resumeModelListNotifications (line 356) | private void resumeModelListNotifications() {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyAsyncUtil.java
class EpoxyAsyncUtil (line 15) | public final class EpoxyAsyncUtil {
method EpoxyAsyncUtil (line 16) | private EpoxyAsyncUtil() {
method getAsyncBackgroundHandler (line 40) | @MainThread
method createHandler (line 57) | public static Handler createHandler(Looper looper, boolean async) {
method buildBackgroundLooper (line 83) | public static Looper buildBackgroundLooper(String threadName) {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyController.java
class EpoxyController (line 47) | public abstract class EpoxyController implements ModelCollector, StickyH...
method EpoxyController (line 108) | public EpoxyController() {
method EpoxyController (line 112) | public EpoxyController(Handler modelBuildingHandler, Handler diffingHa...
method requestModelBuild (line 153) | public void requestModelBuild() {
method hasPendingModelBuild (line 175) | public boolean hasPendingModelBuild() {
method addModelBuildListener (line 191) | public void addModelBuildListener(OnModelBuildFinishedListener listene...
method removeModelBuildListener (line 200) | public void removeModelBuildListener(OnModelBuildFinishedListener list...
method requestDelayedModelBuild (line 223) | public synchronized void requestDelayedModelBuild(int delayMs) {
method cancelPendingModelBuild (line 245) | public synchronized void cancelPendingModelBuild() {
method run (line 259) | @Override
method getExpectedModelCount (line 310) | private int getExpectedModelCount() {
method buildModels (line 328) | protected abstract void buildModels();
method getFirstIndexOfModelInBuildingList (line 330) | int getFirstIndexOfModelInBuildingList(EpoxyModel<?> model) {
method isModelAddedMultipleTimes (line 343) | boolean isModelAddedMultipleTimes(EpoxyModel<?> model) {
method addAfterInterceptorCallback (line 357) | void addAfterInterceptorCallback(ModelInterceptorCallback callback) {
type ModelInterceptorCallback (line 371) | interface ModelInterceptorCallback {
method onInterceptorsStarted (line 372) | void onInterceptorsStarted(EpoxyController controller);
method onInterceptorsFinished (line 373) | void onInterceptorsFinished(EpoxyController controller);
method runInterceptors (line 376) | private void runInterceptors() {
type Interceptor (line 406) | public interface Interceptor {
method intercept (line 417) | void intercept(@NonNull List<EpoxyModel<?>> models);
method addInterceptor (line 428) | public void addInterceptor(@NonNull Interceptor interceptor) {
method removeInterceptor (line 433) | public void removeInterceptor(@NonNull Interceptor interceptor) {
method getModelCountBuiltSoFar (line 445) | protected int getModelCountBuiltSoFar() {
method assertIsBuildingModels (line 450) | private void assertIsBuildingModels() {
method assertNotBuildingModels (line 456) | private void assertNotBuildingModels() {
method add (line 466) | public void add(@NonNull EpoxyModel<?> model) {
method add (line 474) | protected void add(@NonNull EpoxyModel<?>... modelsToAdd) {
method add (line 486) | protected void add(@NonNull List<? extends EpoxyModel<?>> modelsToAdd) {
method addInternal (line 498) | void addInternal(EpoxyModel<?> modelToAdd) {
method setStagedModel (line 530) | void setStagedModel(EpoxyModel<?> model) {
method addCurrentlyStagedModelIfExists (line 538) | void addCurrentlyStagedModelIfExists() {
method clearModelFromStaging (line 545) | void clearModelFromStaging(EpoxyModel<?> model) {
method isBuildingModels (line 553) | protected boolean isBuildingModels() {
method filterDuplicatesIfNeeded (line 557) | private void filterDuplicatesIfNeeded(List<EpoxyModel<?>> models) {
method findPositionOfDuplicate (line 590) | private int findPositionOfDuplicate(List<EpoxyModel<?>> models, EpoxyM...
method setFilterDuplicates (line 612) | public void setFilterDuplicates(boolean filterDuplicates) {
method isDuplicateFilteringEnabled (line 616) | public boolean isDuplicateFilteringEnabled() {
method setGlobalDuplicateFilteringDefault (line 625) | public static void setGlobalDuplicateFilteringDefault(boolean filterDu...
method setDebugLoggingEnabled (line 640) | public void setDebugLoggingEnabled(boolean enabled) {
method isDebugLoggingEnabled (line 657) | public boolean isDebugLoggingEnabled() {
method setGlobalDebugLoggingEnabled (line 667) | public static void setGlobalDebugLoggingEnabled(boolean globalDebugLog...
method moveModel (line 685) | public void moveModel(int fromPosition, int toPosition) {
method notifyModelChanged (line 702) | public void notifyModelChanged(int position) {
method getAdapter (line 713) | @NonNull
method onSaveInstanceState (line 718) | public void onSaveInstanceState(@NonNull Bundle outState) {
method onRestoreInstanceState (line 722) | public void onRestoreInstanceState(@Nullable Bundle inState) {
method getSpanSizeLookup (line 732) | @NonNull
method setSpanCount (line 744) | public void setSpanCount(int spanCount) {
method getSpanCount (line 748) | public int getSpanCount() {
method isMultiSpan (line 752) | public boolean isMultiSpan() {
method onExceptionSwallowed (line 768) | protected void onExceptionSwallowed(@NonNull RuntimeException exceptio...
method onException (line 779) | @Override
method setGlobalExceptionHandler (line 800) | public static void setGlobalExceptionHandler(
type ExceptionHandler (line 805) | public interface ExceptionHandler {
method onException (line 815) | void onException(@NonNull EpoxyController controller, @NonNull Runti...
method onAttachedToRecyclerViewInternal (line 818) | void onAttachedToRecyclerViewInternal(RecyclerView recyclerView) {
method onDetachedFromRecyclerViewInternal (line 847) | void onDetachedFromRecyclerViewInternal(RecyclerView recyclerView) {
method onAttachedToRecyclerView (line 853) | protected void onAttachedToRecyclerView(@NonNull RecyclerView recycler...
method onDetachedFromRecyclerView (line 858) | protected void onDetachedFromRecyclerView(@NonNull RecyclerView recycl...
method onModelBound (line 895) | protected void onModelBound(@NonNull EpoxyViewHolder holder, @NonNull ...
method onModelUnbound (line 905) | protected void onModelUnbound(@NonNull EpoxyViewHolder holder, @NonNul...
method onViewAttachedToWindow (line 915) | protected void onViewAttachedToWindow(@NonNull EpoxyViewHolder holder,
method onViewDetachedFromWindow (line 926) | protected void onViewDetachedFromWindow(@NonNull EpoxyViewHolder holder,
method setupStickyHeaderView (line 940) | @Override
method teardownStickyHeaderView (line 952) | @Override
method isStickyHeader (line 964) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyControllerAdapter.java
class EpoxyControllerAdapter (line 19) | public final class EpoxyControllerAdapter extends BaseEpoxyAdapter imple...
method EpoxyControllerAdapter (line 26) | EpoxyControllerAdapter(@NonNull EpoxyController epoxyController, Handl...
method onExceptionSwallowed (line 36) | @Override
method getCurrentModels (line 41) | @NonNull
method getItemCount (line 47) | @Override
method setModels (line 56) | void setModels(@NonNull ControllerModelList models) {
method isDiffInProgress (line 83) | public boolean isDiffInProgress() {
method onResult (line 88) | @Override
method addModelBuildListener (line 100) | public void addModelBuildListener(OnModelBuildFinishedListener listene...
method removeModelBuildListener (line 104) | public void removeModelBuildListener(OnModelBuildFinishedListener list...
method diffPayloadsEnabled (line 108) | @Override
method onAttachedToRecyclerView (line 113) | @Override
method onDetachedFromRecyclerView (line 119) | @Override
method onViewAttachedToWindow (line 125) | @Override
method onViewDetachedFromWindow (line 131) | @Override
method onModelBound (line 137) | @Override
method onModelUnbound (line 143) | @Override
method getCopyOfModels (line 149) | @NonNull
method getModelAtPosition (line 159) | @NonNull
method getModelById (line 168) | @Nullable
method getModelPosition (line 179) | @Override
method getBoundViewHolders (line 192) | @NonNull
method moveModel (line 198) | @UiThread
method notifyModelChanged (line 216) | @UiThread
method areItemsTheSame (line 235) | @Override
method areContentsTheSame (line 240) | @Override
method getChangePayload (line 245) | @Override
method isStickyHeader (line 255) | @Override
method setupStickyHeaderView (line 264) | @Override
method teardownStickyHeaderView (line 273) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyDiffLogger.java
class EpoxyDiffLogger (line 19) | public class EpoxyDiffLogger extends AdapterDataObserver {
method EpoxyDiffLogger (line 22) | public EpoxyDiffLogger(String tag) {
method onItemRangeChanged (line 26) | @Override
method onItemRangeChanged (line 31) | @Override
method onItemRangeInserted (line 41) | @Override
method onItemRangeRemoved (line 46) | @Override
method onItemRangeMoved (line 51) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyDragCallback.java
type EpoxyDragCallback (line 8) | public interface EpoxyDragCallback<T extends EpoxyModel> extends BaseEpo...
method onDragStarted (line 21) | void onDragStarted(T model, View itemView, int adapterPosition);
method onModelMoved (line 37) | void onModelMoved(int fromPosition, int toPosition, T modelBeingMoved,...
method onDragReleased (line 53) | void onDragReleased(T model, View itemView);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyHolder.java
class EpoxyHolder (line 12) | public abstract class EpoxyHolder {
method EpoxyHolder (line 14) | public EpoxyHolder(@NonNull ViewParent parent) {
method EpoxyHolder (line 18) | public EpoxyHolder() {
method bindView (line 29) | protected abstract void bindView(@NonNull View itemView);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyItemSpacingDecorator.java
class EpoxyItemSpacingDecorator (line 19) | public class EpoxyItemSpacingDecorator extends RecyclerView.ItemDecorati...
method EpoxyItemSpacingDecorator (line 32) | public EpoxyItemSpacingDecorator() {
method EpoxyItemSpacingDecorator (line 36) | public EpoxyItemSpacingDecorator(@Px int pxBetweenItems) {
method setPxBetweenItems (line 40) | public void setPxBetweenItems(@Px int pxBetweenItems) {
method getPxBetweenItems (line 44) | @Px
method getItemOffsets (line 49) | @Override
method calculatePositionDetails (line 89) | private void calculatePositionDetails(RecyclerView parent, int positio...
method shouldReverseLayout (line 111) | private static boolean shouldReverseLayout(LayoutManager layout, boole...
method useBottomPadding (line 123) | private boolean useBottomPadding() {
method useTopPadding (line 132) | private boolean useTopPadding() {
method useRightPadding (line 141) | private boolean useRightPadding() {
method useLeftPadding (line 150) | private boolean useLeftPadding() {
method isInFirstRow (line 159) | private static boolean isInFirstRow(int position, SpanSizeLookup spanS...
method isInLastRow (line 171) | private static boolean isInLastRow(int position, int itemCount, SpanSi...
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModel.java
class EpoxyModel (line 28) | public abstract class EpoxyModel<T> {
method EpoxyModel (line 67) | protected EpoxyModel(long id) {
method EpoxyModel (line 71) | public EpoxyModel() {
method hasDefaultId (line 76) | boolean hasDefaultId() {
method getViewType (line 88) | protected int getViewType() {
method buildView (line 96) | public View buildView(@NonNull ViewGroup parent) {
method preBind (line 133) | public void preBind(@NonNull T view, @Nullable EpoxyModel<?> previousl...
method bind (line 141) | public void bind(@NonNull T view) {
method bind (line 153) | public void bind(@NonNull T view, @NonNull List<Object> payloads) {
method bind (line 188) | public void bind(@NonNull T view, @NonNull EpoxyModel<?> previouslyBou...
method unbind (line 202) | public void unbind(@NonNull T view) {
method onVisibilityStateChanged (line 210) | public void onVisibilityStateChanged(@Visibility int visibilityState, ...
method onVisibilityChanged (line 218) | public void onVisibilityChanged(
method id (line 227) | public long id() {
method id (line 236) | public EpoxyModel<T> id(long id) {
method id (line 253) | public EpoxyModel<T> id(@Nullable Number... ids) {
method id (line 269) | public EpoxyModel<T> id(long id1, long id2) {
method id (line 287) | public EpoxyModel<T> id(@Nullable CharSequence key) {
method id (line 297) | public EpoxyModel<T> id(@Nullable CharSequence key, @Nullable CharSequ...
method id (line 319) | public EpoxyModel<T> id(@Nullable CharSequence key, long id) {
method getDefaultLayout (line 337) | @LayoutRes
method layout (line 340) | @NonNull
method getLayout (line 347) | @LayoutRes
method reset (line 359) | @NonNull
method addTo (line 373) | public void addTo(@NonNull EpoxyController controller) {
method addIf (line 381) | public void addIf(boolean condition, @NonNull EpoxyController controll...
method addIf (line 397) | public void addIf(@NonNull AddPredicate predicate, @NonNull EpoxyContr...
type AddPredicate (line 404) | public interface AddPredicate {
method addIf (line 405) | boolean addIf();
method addWithDebugValidation (line 412) | protected final void addWithDebugValidation(@NonNull EpoxyController c...
method isDebugValidationEnabled (line 449) | boolean isDebugValidationEnabled() {
method onMutation (line 463) | protected final void onMutation() {
method getPosition (line 477) | private static int getPosition(@NonNull EpoxyController controller,
method validateStateHasNotChangedSinceAdded (line 498) | protected final void validateStateHasNotChangedSinceAdded(String descr...
method equals (line 507) | @Override
method hashCode (line 527) | @Override
method getSpanSize (line 543) | public int getSpanSize(int totalSpanCount, int position, int itemCount) {
method spanSizeOverride (line 547) | public EpoxyModel<T> spanSizeOverride(@Nullable SpanSizeOverrideCallba...
type SpanSizeOverrideCallback (line 552) | public interface SpanSizeOverrideCallback {
method getSpanSize (line 553) | int getSpanSize(int totalSpanCount, int position, int itemCount);
method spanSize (line 560) | public final int spanSize(int totalSpanCount, int position, int itemCo...
method show (line 573) | @NonNull
method show (line 583) | @NonNull
method hide (line 595) | @NonNull
method isShown (line 604) | public boolean isShown() {
method shouldSaveViewState (line 611) | public boolean shouldSaveViewState() {
method onFailedToRecycleView (line 624) | public boolean onFailedToRecycleView(@NonNull T view) {
method onViewAttachedToWindow (line 633) | public void onViewAttachedToWindow(@NonNull T view) {
method onViewDetachedFromWindow (line 643) | public void onViewDetachedFromWindow(@NonNull T view) {
method toString (line 647) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelGroup.java
class EpoxyModelGroup (line 61) | @SuppressWarnings("rawtypes")
method EpoxyModelGroup (line 75) | public EpoxyModelGroup(@LayoutRes int layoutRes, Collection<? extends ...
method EpoxyModelGroup (line 83) | public EpoxyModelGroup(@LayoutRes int layoutRes, EpoxyModel<?>... mode...
method EpoxyModelGroup (line 91) | private EpoxyModelGroup(@LayoutRes int layoutRes, List<EpoxyModel<?>> ...
method EpoxyModelGroup (line 114) | protected EpoxyModelGroup() {
method EpoxyModelGroup (line 122) | protected EpoxyModelGroup(@LayoutRes int layoutRes) {
method addModel (line 127) | protected void addModel(@NonNull EpoxyModel<?> model) {
method bind (line 133) | @CallSuper
method bind (line 145) | @CallSuper
method bind (line 157) | @Override
method setViewVisibility (line 184) | private static void setViewVisibility(EpoxyModel model, EpoxyViewHolde...
method unbind (line 192) | @CallSuper
method onViewAttachedToWindow (line 198) | @CallSuper
method onViewDetachedFromWindow (line 210) | @CallSuper
method iterateModels (line 222) | private void iterateModels(ModelGroupHolder holder, IterateModelsCallb...
type IterateModelsCallback (line 231) | private interface IterateModelsCallback {
method onModel (line 232) | void onModel(EpoxyModel model, EpoxyViewHolder viewHolder, int model...
method getSpanSize (line 235) | @Override
method getDefaultLayout (line 241) | @Override
method shouldSaveViewState (line 247) | @NonNull
method shouldSaveViewState (line 254) | @Override
method useViewStubLayoutParams (line 274) | protected boolean useViewStubLayoutParams(EpoxyModel<?> model, int mod...
method createNewHolder (line 278) | @Override
method equals (line 283) | @Override
method hashCode (line 300) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelTouchCallback.java
class EpoxyModelTouchCallback (line 20) | public abstract class EpoxyModelTouchCallback<T extends EpoxyModel>
method EpoxyModelTouchCallback (line 30) | public EpoxyModelTouchCallback(@Nullable EpoxyController controller, C...
method getMovementFlags (line 35) | @Override
method canDropOver (line 55) | @Override
method isTouchableModel (line 62) | protected boolean isTouchableModel(EpoxyModel<?> model) {
method onMove (line 66) | @Override
method onModelMoved (line 90) | @Override
method onSwiped (line 95) | @Override
method onSwipeCompleted (line 110) | @Override
method onSelectedChanged (line 115) | @Override
method markRecyclerViewHasSelection (line 148) | private void markRecyclerViewHasSelection(RecyclerView recyclerView) {
method recyclerViewHasSelection (line 152) | private boolean recyclerViewHasSelection(RecyclerView recyclerView) {
method clearRecyclerViewSelectionMarker (line 156) | private void clearRecyclerViewSelectionMarker(RecyclerView recyclerVie...
method onSwipeStarted (line 160) | @Override
method onSwipeReleased (line 165) | @Override
method onDragStarted (line 170) | @Override
method onDragReleased (line 175) | @Override
method clearView (line 180) | @Override
method clearView (line 199) | @Override
method onChildDraw (line 204) | @Override
method onSwipeProgressChanged (line 239) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelWithHolder.java
class EpoxyModelWithHolder (line 17) | public abstract class EpoxyModelWithHolder<T extends EpoxyHolder> extend...
method EpoxyModelWithHolder (line 19) | public EpoxyModelWithHolder() {
method EpoxyModelWithHolder (line 22) | public EpoxyModelWithHolder(long id) {
method createNewHolder (line 27) | protected abstract T createNewHolder(@NonNull ViewParent parent);
method bind (line 29) | @Override
method bind (line 34) | @Override
method bind (line 39) | @Override
method unbind (line 44) | @Override
method onVisibilityStateChanged (line 50) | @Override
method onVisibilityChanged (line 55) | @Override
method onFailedToRecycleView (line 67) | @Override
method onViewAttachedToWindow (line 72) | @Override
method onViewDetachedFromWindow (line 77) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelWithView.java
class EpoxyModelWithView (line 25) | public abstract class EpoxyModelWithView<T extends View> extends EpoxyMo...
method getViewType (line 33) | @Override
method buildView (line 44) | @Override
method getDefaultLayout (line 47) | @Override
method layout (line 53) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxySwipeCallback.java
type EpoxySwipeCallback (line 11) | public interface EpoxySwipeCallback<T extends EpoxyModel> extends BaseEp...
method onSwipeStarted (line 24) | void onSwipeStarted(T model, View itemView, int adapterPosition);
method onSwipeProgressChanged (line 40) | void onSwipeProgressChanged(T model, View itemView, float swipeProgress,
method onSwipeReleased (line 52) | void onSwipeReleased(T model, View itemView);
method onSwipeCompleted (line 71) | void onSwipeCompleted(T model, View itemView, int position, int direct...
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyTouchHelper.java
class EpoxyTouchHelper (line 37) | public abstract class EpoxyTouchHelper {
method initDragging (line 46) | public static DragBuilder initDragging(EpoxyController controller) {
class DragBuilder (line 50) | public static class DragBuilder {
method DragBuilder (line 54) | private DragBuilder(EpoxyController controller) {
method withRecyclerView (line 63) | public DragBuilder2 withRecyclerView(RecyclerView recyclerView) {
class DragBuilder2 (line 68) | public static class DragBuilder2 {
method DragBuilder2 (line 73) | private DragBuilder2(EpoxyController controller, RecyclerView recycl...
method forVerticalList (line 79) | public DragBuilder3 forVerticalList() {
method forHorizontalList (line 84) | public DragBuilder3 forHorizontalList() {
method forGrid (line 89) | public DragBuilder3 forGrid() {
method withDirections (line 103) | public DragBuilder3 withDirections(int directionFlags) {
class DragBuilder3 (line 108) | public static class DragBuilder3 {
method DragBuilder3 (line 114) | private DragBuilder3(EpoxyController controller, RecyclerView recycl...
method withTarget (line 124) | public <U extends EpoxyModel> DragBuilder4<U> withTarget(Class<U> ta...
method withTargets (line 138) | public DragBuilder4<EpoxyModel> withTargets(Class<? extends EpoxyMod...
method forAllModels (line 149) | public DragBuilder4<EpoxyModel> forAllModels() {
class DragBuilder4 (line 154) | public static class DragBuilder4<U extends EpoxyModel> {
method DragBuilder4 (line 162) | private DragBuilder4(EpoxyController controller,
method andCallbacks (line 187) | public ItemTouchHelper andCallbacks(final DragCallbacks<U> callbacks) {
class DragCallbacks (line 234) | public abstract static class DragCallbacks<T extends EpoxyModel>
method onDragStarted (line 237) | @Override
method onDragReleased (line 242) | @Override
method onModelMoved (line 247) | @Override
method clearView (line 251) | @Override
method isDragEnabledForModel (line 261) | public boolean isDragEnabledForModel(T model) {
method getMovementFlagsForModel (line 265) | @Override
method initSwiping (line 276) | public static SwipeBuilder initSwiping(RecyclerView recyclerView) {
class SwipeBuilder (line 280) | public static class SwipeBuilder {
method SwipeBuilder (line 284) | private SwipeBuilder(RecyclerView recyclerView) {
method right (line 289) | public SwipeBuilder2 right() {
method left (line 294) | public SwipeBuilder2 left() {
method leftAndRight (line 299) | public SwipeBuilder2 leftAndRight() {
method withDirections (line 312) | public SwipeBuilder2 withDirections(int directionFlags) {
class SwipeBuilder2 (line 317) | public static class SwipeBuilder2 {
method SwipeBuilder2 (line 322) | private SwipeBuilder2(RecyclerView recyclerView,
method withTarget (line 332) | public <U extends EpoxyModel> SwipeBuilder3<U> withTarget(Class<U> t...
method withTargets (line 346) | public SwipeBuilder3<EpoxyModel> withTargets(
method forAllModels (line 358) | public SwipeBuilder3<EpoxyModel> forAllModels() {
class SwipeBuilder3 (line 363) | public static class SwipeBuilder3<U extends EpoxyModel> {
method SwipeBuilder3 (line 370) | private SwipeBuilder3(
method andCallbacks (line 393) | public ItemTouchHelper andCallbacks(final SwipeCallbacks<U> callback...
class SwipeCallbacks (line 445) | public abstract static class SwipeCallbacks<T extends EpoxyModel>
method onSwipeStarted (line 448) | @Override
method onSwipeProgressChanged (line 453) | @Override
method onSwipeCompleted (line 459) | @Override
method onSwipeReleased (line 462) | @Override
method clearView (line 467) | @Override
method isSwipeEnabledForModel (line 477) | public boolean isSwipeEnabledForModel(T model) {
method getMovementFlagsForModel (line 481) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyViewHolder.java
class EpoxyViewHolder (line 17) | @SuppressWarnings("WeakerAccess")
method EpoxyViewHolder (line 27) | public EpoxyViewHolder(ViewParent parent, View view, boolean saveIniti...
method restoreInitialViewState (line 40) | void restoreInitialViewState() {
method bind (line 46) | public void bind(@SuppressWarnings("rawtypes") EpoxyModel model,
method objectToBind (line 86) | @NonNull
method unbind (line 91) | public void unbind() {
method visibilityStateChanged (line 100) | public void visibilityStateChanged(@Visibility int visibilityState) {
method visibilityChanged (line 106) | public void visibilityChanged(
method getPayloads (line 118) | public List<Object> getPayloads() {
method getModel (line 123) | public EpoxyModel<?> getModel() {
method getHolder (line 128) | public EpoxyHolder getHolder() {
method assertBound (line 133) | private void assertBound() {
method toString (line 139) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/GeneratedModel.java
type GeneratedModel (line 4) | public interface GeneratedModel<T> {
method handlePreBind (line 11) | void handlePreBind(EpoxyViewHolder holder, T objectToBind, int position);
method handlePostBind (line 21) | void handlePostBind(T objectToBind, int position);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/HandlerExecutor.java
class HandlerExecutor (line 16) | class HandlerExecutor implements Executor {
method HandlerExecutor (line 19) | HandlerExecutor(Handler handler) {
method execute (line 23) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/HiddenEpoxyModel.java
class HiddenEpoxyModel (line 13) | class HiddenEpoxyModel extends EpoxyModel<Space> {
method getDefaultLayout (line 14) | @Override
method getSpanSize (line 19) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/IdUtils.java
class IdUtils (line 8) | public final class IdUtils {
method IdUtils (line 9) | private IdUtils() {
method hashLong64Bit (line 20) | public static long hashLong64Bit(long value) {
method hashString64Bit (line 36) | public static long hashString64Bit(@Nullable CharSequence str) {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/IllegalEpoxyUsage.java
class IllegalEpoxyUsage (line 3) | public class IllegalEpoxyUsage extends RuntimeException {
method IllegalEpoxyUsage (line 4) | public IllegalEpoxyUsage(String message) {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ImmutableModelException.java
class ImmutableModelException (line 8) | class ImmutableModelException extends RuntimeException {
method ImmutableModelException (line 18) | ImmutableModelException(EpoxyModel model, int modelPosition) {
method ImmutableModelException (line 22) | ImmutableModelException(EpoxyModel model,
method buildMessage (line 27) | @NonNull
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ListenersUtils.java
class ListenersUtils (line 10) | public class ListenersUtils {
method getEpoxyHolderForChildView (line 12) | @Nullable
method findParentRecyclerView (line 31) | @Nullable
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/MainThreadExecutor.java
class MainThreadExecutor (line 6) | class MainThreadExecutor extends HandlerExecutor {
method MainThreadExecutor (line 10) | MainThreadExecutor(boolean async) {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ModelList.java
class ModelList (line 19) | class ModelList extends ArrayList<EpoxyModel<?>> {
method ModelList (line 21) | ModelList(int expectedModelCount) {
method ModelList (line 25) | ModelList() {
type ModelListObserver (line 29) | interface ModelListObserver {
method onItemRangeInserted (line 30) | void onItemRangeInserted(int positionStart, int itemCount);
method onItemRangeRemoved (line 31) | void onItemRangeRemoved(int positionStart, int itemCount);
method pauseNotifications (line 37) | void pauseNotifications() {
method resumeNotifications (line 44) | void resumeNotifications() {
method setObserver (line 51) | void setObserver(ModelListObserver observer) {
method notifyInsertion (line 55) | private void notifyInsertion(int positionStart, int itemCount) {
method notifyRemoval (line 61) | private void notifyRemoval(int positionStart, int itemCount) {
method set (line 67) | @Override
method add (line 79) | @Override
method add (line 85) | @Override
method addAll (line 91) | @Override
method addAll (line 97) | @Override
method remove (line 103) | @Override
method remove (line 109) | @Override
method clear (line 122) | @Override
method removeRange (line 130) | @Override
method removeAll (line 140) | @Override
method retainAll (line 156) | @Override
method iterator (line 172) | @NonNull
class Itr (line 184) | private class Itr implements Iterator<EpoxyModel<?>> {
method hasNext (line 189) | public boolean hasNext() {
method next (line 193) | @SuppressWarnings("unchecked")
method remove (line 202) | public void remove() {
method checkForComodification (line 218) | final void checkForComodification() {
method listIterator (line 225) | @NonNull
method listIterator (line 231) | @NonNull
class ListItr (line 243) | private class ListItr extends Itr implements ListIterator<EpoxyModel<?...
method ListItr (line 244) | ListItr(int index) {
method hasPrevious (line 248) | public boolean hasPrevious() {
method nextIndex (line 252) | public int nextIndex() {
method previousIndex (line 256) | public int previousIndex() {
method previous (line 260) | @SuppressWarnings("unchecked")
method set (line 273) | public void set(EpoxyModel<?> e) {
method add (line 286) | public void add(EpoxyModel<?> e) {
method subList (line 301) | @NonNull
class SubList (line 319) | private static class SubList extends AbstractList<EpoxyModel<?>> {
class SubListIterator (line 324) | private static final class SubListIterator implements ListIterator<E...
method SubListIterator (line 330) | SubListIterator(ListIterator<EpoxyModel<?>> it, SubList list, int ...
method add (line 337) | public void add(EpoxyModel<?> object) {
method hasNext (line 343) | public boolean hasNext() {
method hasPrevious (line 347) | public boolean hasPrevious() {
method next (line 351) | public EpoxyModel<?> next() {
method nextIndex (line 358) | public int nextIndex() {
method previous (line 362) | public EpoxyModel<?> previous() {
method previousIndex (line 369) | public int previousIndex() {
method remove (line 377) | public void remove() {
method set (line 383) | public void set(EpoxyModel<?> object) {
method SubList (line 388) | SubList(ModelList list, int start, int end) {
method add (line 395) | @Override
method addAll (line 410) | @Override
method addAll (line 426) | @Override
method get (line 439) | @Override
method iterator (line 450) | @NonNull
method listIterator (line 456) | @NonNull
method remove (line 468) | @Override
method removeRange (line 482) | @Override
method set (line 495) | @Override
method size (line 506) | @Override
method sizeChanged (line 514) | void sizeChanged(boolean increment) {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ModelState.java
class ModelState (line 4) | class ModelState {
method build (line 27) | static ModelState build(EpoxyModel<?> model, int position, boolean imm...
method pairWithSelf (line 48) | void pairWithSelf() {
method toString (line 62) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/NoOpControllerHelper.java
class NoOpControllerHelper (line 7) | class NoOpControllerHelper extends ControllerHelper<EpoxyController> {
method resetAutoModels (line 9) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/NoOpTimer.java
class NoOpTimer (line 3) | class NoOpTimer implements Timer {
method start (line 4) | @Override
method stop (line 9) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/NotifyBlocker.java
class NotifyBlocker (line 12) | class NotifyBlocker extends AdapterDataObserver {
method allowChanges (line 16) | void allowChanges() {
method blockChanges (line 20) | void blockChanges() {
method onChanged (line 24) | @Override
method onItemRangeChanged (line 32) | @Override
method onItemRangeChanged (line 37) | @Override
method onItemRangeInserted (line 42) | @Override
method onItemRangeRemoved (line 47) | @Override
method onItemRangeMoved (line 52) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelBoundListener.java
type OnModelBoundListener (line 4) | public interface OnModelBoundListener<T extends EpoxyModel<?>, V> {
method onModelBound (line 13) | void onModelBound(T model, V view, int position);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelBuildFinishedListener.java
type OnModelBuildFinishedListener (line 9) | public interface OnModelBuildFinishedListener {
method onModelBuildFinished (line 14) | void onModelBuildFinished(@NonNull DiffResult result);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelCheckedChangeListener.java
type OnModelCheckedChangeListener (line 5) | public interface OnModelCheckedChangeListener<T extends EpoxyModel<?>, V> {
method onChecked (line 16) | void onChecked(T model, V parentView,
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelClickListener.java
type OnModelClickListener (line 6) | public interface OnModelClickListener<T extends EpoxyModel<?>, V> {
method onClick (line 16) | void onClick(T model, V parentView, View clickedView, int position);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelLongClickListener.java
type OnModelLongClickListener (line 5) | public interface OnModelLongClickListener<T extends EpoxyModel<?>, V> {
method onLongClick (line 15) | boolean onLongClick(T model, V parentView, View clickedView, int posit...
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelUnboundListener.java
type OnModelUnboundListener (line 4) | public interface OnModelUnboundListener<T extends EpoxyModel<?>, V> {
method onModelUnbound (line 9) | void onModelUnbound(T model, V view);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelVisibilityChangedListener.java
type OnModelVisibilityChangedListener (line 7) | public interface OnModelVisibilityChangedListener<T extends EpoxyModel<V...
method onVisibilityChanged (line 24) | void onVisibilityChanged(T model, V view,
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelVisibilityStateChangedListener.java
type OnModelVisibilityStateChangedListener (line 6) | public interface OnModelVisibilityStateChangedListener<T extends EpoxyMo...
method onVisibilityStateChanged (line 17) | void onVisibilityStateChanged(T model, V view, @Visibility int visibil...
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/QuantityStringResAttribute.java
class QuantityStringResAttribute (line 10) | public class QuantityStringResAttribute {
method QuantityStringResAttribute (line 15) | public QuantityStringResAttribute(@PluralsRes int id, int quantity,
method QuantityStringResAttribute (line 22) | public QuantityStringResAttribute(int id, int quantity) {
method getId (line 26) | @PluralsRes
method getQuantity (line 31) | public int getQuantity() {
method getFormatArgs (line 35) | @Nullable
method toString (line 40) | public CharSequence toString(Context context) {
method equals (line 48) | @Override
method hashCode (line 69) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/SimpleEpoxyAdapter.java
class SimpleEpoxyAdapter (line 11) | public class SimpleEpoxyAdapter extends EpoxyAdapter {
method getModels (line 13) | public List<EpoxyModel<?>> getModels() {
method enableDiffing (line 17) | @Override
method notifyModelsChanged (line 22) | @Override
method getBoundViewHolders (line 27) | @Override
method notifyModelChanged (line 32) | @Override
method addModels (line 37) | @Override
method addModels (line 42) | @Override
method insertModelBefore (line 47) | @Override
method insertModelAfter (line 52) | @Override
method removeModel (line 57) | @Override
method removeAllModels (line 62) | @Override
method removeAllAfterModel (line 67) | @Override
method showModel (line 72) | @Override
method showModel (line 77) | @Override
method showModels (line 82) | @Override
method showModels (line 87) | @Override
method showModels (line 92) | @Override
method showModels (line 97) | @Override
method hideModel (line 102) | @Override
method hideModels (line 107) | @Override
method hideModels (line 112) | @Override
method hideAllAfterModel (line 117) | @Override
method getAllModelsAfter (line 122) | @Override
method getModelPosition (line 127) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/SimpleEpoxyController.java
class SimpleEpoxyController (line 9) | public class SimpleEpoxyController extends EpoxyController {
method setModels (line 17) | public void setModels(List<? extends EpoxyModel<?>> models) {
method requestModelBuild (line 24) | @Override
method buildModels (line 33) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/SimpleEpoxyModel.java
class SimpleEpoxyModel (line 15) | public class SimpleEpoxyModel extends EpoxyModel<View> {
method SimpleEpoxyModel (line 20) | public SimpleEpoxyModel(@LayoutRes int layoutRes) {
method onClick (line 24) | public SimpleEpoxyModel onClick(View.OnClickListener listener) {
method span (line 29) | public SimpleEpoxyModel span(int span) {
method bind (line 34) | @CallSuper
method unbind (line 42) | @CallSuper
method getDefaultLayout (line 49) | @Override
method getSpanSize (line 54) | @Override
method equals (line 59) | @Override
method hashCode (line 83) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/StringAttributeData.java
class StringAttributeData (line 11) | public class StringAttributeData {
method StringAttributeData (line 22) | public StringAttributeData() {
method StringAttributeData (line 28) | public StringAttributeData(@Nullable CharSequence defaultString) {
method StringAttributeData (line 35) | public StringAttributeData(@StringRes int defaultStringRes) {
method setValue (line 42) | public void setValue(@Nullable CharSequence string) {
method setValue (line 48) | public void setValue(@StringRes int stringRes) {
method setValue (line 52) | public void setValue(@StringRes int stringRes, @Nullable Object[] form...
method handleInvalidStringRes (line 63) | private void handleInvalidStringRes() {
method setValue (line 75) | public void setValue(@PluralsRes int pluralRes, int quantity, @Nullabl...
method toString (line 87) | public CharSequence toString(Context context) {
method equals (line 105) | @Override
method hashCode (line 132) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/StyleBuilderCallback.java
type StyleBuilderCallback (line 7) | public interface StyleBuilderCallback<T> {
method buildStyle (line 8) | void buildStyle(T builder);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/Timer.java
type Timer (line 3) | interface Timer {
method start (line 4) | void start(String sectionName);
method stop (line 5) | void stop();
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/Typed2EpoxyController.java
class Typed2EpoxyController (line 19) | public abstract class Typed2EpoxyController<T, U> extends EpoxyController {
method Typed2EpoxyController (line 25) | public Typed2EpoxyController() {
method Typed2EpoxyController (line 28) | public Typed2EpoxyController(Handler modelBuildingHandler, Handler dif...
method setData (line 36) | public void setData(T data1, U data2) {
method requestModelBuild (line 44) | @Override
method moveModel (line 54) | @Override
method requestDelayedModelBuild (line 61) | @Override
method buildModels (line 71) | @Override
method buildModels (line 81) | protected abstract void buildModels(T data1, U data2);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/Typed3EpoxyController.java
class Typed3EpoxyController (line 19) | public abstract class Typed3EpoxyController<T, U, V> extends EpoxyContro...
method Typed3EpoxyController (line 26) | public Typed3EpoxyController() {
method Typed3EpoxyController (line 29) | public Typed3EpoxyController(Handler modelBuildingHandler, Handler dif...
method setData (line 37) | public void setData(T data1, U data2, V data3) {
method requestModelBuild (line 46) | @Override
method moveModel (line 56) | @Override
method requestDelayedModelBuild (line 63) | @Override
method buildModels (line 73) | @Override
method buildModels (line 83) | protected abstract void buildModels(T data1, U data2, V data3);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/Typed4EpoxyController.java
class Typed4EpoxyController (line 19) | public abstract class Typed4EpoxyController<T, U, V, W> extends EpoxyCon...
method Typed4EpoxyController (line 27) | public Typed4EpoxyController() {
method Typed4EpoxyController (line 30) | public Typed4EpoxyController(Handler modelBuildingHandler, Handler dif...
method setData (line 38) | public void setData(T data1, U data2, V data3, W data4) {
method requestModelBuild (line 48) | @Override
method moveModel (line 58) | @Override
method requestDelayedModelBuild (line 65) | @Override
method buildModels (line 75) | @Override
method buildModels (line 85) | protected abstract void buildModels(T data1, U data2, V data3, W data4);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/TypedEpoxyController.java
class TypedEpoxyController (line 20) | public abstract class TypedEpoxyController<T> extends EpoxyController {
method TypedEpoxyController (line 24) | public TypedEpoxyController() {
method TypedEpoxyController (line 27) | public TypedEpoxyController(Handler modelBuildingHandler, Handler diff...
method setData (line 31) | public final void setData(T data) {
method requestModelBuild (line 38) | @Override
method moveModel (line 48) | @Override
method requestDelayedModelBuild (line 55) | @Override
method getCurrentData (line 65) | @Nullable
method buildModels (line 70) | @Override
method buildModels (line 80) | protected abstract void buildModels(T data);
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/UpdateOp.java
class UpdateOp (line 12) | class UpdateOp {
method UpdateOp (line 30) | private UpdateOp() {
method instance (line 33) | static UpdateOp instance(@Type int type, int positionStart, int itemCo...
method positionEnd (line 47) | int positionEnd() {
method isAfter (line 51) | boolean isAfter(int position) {
method isBefore (line 55) | boolean isBefore(int position) {
method contains (line 59) | boolean contains(int position) {
method addPayload (line 63) | void addPayload(@Nullable EpoxyModel<?> payload) {
method toString (line 80) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/UpdateOpHelper.java
class UpdateOpHelper (line 16) | class UpdateOpHelper {
method reset (line 29) | void reset() {
method add (line 39) | void add(int indexToInsert) {
method add (line 43) | void add(int startPosition, int itemCount) {
method update (line 59) | void update(int indexToChange) {
method update (line 63) | void update(final int indexToChange, EpoxyModel<?> payload) {
method remove (line 85) | void remove(int indexToRemove) {
method remove (line 89) | void remove(int startPosition, int itemCount) {
method isLastOp (line 113) | private boolean isLastOp(@UpdateOp.Type int updateType) {
method addNewOperation (line 117) | private void addNewOperation(@Type int type, int position, int itemCou...
method addNewOperation (line 121) | private void addNewOperation(@Type int type, int position, int itemCount,
method addItemsToLastOperation (line 127) | private void addItemsToLastOperation(int numItemsToAdd, EpoxyModel<?> ...
method move (line 132) | void move(int from, int to) {
method getNumRemovals (line 140) | int getNumRemovals() {
method hasRemovals (line 144) | boolean hasRemovals() {
method getNumInsertions (line 148) | int getNumInsertions() {
method hasInsertions (line 152) | boolean hasInsertions() {
method getNumMoves (line 156) | int getNumMoves() {
method getNumInsertionBatches (line 160) | int getNumInsertionBatches() {
method getNumRemovalBatches (line 164) | int getNumRemovalBatches() {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ViewHolderState.java
class ViewHolderState (line 32) | @SuppressWarnings("WeakerAccess")
method ViewHolderState (line 34) | ViewHolderState() {
method ViewHolderState (line 37) | private ViewHolderState(int size) {
method describeContents (line 41) | @Override
method writeToParcel (line 46) | @Override
method newArray (line 58) | public ViewHolderState[] newArray(int size) {
method createFromParcel (line 62) | public ViewHolderState createFromParcel(Parcel source) {
method hasStateForHolder (line 76) | public boolean hasStateForHolder(EpoxyViewHolder holder) {
method save (line 80) | public void save(Collection<EpoxyViewHolder> holders) {
method save (line 87) | public void save(EpoxyViewHolder holder) {
method restore (line 108) | public void restore(EpoxyViewHolder holder) {
class ViewState (line 127) | public static class ViewState extends SparseArray<Parcelable> implemen...
method ViewState (line 129) | ViewState() {
method ViewState (line 132) | private ViewState(int size, int[] keys, Parcelable[] values) {
method save (line 139) | public void save(View view) {
method restore (line 147) | public void restore(View view) {
method setIdIfNoneExists (line 161) | private void setIdIfNoneExists(View view) {
method describeContents (line 167) | @Override
method writeToParcel (line 172) | @Override
method createFromParcel (line 188) | @Override
method createFromParcel (line 197) | @Override
method newArray (line 202) | @Override
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/ViewTypeManager.java
class ViewTypeManager (line 9) | class ViewTypeManager {
method resetMapForTesting (line 24) | @VisibleForTesting
method getViewTypeAndRememberModel (line 29) | int getViewTypeAndRememberModel(EpoxyModel<?> model) {
method getViewType (line 34) | static int getViewType(EpoxyModel<?> model) {
method getModelForViewType (line 69) | EpoxyModel<?> getModelForViewType(BaseEpoxyAdapter adapter, int viewTy...
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/VisibilityState.java
class VisibilityState (line 8) | public final class VisibilityState {
FILE: epoxy-adapter/src/main/java/com/airbnb/epoxy/WrappedEpoxyModelCheckedChangeListener.java
class WrappedEpoxyModelCheckedChangeListener (line 12) | public class WrappedEpoxyModelCheckedChangeListener<T extends EpoxyModel...
method WrappedEpoxyModelCheckedChangeListener (line 17) | public WrappedEpoxyModelCheckedChangeListener(
method onCheckedChanged (line 27) | @Override
method equals (line 48) | @Override
method hashCode (line 63) | @Override
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/DiffPayloadTest.java
class DiffPayloadTest (line 25) | @RunWith(RobolectricTestRunner.class)
method before (line 32) | @Before
method payloadsDisabled (line 52) | @Test
method noPayloadsForNoChanges (line 70) | @Test
method singlePayload (line 86) | @Test
method batchPayload (line 105) | @Test
method multiplePayloads (line 127) | @Test
method getSingleModelFromPayload (line 151) | @Test
method returnsNullWhenNoModelFoundInPayload (line 160) | @Test
method returnsNullForEmptyPayload (line 169) | @Test
method getMultipleModelsFromPayload (line 177) | @Test
method getSingleModelsFromMultipleDiffPayloads (line 190) | @Test
method getMultipleModelsFromMultipleDiffPayloads (line 207) | @Test
class DiffPayloadMatcher (line 230) | static class DiffPayloadMatcher implements ArgumentMatcher<DiffPayload> {
method DiffPayloadMatcher (line 234) | DiffPayloadMatcher(EpoxyModel<?>... changedModels) {
method matches (line 239) | @Override
method diffPayloadWithModels (line 245) | static DiffPayload diffPayloadWithModels(EpoxyModel<?>... models) {
method payloadsWithDiffPayloads (line 250) | static List<Object> payloadsWithDiffPayloads(DiffPayload... diffPayloa...
method payloadsWithChangedModels (line 255) | static List<Object> payloadsWithChangedModels(EpoxyModel<?>... models) {
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/DifferCorrectnessTest.java
class DifferCorrectnessTest (line 26) | @RunWith(RobolectricTestRunner.class)
method beforeClass (line 41) | @BeforeClass
method afterClass (line 48) | @AfterClass
method setUp (line 60) | @Before
method noChange (line 67) | @Test
method simpleUpdate (line 72) | @Test
method updateStart (line 81) | @Test
method updateMiddle (line 90) | @Test
method updateEnd (line 99) | @Test
method shuffle (line 108) | @Test
method swapEnds (line 140) | @Test
method moveFrontToEnd (line 153) | @Test
method moveEndToFront (line 164) | @Test
method moveEndToFrontAndChangeValues (line 175) | @Test
method swapHalf (line 187) | @Test
method reverse (line 200) | @Test
method removeAll (line 209) | @Test
method removeEnd (line 218) | @Test
method removeMiddle (line 229) | @Test
method removeStart (line 239) | @Test
method multipleRemovals (line 249) | @Test
method simpleAdd (line 264) | @Test
method addToStart (line 270) | @Test
method addToMiddle (line 279) | @Test
method addToEnd (line 288) | @Test
method multipleInsertions (line 297) | @Test
method moveTwoInFrontOfInsertion (line 309) | @Test
method randomCombinations (line 325) | @Test
method modifyModelsRandomly (line 354) | private void modifyModelsRandomly(List<EpoxyModel<?>> models, int maxB...
method diffAndValidate (line 394) | private void diffAndValidate() {
method diffAndValidateWithOpCount (line 398) | private void diffAndValidateWithOpCount(int expectedOperationCount) {
method randInt (line 420) | private static int randInt(int min, int max, Random rand) {
method log (line 426) | private void log(String text) {
method log (line 430) | private void log(String text, boolean forceShow) {
method checkDiff (line 436) | private void checkDiff(List<TestModel> modelsBeforeDiff, List<TestMode...
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/DifferNotifyTest.java
class DifferNotifyTest (line 20) | @RunWith(RobolectricTestRunner.class)
method notifyChange (line 29) | @Test(expected = UnsupportedOperationException.class)
method notifyAddedToEmpty (line 34) | @Test
method notifyAddedToStart (line 41) | @Test
method notifyAddedToEnd (line 50) | @Test
method notifyAddedToMiddle (line 59) | @Test
method notifyRemoveAll (line 68) | @Test
method notifyRemoveStart (line 77) | @Test
method notifyRemoveMiddle (line 86) | @Test
method notifyRemoveEnd (line 95) | @Test
method notifyFrontMovedToEnd (line 104) | @Test
method notifyEndMovedToFront (line 114) | @Test
method notifyMiddleMovedToEnd (line 124) | @Test
method notifyMiddleMovedToFront (line 134) | @Test
method notifyValuesUpdated (line 144) | @Test
method addInitialModels (line 158) | private void addInitialModels() {
method assertCorrectness (line 163) | private void assertCorrectness() {
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyAdapterTest.java
class EpoxyAdapterTest (line 26) | @RunWith(RobolectricTestRunner.class)
method setup (line 34) | @Before
method testAddModel (line 40) | @Test
method testAddModels (line 52) | @Test
method testAddModelsVarArgs (line 72) | @Test
method testNotifyModelChanged (line 85) | @Test
method testNotifyModelChangedWithPayload (line 95) | @Test
method testInsertModelBeforeThrowsForInvalidModel (line 106) | @Test(expected = IllegalStateException.class)
method testInsertModelBefore (line 111) | @Test()
method testInsertModelAfterThrowsForInvalidModel (line 124) | @Test(expected = IllegalStateException.class)
method testInsertModelAfter (line 129) | @Test()
method testRemoveModels (line 142) | @Test
method testRemoveAllModels (line 154) | @Test
method testRemoveAllAfterModels (line 168) | @Test
method testShowModel (line 184) | @Test
method testShowModels (line 197) | @Test
method testShowModelsVarArgs (line 216) | @Test
method testShowModelsConditionalTrue (line 235) | @Test
method testShowModelsVarArgsConditionalTrue (line 254) | @Test
method testShowModelsConditionalFalse (line 273) | @Test
method testShowModelsVarArgsConditionalFalse (line 288) | @Test
method testShowModelNoopIfAlreadyShown (line 303) | @Test
method testHideModel (line 313) | @Test
method testHideModels (line 325) | @Test
method testHideModelsVarArgs (line 340) | @Test
method testHideAllAfterModel (line 355) | @Test
method testThrowIfChangeModelIdAfterNotify (line 378) | @Test
method testAllowSetSameModelIdAfterNotify (line 390) | @Test
method testThrowIfChangeModelIdAfterDiff (line 399) | @Test
method checkDifferState (line 413) | private void checkDifferState() {
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyControllerTest.java
class EpoxyControllerTest (line 24) | @RunWith(RobolectricTestRunner.class)
method basicBuildModels (line 30) | @Test
method addingSameModelTwiceThrows (line 56) | @Test(expected = IllegalEpoxyUsage.class)
method filterDuplicates (line 72) | @Test
method exceptionSwallowedWhenDuplicateFiltered (line 96) | @Test
method interceptorRunsAfterBuildModels (line 125) | @Test
method interceptorCanAddModels (line 150) | @Test
method savedModelsCannotBeAddedToLater (line 173) | @Test(expected = IllegalStateException.class)
method interceptorCanModifyModels (line 196) | @Test
method interceptorsRunInOrderAdded (line 218) | @Test
method moveModel (line 250) | @Test
method moveModelOtherWay (line 284) | @Test
method multipleMoves (line 318) | @Test
method testDuplicateFilteringDisabledByDefault (line 351) | @Test
method testDuplicateFilteringCanBeToggled (line 364) | @Test
method testGlobalDuplicateFilteringDefault (line 383) | @Test
method testDebugLoggingCanBeToggled (line 407) | @Test
method testGlobalDebugLoggingDefault (line 426) | @Test
method testModelBuildListener (line 450) | @Test
method testRemoveModelBuildListener (line 468) | @Test
method testDiffInProgress (line 487) | @Test
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/InsertedModel.java
class InsertedModel (line 3) | class InsertedModel extends TestModel {
method getDefaultLayout (line 6) | @Override
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/ModelListTest.java
class ModelListTest (line 21) | @RunWith(RobolectricTestRunner.class)
method before (line 27) | @Before
method testSet (line 36) | @Test
method testSetSameIdDoesntNotify (line 44) | @Test
method testAdd (line 54) | @Test
method testAddAtIndex (line 63) | @Test
method testAddAll (line 72) | @Test
method testAddAllAtIndex (line 82) | @Test
method testRemoveIndex (line 92) | @Test
method testRemoveObject (line 101) | @Test
method testRemoveObjectNotAdded (line 113) | @Test
method testClear (line 120) | @Test
method testClearWhenAlreadyEmpty (line 126) | @Test
method testSublistClear (line 134) | @Test
method testNoClearWhenEmpty (line 140) | @Test
method testRemoveRange (line 148) | @Test
method testRemoveEmptyRange (line 155) | @Test
method testIteratorRemove (line 161) | @Test
method testRemoveAll (line 170) | @Test
method testRetainAll (line 180) | @Test
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/ModelTestUtils.java
class ModelTestUtils (line 6) | class ModelTestUtils {
method changeValues (line 9) | static void changeValues(List models) {
method changeValues (line 13) | static void changeValues(List models, int start, int count) {
method changeValue (line 19) | static void changeValue(EpoxyModel<?> model) {
method remove (line 23) | static void remove(List models, int start, int count) {
method removeModelsAfterPosition (line 27) | static void removeModelsAfterPosition(List models, int start) {
method addModels (line 31) | static void addModels(List list) {
method addModels (line 35) | static void addModels(int count, List list) {
method addModels (line 39) | static void addModels(List list, int index) {
method addModels (line 43) | static void addModels(int count, List list, int index) {
method convertToGenericModels (line 52) | static List<EpoxyModel<?>> convertToGenericModels(List<TestModel> list) {
method convertToTestModels (line 60) | static List<TestModel> convertToTestModels(List<EpoxyModel<?>> list) {
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/TestAdapter.java
class TestAdapter (line 3) | class TestAdapter extends EpoxyAdapter {
method TestAdapter (line 5) | TestAdapter() {
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/TestModel.java
class TestModel (line 7) | public class TestModel extends EpoxyModel<View> {
method TestModel (line 12) | public TestModel() {
method TestModel (line 19) | public TestModel(long id) {
method randomizeValue (line 24) | TestModel randomizeValue() {
method getDefaultLayout (line 29) | @Override
method value (line 34) | TestModel value(int value) {
method incrementValue (line 39) | TestModel incrementValue() {
method value (line 44) | int value() {
method equals (line 48) | @Override
method hashCode (line 65) | @Override
method clone (line 72) | public TestModel clone() {
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/TestObserver.java
class TestObserver (line 8) | class TestObserver extends RecyclerView.AdapterDataObserver
method TestObserver (line 15) | TestObserver(boolean showLogs) {
method TestObserver (line 19) | TestObserver() {
method setUpForNextDiff (line 23) | void setUpForNextDiff(List<TestModel> models) {
method onItemRangeChanged (line 28) | @Override
method onItemRangeInserted (line 39) | @Override
method onItemRangeRemoved (line 53) | @Override
method onItemRangeMoved (line 62) | @Override
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/TypedEpoxyControllerTest.java
class TypedEpoxyControllerTest (line 12) | @RunWith(RobolectricTestRunner.class)
class TestTypedController (line 16) | static class TestTypedController extends TypedEpoxyController<String> {
method buildModels (line 19) | @Override
method setData (line 26) | @Test
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/UpdateOpHelperTest.java
class UpdateOpHelperTest (line 12) | @RunWith(RobolectricTestRunner.class)
method insertionBatch (line 17) | @Test
method insertionMultipleBatches (line 37) | @Test
method insertionBatchRanges (line 63) | @Test
method removeBatch (line 78) | @Test
method removeMultipleBatches (line 97) | @Test
method removeBatchRange (line 119) | @Test
method update (line 134) | @Test
method updateMultipleBatches (line 154) | @Test
method moves (line 183) | @Test
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/ViewTypeManagerIntegrationTest.java
class ViewTypeManagerIntegrationTest (line 21) | @RunWith(RobolectricTestRunner.class)
method resetViewTypeMap (line 24) | @Before
class TestModel (line 29) | static class TestModel extends EpoxyModelWithView<View> {
method buildView (line 30) | @Override
class ModelWithViewType (line 36) | static class ModelWithViewType extends TestModel {
method getViewType (line 38) | @Override
class ModelWithViewType2 (line 44) | static class ModelWithViewType2 extends TestModel {
method getViewType (line 46) | @Override
method modelWithLayout (line 52) | @Test
class ModelWithoutViewType (line 63) | static class ModelWithoutViewType extends TestModel {}
class ModelWithoutViewType2 (line 65) | static class ModelWithoutViewType2 extends TestModel {}
class ModelWithoutViewType3 (line 67) | static class ModelWithoutViewType3 extends TestModel {}
method modelsWithoutLayoutHaveViewTypesGenerated (line 69) | @Test
method fastModelLookupOfLastModel (line 91) | @Test
method fallbackLookupOfUnknownModel (line 106) | @Test
method viewTypesSharedAcrossAdapters (line 121) | @Test
FILE: epoxy-adapter/src/test/java/com/airbnb/epoxy/test/CarouselTest.java
class CarouselTest (line 17) | @RunWith(RobolectricTestRunner.class)
method testOverrideGlobalSnapHelper (line 20) | @Test
method testODisableGlobalSnapHelper (line 31) | @Test
FILE: epoxy-annotations/src/main/java/com/airbnb/epoxy/EpoxyAttribute.java
type Option (line 20) | enum Option {
FILE: epoxy-annotations/src/main/java/com/airbnb/epoxy/ModelProp.java
type Option (line 28) | enum Option {
FILE: epoxy-annotations/src/main/java/com/airbnb/epoxy/ModelView.java
type Size (line 28) | enum Size {
FILE: epoxy-annotations/src/main/java/com/airbnb/epoxy/PackageModelViewConfig.java
type Option (line 86) | enum Option {
FILE: epoxy-databinding/src/main/java/com/airbnb/epoxy/DataBindingEpoxyModel.java
class DataBindingEpoxyModel (line 37) | public abstract class DataBindingEpoxyModel extends EpoxyModelWithHolder...
method buildView (line 39) | @Override
method bind (line 48) | @Override
method bind (line 54) | @Override
method bind (line 60) | @Override
method setDataBindingVariables (line 74) | protected abstract void setDataBindingVariables(ViewDataBinding binding);
method setDataBindingVariables (line 84) | protected void setDataBindingVariables(ViewDataBinding dataBinding,
method setDataBindingVariables (line 89) | protected void setDataBindingVariables(ViewDataBinding dataBinding, Li...
method unbind (line 93) | @Override
method createNewHolder (line 98) | @Override
class DataBindingHolder (line 103) | public static class DataBindingHolder extends EpoxyHolder {
method getDataBinding (line 106) | public ViewDataBinding getDataBinding() {
method bindView (line 110) | @Override
FILE: epoxy-glide-preloader/src/androidTest/java/com/airbnb/epoxy/preloader/ExampleInstrumentedTest.java
class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
method useAppContext (line 19) | @Test
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/AdapterWithFieldAssigned.java
class AdapterWithFieldAssigned (line 6) | public class AdapterWithFieldAssigned extends EpoxyController {
method buildModels (line 10) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/AdapterWithIdChanged.java
class AdapterWithIdChanged (line 6) | public class AdapterWithIdChanged extends EpoxyController {
method buildModels (line 10) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/BasicAutoModelsAdapter.java
class BasicAutoModelsAdapter (line 6) | public class BasicAutoModelsAdapter extends EpoxyController {
method buildModels (line 11) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ControllerWithAutoModel.java
class ControllerWithAutoModel (line 6) | public class ControllerWithAutoModel extends EpoxyController {
method buildModels (line 10) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ControllerWithoutImplicityAdding.java
class ControllerWithoutImplicityAdding (line 6) | public class ControllerWithoutImplicityAdding extends EpoxyController {
method buildModels (line 9) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/EpoxyDataBindingConfig.java
type EpoxyDataBindingConfig (line 6) | @EpoxyDataBindingPattern(rClass = R.class, layoutPrefix = "view_holder")
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/Model.java
class Model (line 11) | @EpoxyModelClass
method getDefaultLayout (line 15) | @Override
method bind (line 20) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelChangesDuringBind.java
class ModelChangesDuringBind (line 10) | public class ModelChangesDuringBind extends EpoxyModel<View> {
method getDefaultLayout (line 13) | @Override
method bind (line 18) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelGroupWithAnnotation.java
class ModelGroupWithAnnotation (line 13) | @EpoxyModelClass
method ModelGroupWithAnnotation (line 17) | public ModelGroupWithAnnotation(List<? extends EpoxyModel<?>> models) {
method bind (line 21) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelWithCheckedChangeListener.java
class ModelWithCheckedChangeListener (line 12) | public class ModelWithCheckedChangeListener extends EpoxyModel<View> {
method getDefaultLayout (line 16) | @Override
method bind (line 21) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelWithClickListener.java
class ModelWithClickListener (line 10) | public class ModelWithClickListener extends EpoxyModel<View> {
method getDefaultLayout (line 14) | @Override
method bind (line 19) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelWithConstructors.java
class ModelWithConstructors (line 14) | @EpoxyModelClass
method ModelWithConstructors (line 18) | public ModelWithConstructors(long id, int value) {
method ModelWithConstructors (line 23) | public ModelWithConstructors(int value) {
method ModelWithConstructors (line 27) | public ModelWithConstructors(long id) {
method ModelWithConstructors (line 32) | public ModelWithConstructors(
method getDefaultLayout (line 73) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelWithLongClickListener.java
class ModelWithLongClickListener (line 10) | public class ModelWithLongClickListener extends EpoxyModel<View> {
method getDefaultLayout (line 14) | @Override
method bind (line 19) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelWithNoGeneratedClass.java
class ModelWithNoGeneratedClass (line 11) | public abstract class ModelWithNoGeneratedClass extends EpoxyModel<View> {
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelsWithCustomTypes.java
class ModelsWithCustomTypes (line 15) | class ModelsWithCustomTypes {
class ModelWithCustomType (line 17) | @EpoxyModelClass
method ModelWithCustomType (line 20) | public ModelWithCustomType() {
method getDefaultLayout (line 23) | @Override
class BaseModelWithCustomType (line 29) | abstract static class BaseModelWithCustomType<U extends View> extends ...
method BaseModelWithCustomType (line 31) | public BaseModelWithCustomType() {
method testMethod (line 34) | public void testMethod(U param) {
method getDefaultLayout (line 38) | @Override
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ViewWithAnnotationsForIntegrationTest.java
class ViewWithAnnotationsForIntegrationTest (line 14) | @ModelView(defaultLayout = R.layout.view_with_annotations_for_integratio...
method ViewWithAnnotationsForIntegrationTest (line 23) | public ViewWithAnnotationsForIntegrationTest(Context context) {
method ViewWithAnnotationsForIntegrationTest (line 27) | public ViewWithAnnotationsForIntegrationTest(Context context,
method ViewWithAnnotationsForIntegrationTest (line 32) | public ViewWithAnnotationsForIntegrationTest(Context context,
method setRequiredText (line 37) | @ModelProp(options = Option.GenerateStringOverloads)
method setNullableText (line 42) | @ModelProp(options = Option.GenerateStringOverloads)
method setTextWithDefault (line 47) | @ModelProp(options = Option.GenerateStringOverloads, defaultValue = "D...
method setNullableTextWithDefault (line 52) | @ModelProp(options = Option.GenerateStringOverloads, defaultValue = "D...
method setOnClickListener (line 57) | @CallbackProp
method setGroupWithNoDefault (line 63) | @ModelProp
method setGroupWithNoDefault (line 68) | @CallbackProp
method setGroupWithDefault (line 73) | @ModelProp
method setGroupWithDefault (line 78) | @CallbackProp
method setGroupWithDefault (line 83) | @ModelProp
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/autoaddautomodels/ControllerWithImplicitlyAddedModels.java
class ControllerWithImplicitlyAddedModels (line 11) | public class ControllerWithImplicitlyAddedModels extends EpoxyController {
method buildModels (line 24) | @Override
method getExpectedModels (line 71) | public List<Model_> getExpectedModels() {
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/autoaddautomodels/ControllerWithImplicitlyAddedModels2.java
class ControllerWithImplicitlyAddedModels2 (line 10) | public class ControllerWithImplicitlyAddedModels2 extends EpoxyController {
method buildModels (line 23) | @Override
method getExpectedModels (line 53) | public List<Model_> getExpectedModels() {
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/autoaddautomodels/ControllerWithImplicitlyAddedModels3.java
class ControllerWithImplicitlyAddedModels3 (line 10) | public class ControllerWithImplicitlyAddedModels3 extends EpoxyController {
method buildModels (line 18) | @Override
method getExpectedModels (line 46) | public List<Model_> getExpectedModels() {
FILE: epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/autoaddautomodels/PackageConfig.java
type PackageConfig (line 5) | @PackageEpoxyConfig(implicitlyAddAutoModels = true)
FILE: epoxy-integrationtest/src/test/java/com/airbnb/epoxy/AutoModelIntegrationTest.java
class AutoModelIntegrationTest (line 21) | @RunWith(RobolectricTestRunner.class)
method basicAutoModels (line 24) | @Test
method assigningValueToFieldFails (line 36) | @Test(expected = IllegalStateException.class)
method assigningIdToAutoModelFails (line 42) | @Test(expected = IllegalStateException.class)
method implicitlyAddingAutoModelsDisabledByDefault (line 48) | @Test
method implicitlyAddingAutoModels (line 56) | @Test
method implicitlyAddingAutoModels2 (line 64) | @Test
method implicitlyAddingAutoModels3 (line 72) | @Test
FILE: epoxy-integrationtest/src/test/java/com/airbnb/epoxy/BindModelIntegrationTest.java
class BindModelIntegrationTest (line 21) | @RunWith(RobolectricTestRunner.class)
class TestAdapter (line 27) | class TestAdapter extends BaseEpoxyAdapter {
method TestAdapter (line 32) | TestAdapter(boolean diffPayloadsEnabled) {
method getCurrentModels (line 38) | @Override
method diffPayloadsEnabled (line 43) | @Override
method before (line 49) | @Before
method bindNoPayloads (line 54) | @Test
method bindWithPayloads (line 65) | @Test
method bindWithDiffPayload (line 81) | @Test
FILE: epoxy-integrationtest/src/test/java/com/airbnb/epoxy/DataBindingModelIntegrationTest.java
class DataBindingModelIntegrationTest (line 29) | @RunWith(RobolectricTestRunner.class)
method createDataBindingModel (line 33) | @Test
method fullyCreateDataBindingModel (line 64) | @Test
method typesWithOutHashCodeAreNotDiffed (line 95) | @Test
method typesWithHashCodeAreDiffed (line 126) | @Test
method generatesBindingModelFromNamingPattern (line 148) | @Test
FILE: epoxy-integrationtest/src/test/java/com/airbnb/epoxy/DiffPayloadTestUtil.java
class DiffPayloadTestUtil (line 7) | class DiffPayloadTestUtil {
method diffPayloadWithModels (line 9) | static DiffPayload diffPayloadWithModels(EpoxyModel<?>... models) {
method payloadsWithDiffPayloads (line 14) | static List<Object> payloadsWithDiffPayloads(DiffPayload... diffPayloa...
method payloadsWithChangedModels (line 19) | static List<Object> payloadsWithChangedModels(EpoxyModel<?>... models) {
FILE: epoxy-integrationtest/src/test/java/com/airbnb/epoxy/EpoxyAdapterIntegrationTest.java
class EpoxyAdapterIntegrationTest (line 12) | @RunWith(RobolectricTestRunner.class)
method returnModelViewType (line 18) | @Test
method returnHiddenModelViewType (line 27) | @Test
method bindHiddenModel (line 37) | @Test
method bindNormalModel (line 46) | @Test
FILE: epoxy-integrationtest/src/test/java/com/airbnb/epoxy/EpoxyModelIntegrationTest.java
class EpoxyModelIntegrationTest (line 13) | @RunWith(RobolectricTestRunner.class)
class ModelWithSpanCount (line 16) | static class ModelWithSpanCount extends EpoxyModel<View> {
method getDefaultLayout (line 17) | @Override
method getSpanSize (line 22) | @Override
method modelReturnsSpanCount (line 28) | @Test
class ModelWithSpanCountCallback (line 34) | static class ModelWithSpanCountCallback extends EpoxyModel<View> {
method getDefaultLayout (line 35) | @Override
method modelReturnsSpanCountFromCallback (line 41) | @Test
FILE: epoxy-integrationtest/src/test/java/com/airbnb/epoxy/EpoxyModelValidationTest.java
class EpoxyModelValidationTest (line 19) | @RunWith(RobolectricTestRunner.class)
class Controller (line 25) | static class Controller extends EpoxyController {
method buildModels (line 27) | @Override
method testModelCannotBeAddedTwice (line 33) | @Test
method addToOnlyValidInsideBuildModels (line 50) | @Test
method addModelOnlyValidInsideBuildModels (line 67) | @Test
method cannotCallBuildModelsDirectly (line 82) | @Test
method mustSpecifyModelIdInController (line 100) | @Test
method hideModelNotAllowedInController (line 117) | @Test
method cannotChangeIdAfterAddingModelToController (line 136) | @Test
method mutationNotAllowedAfterModelIsAdded_reset (line 155) | @Test
method mutationNotAllowedAfterModelIsAdded_bindListener (line 174) | @Test
method mutationNotAllowedAfterModelIsAdded_unbindListener (line 193) | @Test
method mutationNotAllowedAfterModelIsAdded_setter (line 212) | @Test
method mutationNotAllowedAfterModelIsAdded_layout (line 231) | @Test
method mutationNotAllowedAfterModelIsAdded_hide (line 250) | @Test
method mutationAllowedDuringInterceptorCall (line 269) | @Test
method hashChangeThrows_beforeBind (line 290) | @Test
method hashChangeThrows_duringBind (line 309) | @Test
method hashChangeThrows_beforeNextModelBuild (line 327) | @Test
method hashChangeDuringInterceptorIsAllowed (line 342) | @Test
FILE: epoxy-integrationtest/src/test/java/com/airbnb/epoxy/ModelClickListenerTest.java
class ModelClickListenerTest (line 34) | @RunWith(RobolectricTestRunner.class)
class TestController (line 40) | static class TestController extends EpoxyController {
method buildModels (line 43) | @Override
method setModel (line 48) | void setModel(EpoxyModel<?> model) {
class ModelClickListener (line 53) | static class ModelClickListener implements OnModelClickListener<ModelW...
method onClick (line 56) | @Override
class ModelLongClickListener (line 62) | static class ModelLongClickListener
method onLongClick (line 66) | @Override
class ModelCheckedChangeListener (line 73) | static class ModelCheckedChangeListener
method onChecked (line 77) | @Override
class ViewClickListener (line 84) | static class ViewClickListener implements OnClickListener {
method onClick (line 87) | @Override
method basicModelClickListener (line 93) | @Test
method mockModelForClicking (line 112) | private View mockModelForClicking(EpoxyModel model) {
method basicModelLongClickListener (line 133) | @Test
method basicModelCheckedChangeListener (line 152) | @Test
method mockCompoundButtonForClicking (line 171) | private CompoundButton mockCompoundButtonForClicking(EpoxyModel model) {
method modelClickListenerOverridesViewClickListener (line 192) | @Test
method viewClickListenerOverridesModelClickListener (line 217) | @Test
method resetClearsModelClickListener (line 238) | @Test
method modelClickListenerIsDiffed (line 253) | @Test
method viewClickListenerIsDiffed (line 292) | @Test
FILE: epoxy-integrationtest/src/test/java/com/airbnb/epoxy/OnModelBindListenerTest.java
class OnModelBindListenerTest (line 23) | @RunWith(RobolectricTestRunner.class)
class TestController (line 29) | static class TestController extends EpoxyController {
method buildModels (line 33) | @Override
method setModel (line 38) | void setModel(EpoxyModel model) {
method buildWithModel (line 42) | void buildWithModel(EpoxyModel model) {
class BindListener (line 48) | static class BindListener implements OnModelBoundListener<ModelWithCli...
method onModelBound (line 51) | @Override
class UnbindListener (line 57) | static class UnbindListener implements OnModelUnboundListener<ModelWit...
method onModelUnbound (line 60) | @Override
method onBindListenerGetsCalled (line 66) | @Test
method onUnbindListenerGetsCalled (line 79) | @Test
method bindListenerChangesHashCode (line 97) | @Test
method nullBindListenerChangesHashCode (line 126) | @Test
method newBindListenerDoesNotChangeHashCode (line 148) | @Test
method unbindListenerChangesHashCode (line 170) | @Test
method nullUnbindListenerChangesHashCode (line 199) | @Test
method newUnbindListenerDoesNotChangHashCode (line 221) | @Test
FILE: epoxy-integrationtest/src/test/java/com/airbnb/epoxy/ViewAnnotationsStringOverloadsIntegrationTest.java
class ViewAnnotationsStringOverloadsIntegrationTest (line 19) | @RunWith(RobolectricTestRunner.class)
method bind (line 25) | ViewWithAnnotationsForIntegrationTest bind(ViewWithAnnotationsForInteg...
method normalCharSequenceIsSet (line 31) | @Test
method getStringOffModel (line 43) | @Test
method stringResIsSet (line 55) | @Test
method stringResWithArgsIsSet (line 68) | @Test
method quantityStringIsSet (line 81) | @Test
method quantityStringWithArgsIsSet (line 95) | @Test
method requiredTextThrowsWhenSetWithNull (line 109) | @Test(expected = IllegalArgumentException.class)
method requiredTextThrowsWhenNotSet (line 115) | @Test(expected = IllegalStateException.class)
method requiredTextThrowsOnBadStringRes (line 123) | @Test(expected = IllegalArgumentException.class)
method requiredTextThrowsOnBadStringResWithArgs (line 129) | @Test(expected = IllegalArgumentException.class)
method requiredTextThrowsOnBadQuantityString (line 135) | @Test(expected = IllegalArgumentException.class)
method nullableTextSetsNullWhenNotSet (line 141) | @Test
method nullableTextAllowsNull (line 151) | @Test
method nullableTextAllowsZeroStringRes (line 163) | @Test
method nullableTextAllowsZeroQuantityRes (line 175) | @Test
method defaultStringValueSetIfNothingElseIsSet (line 187) | @Test
method stringOverridesDefault (line 200) | @Test
method nullableStringOverridesDefaultWithNull (line 216) | @Test
method zeroStringResSetsDefault (line 228) | @Test
method zeroQuantityStringResSetsDefault (line 243) | @Test
method stringOverloadsResetEachOther (line 258) | @Test
FILE: epoxy-modelfactory/src/main/java/com/airbnb/epoxy/ModelProperties.java
type ModelProperties (line 13) | public interface ModelProperties {
method getId (line 15) | @NonNull
method has (line 18) | boolean has(@NonNull String propertyName);
method getBoolean (line 20) | boolean getBoolean(@NonNull String propertyName);
method getDouble (line 22) | double getDouble(@NonNull String propertyName);
method getDrawableRes (line 24) | @DrawableRes
method getEpoxyModelList (line 27) | @Nullable
method getInt (line 30) | int getInt(@NonNull String propertyName);
method getLong (line 32) | long getLong(@NonNull String propertyName);
method getOnClickListener (line 34) | @Nullable
method getRawRes (line 37) | @RawRes
method getString (line 40) | @Nullable
method getStringList (line 43) | @Nullable
method getStyle (line 49) | @Nullable
FILE: epoxy-modelfactorytest/src/main/java/com/airbnb/epoxy/TestModelPropertiesView.java
class TestModelPropertiesView (line 13) | @ModelView(autoLayout = Size.MATCH_WIDTH_WRAP_HEIGHT)
method TestModelPropertiesView (line 16) | public TestModelPropertiesView(Context context) {
method setBooleanValue (line 20) | @ModelProp
method setBoxedBooleanValue (line 25) | @ModelProp
method setDoubleValue (line 30) | @ModelProp
method setBoxedDoubleValue (line 35) | @ModelProp
method setDrawableRes (line 40) | @ModelProp
method setEpoxyModelList (line 45) | @ModelProp
method setIntValue (line 50) | @ModelProp
method setBoxedIntValue (line 55) | @ModelProp
method setLongValue (line 60) | @ModelProp
method setBoxedLongValue (line 65) | @ModelProp
method setOnClickListener (line 70) | @CallbackProp
method setRawRes (line 75) | @ModelProp
method setStringValue (line 80) | @ModelProp
method setStringList (line 85) | @ModelProp
FILE: epoxy-modelfactorytest/src/test/resources/AllTypesModelView.java
class AllTypesModelView (line 12) | @ModelView(defaultLayout = 1)
method AllTypesModelView (line 15) | public AllTypesModelView(Context context) {
method setBooleanValue (line 19) | @ModelProp
method setBoxedBooleanValue (line 24) | @ModelProp
method setCharSequenceValue (line 29) | @ModelProp
method setBoxedDoubleValue (line 34) | @ModelProp
method setDoubleValue (line 39) | @ModelProp
method setDrawableRes (line 44) | @ModelProp
method setEpoxyModelList (line 49) | @ModelProp
method setIntValue (line 54) | @ModelProp
method setBoxedIntValue (line 59) | @ModelProp
method setLongValue (line 64) | @ModelProp
method setBoxedLongValue (line 69) | @ModelProp
method setOnClickListener (line 74) | @ModelProp({ Option.DoNotHash })
method setRawRes (line 79) | @ModelProp
method setStringValue (line 84) | @ModelProp
method setStringList (line 89) | @ModelProp
FILE: epoxy-modelfactorytest/src/test/resources/AllTypesModelViewModel_.java
class AllTypesModelViewModel_ (line 26) | public class AllTypesModelViewModel_ extends EpoxyModel<AllTypesModelVie...
method addTo (line 105) | @Override
method handlePreBind (line 138) | @Override
method bind (line 144) | @Override
method bind (line 164) | @Override
method handlePostBind (line 234) | @Override
method onBind (line 250) | public AllTypesModelViewModel_ onBind(
method unbind (line 257) | @Override
method onUnbind (line 273) | public AllTypesModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 280) | @Override
method onVisibilityStateChanged (line 294) | public AllTypesModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 301) | @Override
method onVisibilityChanged (line 316) | public AllTypesModelViewModel_ onVisibilityChanged(
method booleanValue (line 328) | public AllTypesModelViewModel_ booleanValue(boolean booleanValue) {
method booleanValue (line 334) | public boolean booleanValue() {
method boxedBooleanValue (line 343) | public AllTypesModelViewModel_ boxedBooleanValue(@NonNull Boolean boxe...
method boxedBooleanValue (line 353) | @NonNull
method charSequenceValue (line 363) | public AllTypesModelViewModel_ charSequenceValue(@NonNull CharSequence...
method charSequenceValue (line 373) | @NonNull
method boxedDoubleValue (line 383) | public AllTypesModelViewModel_ boxedDoubleValue(@NonNull Double boxedD...
method boxedDoubleValue (line 393) | @NonNull
method doubleValue (line 403) | public AllTypesModelViewModel_ doubleValue(double doubleValue) {
method doubleValue (line 409) | public double doubleValue() {
method drawableRes (line 418) | public AllTypesModelViewModel_ drawableRes(@DrawableRes int drawableRe...
method drawableRes (line 424) | @DrawableRes
method epoxyModelList (line 434) | public AllTypesModelViewModel_ epoxyModelList(
method epoxyModelList (line 445) | @NonNull
method intValue (line 455) | public AllTypesModelViewModel_ intValue(int intValue) {
method intValue (line 461) | public int intValue() {
method boxedIntValue (line 470) | public AllTypesModelViewModel_ boxedIntValue(@NonNull Integer boxedInt...
method boxedIntValue (line 480) | @NonNull
method longValue (line 490) | public AllTypesModelViewModel_ longValue(long longValue) {
method longValue (line 496) | public long longValue() {
method boxedLongValue (line 505) | public AllTypesModelViewModel_ boxedLongValue(@NonNull Long boxedLongV...
method boxedLongValue (line 515) | @NonNull
method onClickListener (line 523) | public AllTypesModelViewModel_ onClickListener(
method onClickListener (line 541) | public AllTypesModelViewModel_ onClickListener(@NonNull View.OnClickLi...
method onClickListener (line 551) | @NonNull
method rawRes (line 561) | public AllTypesModelViewModel_ rawRes(@RawRes int rawRes) {
method rawRes (line 567) | @RawRes
method stringValue (line 577) | public AllTypesModelViewModel_ stringValue(@NonNull String stringValue) {
method stringValue (line 587) | @NonNull
method stringList (line 597) | public AllTypesModelViewModel_ stringList(@NonNull List<String> string...
method stringList (line 607) | @NonNull
method id (line 612) | @Override
method id (line 618) | @Override
method id (line 624) | @Override
method id (line 630) | @Override
method id (line 636) | @Override
method id (line 643) | @Override
method layout (line 649) | @Override
method spanSizeOverride (line 655) | @Override
method show (line 662) | @Override
method show (line 668) | @Override
method hide (line 674) | @Override
method getDefaultLayout (line 680) | @Override
method reset (line 686) | @Override
method equals (line 712) | @Override
method hashCode (line 784) | @Override
method toString (line 811) | @Override
method from (line 832) | public static AllTypesModelViewModel_ from(ModelProperties properties) {
method getSpanSize (line 883) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/BasicModelWithFinalAttribute.java
class BasicModelWithFinalAttribute (line 3) | public class BasicModelWithFinalAttribute extends EpoxyModel<Object> {
method BasicModelWithFinalAttribute (line 6) | public BasicModelWithFinalAttribute() {
method getDefaultLayout (line 10) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/BasicModelWithFinalAttribute_.java
class BasicModelWithFinalAttribute_ (line 14) | public class BasicModelWithFinalAttribute_ extends BasicModelWithFinalAt...
method BasicModelWithFinalAttribute_ (line 23) | public BasicModelWithFinalAttribute_() {
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method handlePostBind (line 38) | @Override
method onBind (line 54) | public BasicModelWithFinalAttribute_ onBind(
method unbind (line 61) | @Override
method onUnbind (line 77) | public BasicModelWithFinalAttribute_ onUnbind(
method onVisibilityStateChanged (line 84) | @Override
method onVisibilityStateChanged (line 98) | public BasicModelWithFinalAttribute_ onVisibilityStateChanged(
method onVisibilityChanged (line 105) | @Override
method onVisibilityChanged (line 120) | public BasicModelWithFinalAttribute_ onVisibilityChanged(
method value (line 127) | public int value() {
method id (line 131) | @Override
method id (line 137) | @Override
method id (line 143) | @Override
method id (line 149) | @Override
method id (line 155) | @Override
method id (line 162) | @Override
method layout (line 168) | @Override
method spanSizeOverride (line 174) | @Override
method show (line 181) | @Override
method show (line 187) | @Override
method hide (line 193) | @Override
method reset (line 199) | @Override
method equals (line 209) | @Override
method hashCode (line 239) | @Override
method toString (line 250) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/CallbackPropModelView.java
class CallbackPropModelView (line 7) | @ModelView(defaultLayout = 1)
method CallbackPropModelView (line 10) | public CallbackPropModelView(Context context) {
method setOnClickListener (line 14) | @CallbackProp
FILE: epoxy-modelfactorytest/src/test/resources/CallbackPropModelViewModel_.java
class CallbackPropModelViewModel_ (line 15) | public class CallbackPropModelViewModel_ extends EpoxyModel<CallbackProp...
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method bind (line 39) | @Override
method bind (line 45) | @Override
method handlePostBind (line 59) | @Override
method onBind (line 75) | public CallbackPropModelViewModel_ onBind(
method unbind (line 82) | @Override
method onUnbind (line 99) | public CallbackPropModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 106) | @Override
method onVisibilityStateChanged (line 120) | public CallbackPropModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 127) | @Override
method onVisibilityChanged (line 142) | public CallbackPropModelViewModel_ onVisibilityChanged(
method onClickListener (line 152) | public CallbackPropModelViewModel_ onClickListener(
method onClickListener (line 169) | public CallbackPropModelViewModel_ onClickListener(
method onClickListener (line 176) | @Nullable
method id (line 181) | @Override
method id (line 187) | @Override
method id (line 193) | @Override
method id (line 199) | @Override
method id (line 205) | @Override
method id (line 212) | @Override
method layout (line 218) | @Override
method spanSizeOverride (line 224) | @Override
method show (line 231) | @Override
method show (line 237) | @Override
method hide (line 243) | @Override
method getDefaultLayout (line 249) | @Override
method reset (line 255) | @Override
method equals (line 266) | @Override
method hashCode (line 296) | @Override
method toString (line 307) | @Override
method from (line 314) | public static CallbackPropModelViewModel_ from(ModelProperties propert...
method getSpanSize (line 323) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/GroupPropMultipleSupportedAttributeDifferentNameModelView.java
class GroupPropMultipleSupportedAttributeDifferentNameModelView (line 8) | @ModelView(defaultLayout = 1)
method GroupPropMultipleSupportedAttributeDifferentNameModelView (line 11) | public GroupPropMultipleSupportedAttributeDifferentNameModelView(Conte...
method setTitleString (line 15) | @ModelProp(group = "title")
method setTitleInt (line 20) | @ModelProp(group = "title")
FILE: epoxy-modelfactorytest/src/test/resources/GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_.java
class GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_ (line 17) | public class GroupPropMultipleSupportedAttributeDifferentNameModelViewMo...
method addTo (line 39) | @Override
method handlePreBind (line 45) | @Override
method bind (line 51) | @Override
method bind (line 65) | @Override
method handlePostBind (line 91) | @Override
method onBind (line 108) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method unbind (line 115) | @Override
method onUnbind (line 131) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method onVisibilityStateChanged (line 138) | @Override
method onVisibilityStateChanged (line 153) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method onVisibilityChanged (line 160) | @Override
method onVisibilityChanged (line 176) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method titleString (line 188) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method titleStringString (line 201) | @NonNull
method titleInt (line 211) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method titleIntInt (line 220) | public int titleIntInt() {
method id (line 224) | @Override
method id (line 230) | @Override
method id (line 237) | @Override
method id (line 243) | @Override
method id (line 250) | @Override
method id (line 257) | @Override
method layout (line 264) | @Override
method spanSizeOverride (line 271) | @Override
method show (line 278) | @Override
method show (line 284) | @Override
method hide (line 290) | @Override
method getDefaultLayout (line 296) | @Override
method reset (line 302) | @Override
method equals (line 315) | @Override
method hashCode (line 348) | @Override
method toString (line 360) | @Override
method from (line 368) | public static GroupPropMultipleSupportedAttributeDifferentNameModelVie...
method getSpanSize (line 380) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/GroupPropMultipleSupportedAttributeSameNameModelView.java
class GroupPropMultipleSupportedAttributeSameNameModelView (line 8) | @ModelView(defaultLayout = 1)
method GroupPropMultipleSupportedAttributeSameNameModelView (line 11) | public GroupPropMultipleSupportedAttributeSameNameModelView(Context co...
method setTitleString (line 15) | @ModelProp(group = "title")
method setTitleInt (line 20) | @ModelProp(group = "title")
FILE: epoxy-modelfactorytest/src/test/resources/GroupPropMultipleSupportedAttributeSameNameModelViewModel_.java
class GroupPropMultipleSupportedAttributeSameNameModelViewModel_ (line 17) | public class GroupPropMultipleSupportedAttributeSameNameModelViewModel_ ...
method addTo (line 39) | @Override
method handlePreBind (line 45) | @Override
method bind (line 51) | @Override
method bind (line 65) | @Override
method handlePostBind (line 91) | @Override
method onBind (line 108) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ onBind(
method unbind (line 115) | @Override
method onUnbind (line 131) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ onUn...
method onVisibilityStateChanged (line 138) | @Override
method onVisibilityStateChanged (line 153) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ onVi...
method onVisibilityChanged (line 160) | @Override
method onVisibilityChanged (line 176) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ onVi...
method titleString (line 188) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ titl...
method titleStringString (line 201) | @NonNull
method titleInt (line 211) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ titl...
method titleIntInt (line 220) | public int titleIntInt() {
method id (line 224) | @Override
method id (line 230) | @Override
method id (line 236) | @Override
method id (line 242) | @Override
method id (line 248) | @Override
method id (line 255) | @Override
method layout (line 262) | @Override
method spanSizeOverride (line 269) | @Override
method show (line 276) | @Override
method show (line 282) | @Override
method hide (line 288) | @Override
method getDefaultLayout (line 294) | @Override
method reset (line 300) | @Override
method equals (line 313) | @Override
method hashCode (line 346) | @Override
method toString (line 358) | @Override
method from (line 366) | public static GroupPropMultipleSupportedAttributeSameNameModelViewMode...
method getSpanSize (line 378) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/GroupPropSingleSupportedAttributeModelView.java
class GroupPropSingleSupportedAttributeModelView (line 8) | @ModelView(defaultLayout = 1)
method GroupPropSingleSupportedAttributeModelView (line 11) | public GroupPropSingleSupportedAttributeModelView(Context context) {
method setTitle (line 15) | @ModelProp
method setTitle (line 20) | @ModelProp({ Option.IgnoreRequireHashCode })
FILE: epoxy-modelfactorytest/src/test/resources/GroupPropSingleSupportedAttributeModelViewModel_.java
class GroupPropSingleSupportedAttributeModelViewModel_ (line 18) | public class GroupPropSingleSupportedAttributeModelViewModel_ extends Ep...
method addTo (line 41) | @Override
method handlePreBind (line 50) | @Override
method bind (line 56) | @Override
method bind (line 67) | @Override
method handlePostBind (line 89) | @Override
method onBind (line 106) | public GroupPropSingleSupportedAttributeModelViewModel_ onBind(
method unbind (line 113) | @Override
method onUnbind (line 129) | public GroupPropSingleSupportedAttributeModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 136) | @Override
method onVisibilityStateChanged (line 151) | public GroupPropSingleSupportedAttributeModelViewModel_ onVisibilitySt...
method onVisibilityChanged (line 158) | @Override
method onVisibilityChanged (line 174) | public GroupPropSingleSupportedAttributeModelViewModel_ onVisibilityCh...
method title (line 186) | public GroupPropSingleSupportedAttributeModelViewModel_ title(@NonNull...
method titleString (line 198) | @NonNull
method title (line 208) | public GroupPropSingleSupportedAttributeModelViewModel_ title(@NonNull...
method titleObject (line 220) | @NonNull
method id (line 225) | @Override
method id (line 231) | @Override
method id (line 237) | @Override
method id (line 243) | @Override
method id (line 249) | @Override
method id (line 256) | @Override
method layout (line 262) | @Override
method spanSizeOverride (line 268) | @Override
method show (line 275) | @Override
method show (line 281) | @Override
method hide (line 287) | @Override
method getDefaultLayout (line 293) | @Override
method reset (line 299) | @Override
method equals (line 312) | @Override
method hashCode (line 345) | @Override
method toString (line 357) | @Override
method from (line 365) | public static GroupPropSingleSupportedAttributeModelViewModel_ from(Mo...
method getSpanSize (line 374) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ListSubtypeModelView.java
class ListSubtypeModelView (line 8) | @ModelView(defaultLayout = 1)
method ListSubtypeModelView (line 11) | public ListSubtypeModelView(Context context) {
method setStringArrayList (line 15) | @ModelProp
FILE: epoxy-modelfactorytest/src/test/resources/ListSubtypeModelViewModel_.java
class ListSubtypeModelViewModel_ (line 19) | public class ListSubtypeModelViewModel_ extends EpoxyModel<ListSubtypeMo...
method addTo (line 36) | @Override
method handlePreBind (line 45) | @Override
method bind (line 51) | @Override
method bind (line 57) | @Override
method handlePostBind (line 71) | @Override
method onBind (line 87) | public ListSubtypeModelViewModel_ onBind(
method unbind (line 94) | @Override
method onUnbind (line 110) | public ListSubtypeModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 117) | @Override
method onVisibilityStateChanged (line 131) | public ListSubtypeModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 138) | @Override
method onVisibilityChanged (line 153) | public ListSubtypeModelViewModel_ onVisibilityChanged(
method stringArrayList (line 165) | public ListSubtypeModelViewModel_ stringArrayList(@NonNull ArrayList<S...
method stringArrayList (line 175) | @NonNull
method id (line 180) | @Override
method id (line 186) | @Override
method id (line 192) | @Override
method id (line 198) | @Override
method id (line 204) | @Override
method id (line 211) | @Override
method layout (line 217) | @Override
method spanSizeOverride (line 223) | @Override
method show (line 230) | @Override
method show (line 236) | @Override
method hide (line 242) | @Override
method getDefaultLayout (line 248) | @Override
method reset (line 254) | @Override
method equals (line 266) | @Override
method hashCode (line 296) | @Override
method toString (line 307) | @Override
method getSpanSize (line 314) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ModelFactoryBaseModelView.java
class ModelFactoryBaseModelView (line 6) | @ModelView(defaultLayout = 1)
method ModelFactoryBaseModelView (line 9) | public ModelFactoryBaseModelView(Context context) {
method setTitle (line 13) | @ModelProp
FILE: epoxy-modelfactorytest/src/test/resources/ModelFactoryBaseModelViewModel_.java
class ModelFactoryBaseModelViewModel_ (line 18) | public class ModelFactoryBaseModelViewModel_ extends EpoxyModel<ModelFac...
method addTo (line 35) | @Override
method handlePreBind (line 44) | @Override
method bind (line 50) | @Override
method bind (line 56) | @Override
method handlePostBind (line 70) | @Override
method onBind (line 86) | public ModelFactoryBaseModelViewModel_ onBind(
method unbind (line 93) | @Override
method onUnbind (line 109) | public ModelFactoryBaseModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 116) | @Override
method onVisibilityStateChanged (line 131) | public ModelFactoryBaseModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 138) | @Override
method onVisibilityChanged (line 153) | public ModelFactoryBaseModelViewModel_ onVisibilityChanged(
method title (line 165) | public ModelFactoryBaseModelViewModel_ title(@NonNull String title) {
method title (line 175) | @NonNull
method id (line 180) | @Override
method id (line 186) | @Override
method id (line 192) | @Override
method id (line 198) | @Override
method id (line 204) | @Override
method id (line 211) | @Override
method layout (line 217) | @Override
method spanSizeOverride (line 223) | @Override
method show (line 230) | @Override
method show (line 236) | @Override
method hide (line 242) | @Override
method getDefaultLayout (line 248) | @Override
method reset (line 254) | @Override
method equals (line 266) | @Override
method hashCode (line 296) | @Override
method toString (line 307) | @Override
method from (line 314) | public static ModelFactoryBaseModelViewModel_ from(ModelProperties pro...
method getSpanSize (line 323) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ModelFactoryBasicModelWithAttribute.java
class ModelFactoryBasicModelWithAttribute (line 3) | public class ModelFactoryBasicModelWithAttribute extends EpoxyModel<Obje...
method getDefaultLayout (line 6) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ModelFactoryBasicModelWithAttribute_.java
class ModelFactoryBasicModelWithAttribute_ (line 14) | public class ModelFactoryBasicModelWithAttribute_ extends ModelFactoryBa...
method ModelFactoryBasicModelWithAttribute_ (line 23) | public ModelFactoryBasicModelWithAttribute_() {
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method handlePostBind (line 38) | @Override
method onBind (line 54) | public ModelFactoryBasicModelWithAttribute_ onBind(
method unbind (line 61) | @Override
method onUnbind (line 77) | public ModelFactoryBasicModelWithAttribute_ onUnbind(
method onVisibilityStateChanged (line 84) | @Override
method onVisibilityStateChanged (line 98) | public ModelFactoryBasicModelWithAttribute_ onVisibilityStateChanged(
method onVisibilityChanged (line 105) | @Override
method onVisibilityChanged (line 120) | public ModelFactoryBasicModelWithAttribute_ onVisibilityChanged(
method value (line 127) | public ModelFactoryBasicModelWithAttribute_ value(int value) {
method value (line 133) | public int value() {
method id (line 137) | @Override
method id (line 143) | @Override
method id (line 149) | @Override
method id (line 155) | @Override
method id (line 161) | @Override
method id (line 168) | @Override
method layout (line 174) | @Override
method spanSizeOverride (line 180) | @Override
method show (line 187) | @Override
method show (line 193) | @Override
method hide (line 199) | @Override
method reset (line 205) | @Override
method equals (line 216) | @Override
method hashCode (line 246) | @Override
method toString (line 257) | @Override
method from (line 264) | public static ModelFactoryBasicModelWithAttribute_ from(ModelPropertie...
FILE: epoxy-modelfactorytest/src/test/resources/StyleableModelView.java
class StyleableModelView (line 8) | @Styleable
method StyleableModelView (line 12) | public StyleableModelView(Context context) {
method setTitle (line 16) | @ModelProp
FILE: epoxy-modelfactorytest/src/test/resources/StyleableModelViewModel_.java
class StyleableModelViewModel_ (line 27) | public class StyleableModelViewModel_ extends EpoxyModel<StyleableModelV...
method addTo (line 51) | @Override
method getViewType (line 60) | @Override
method buildView (line 65) | @Override
method handlePreBind (line 72) | @Override
method bind (line 90) | @Override
method bind (line 102) | @Override
method handlePostBind (line 122) | @Override
method onBind (line 137) | public StyleableModelViewModel_ onBind(
method unbind (line 144) | @Override
method onUnbind (line 159) | public StyleableModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 166) | @Override
method onVisibilityStateChanged (line 181) | public StyleableModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 188) | @Override
method onVisibilityChanged (line 204) | public StyleableModelViewModel_ onVisibilityChanged(
method style (line 211) | public StyleableModelViewModel_ style(Style style) {
method styleBuilder (line 218) | public StyleableModelViewModel_ styleBuilder(
method withDefaultStyle (line 227) | public StyleableModelViewModel_ withDefaultStyle() {
method title (line 241) | public StyleableModelViewModel_ title(@NonNull String title) {
method title (line 251) | @NonNull
method id (line 256) | @Override
method id (line 262) | @Override
method id (line 268) | @Override
method id (line 274) | @Override
method id (line 280) | @Override
method id (line 286) | @Override
method layout (line 292) | @Override
method spanSizeOverride (line 297) | @Override
method show (line 304) | @Override
method show (line 310) | @Override
method hide (line 316) | @Override
method getDefaultLayout (line 322) | @Override
method reset (line 328) | @Override
method equals (line 341) | @Override
method hashCode (line 374) | @Override
method toString (line 386) | @Override
method from (line 394) | public static StyleableModelViewModel_ from(ModelProperties properties) {
method getSpanSize (line 407) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/TextPropModelView.java
class TextPropModelView (line 6) | @ModelView(defaultLayout = 1)
method TextPropModelView (line 9) | public TextPropModelView(Context context) {
method setTitle (line 13) | @TextProp
FILE: epoxy-modelfactorytest/src/test/resources/TextPropModelViewModel_.java
class TextPropModelViewModel_ (line 21) | public class TextPropModelViewModel_ extends EpoxyModel<TextPropModelVie...
method addTo (line 37) | @Override
method handlePreBind (line 46) | @Override
method bind (line 52) | @Override
method bind (line 58) | @Override
method handlePostBind (line 72) | @Override
method onBind (line 88) | public TextPropModelViewModel_ onBind(
method unbind (line 95) | @Override
method onUnbind (line 111) | public TextPropModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 118) | @Override
method onVisibilityStateChanged (line 132) | public TextPropModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 139) | @Override
method onVisibilityChanged (line 154) | public TextPropModelViewModel_ onVisibilityChanged(
method getTitle (line 161) | public CharSequence getTitle(Context context) {
method title (line 170) | public TextPropModelViewModel_ title(@NonNull CharSequence title) {
method title (line 187) | public TextPropModelViewModel_ title(@StringRes int stringRes) {
method title (line 201) | public TextPropModelViewModel_ title(@StringRes int stringRes, Object....
method titleQuantityRes (line 215) | public TextPropModelViewModel_ titleQuantityRes(@PluralsRes int plural...
method id (line 223) | @Override
method id (line 229) | @Override
method id (line 235) | @Override
method id (line 241) | @Override
method id (line 247) | @Override
method id (line 254) | @Override
method layout (line 260) | @Override
method spanSizeOverride (line 266) | @Override
method show (line 273) | @Override
method show (line 279) | @Override
method hide (line 285) | @Override
method getDefaultLayout (line 291) | @Override
method reset (line 297) | @Override
method equals (line 309) | @Override
method hashCode (line 339) | @Override
method toString (line 350) | @Override
method from (line 357) | public static TextPropModelViewModel_ from(ModelProperties properties) {
method getSpanSize (line 366) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ksp/AllTypesModelViewModel_.java
class AllTypesModelViewModel_ (line 26) | public class AllTypesModelViewModel_ extends EpoxyModel<AllTypesModelVie...
method addTo (line 105) | @Override
method handlePreBind (line 138) | @Override
method bind (line 144) | @Override
method bind (line 164) | @Override
method handlePostBind (line 234) | @Override
method onBind (line 250) | public AllTypesModelViewModel_ onBind(
method unbind (line 257) | @Override
method onUnbind (line 273) | public AllTypesModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 280) | @Override
method onVisibilityStateChanged (line 294) | public AllTypesModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 301) | @Override
method onVisibilityChanged (line 316) | public AllTypesModelViewModel_ onVisibilityChanged(
method booleanValue (line 328) | public AllTypesModelViewModel_ booleanValue(boolean booleanValue) {
method booleanValue (line 334) | public boolean booleanValue() {
method boxedBooleanValue (line 343) | public AllTypesModelViewModel_ boxedBooleanValue(@NonNull Boolean boxe...
method boxedBooleanValue (line 353) | @NonNull
method charSequenceValue (line 363) | public AllTypesModelViewModel_ charSequenceValue(@NonNull CharSequence...
method charSequenceValue (line 373) | @NonNull
method boxedDoubleValue (line 383) | public AllTypesModelViewModel_ boxedDoubleValue(@NonNull Double boxedD...
method boxedDoubleValue (line 393) | @NonNull
method doubleValue (line 403) | public AllTypesModelViewModel_ doubleValue(double doubleValue) {
method doubleValue (line 409) | public double doubleValue() {
method drawableRes (line 418) | public AllTypesModelViewModel_ drawableRes(@DrawableRes int drawableRe...
method drawableRes (line 424) | @DrawableRes
method epoxyModelList (line 434) | public AllTypesModelViewModel_ epoxyModelList(
method epoxyModelList (line 445) | @NonNull
method intValue (line 455) | public AllTypesModelViewModel_ intValue(int intValue) {
method intValue (line 461) | public int intValue() {
method boxedIntValue (line 470) | public AllTypesModelViewModel_ boxedIntValue(@NonNull Integer boxedInt...
method boxedIntValue (line 480) | @NonNull
method longValue (line 490) | public AllTypesModelViewModel_ longValue(long longValue) {
method longValue (line 496) | public long longValue() {
method boxedLongValue (line 505) | public AllTypesModelViewModel_ boxedLongValue(@NonNull Long boxedLongV...
method boxedLongValue (line 515) | @NonNull
method onClickListener (line 523) | public AllTypesModelViewModel_ onClickListener(
method onClickListener (line 541) | public AllTypesModelViewModel_ onClickListener(@NonNull View.OnClickLi...
method onClickListener (line 551) | @NonNull
method rawRes (line 561) | public AllTypesModelViewModel_ rawRes(@RawRes int rawRes) {
method rawRes (line 567) | @RawRes
method stringValue (line 577) | public AllTypesModelViewModel_ stringValue(@NonNull String stringValue) {
method stringValue (line 587) | @NonNull
method stringList (line 597) | public AllTypesModelViewModel_ stringList(@NonNull List<String> string...
method stringList (line 607) | @NonNull
method id (line 612) | @Override
method id (line 618) | @Override
method id (line 624) | @Override
method id (line 630) | @Override
method id (line 636) | @Override
method id (line 642) | @Override
method layout (line 648) | @Override
method spanSizeOverride (line 654) | @Override
method show (line 661) | @Override
method show (line 667) | @Override
method hide (line 673) | @Override
method getDefaultLayout (line 679) | @Override
method reset (line 685) | @Override
method equals (line 711) | @Override
method hashCode (line 783) | @Override
method toString (line 810) | @Override
method from (line 831) | public static AllTypesModelViewModel_ from(ModelProperties properties) {
method getSpanSize (line 882) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ksp/BasicModelWithFinalAttribute_.java
class BasicModelWithFinalAttribute_ (line 14) | public class BasicModelWithFinalAttribute_ extends BasicModelWithFinalAt...
method BasicModelWithFinalAttribute_ (line 23) | public BasicModelWithFinalAttribute_() {
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method handlePostBind (line 38) | @Override
method onBind (line 54) | public BasicModelWithFinalAttribute_ onBind(
method unbind (line 61) | @Override
method onUnbind (line 77) | public BasicModelWithFinalAttribute_ onUnbind(
method onVisibilityStateChanged (line 84) | @Override
method onVisibilityStateChanged (line 98) | public BasicModelWithFinalAttribute_ onVisibilityStateChanged(
method onVisibilityChanged (line 105) | @Override
method onVisibilityChanged (line 120) | public BasicModelWithFinalAttribute_ onVisibilityChanged(
method value (line 127) | public int value() {
method id (line 131) | @Override
method id (line 137) | @Override
method id (line 143) | @Override
method id (line 149) | @Override
method id (line 155) | @Override
method id (line 161) | @Override
method layout (line 167) | @Override
method spanSizeOverride (line 173) | @Override
method show (line 180) | @Override
method show (line 186) | @Override
method hide (line 192) | @Override
method reset (line 198) | @Override
method equals (line 208) | @Override
method hashCode (line 238) | @Override
method toString (line 249) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ksp/CallbackPropModelViewModel_.java
class CallbackPropModelViewModel_ (line 15) | public class CallbackPropModelViewModel_ extends EpoxyModel<CallbackProp...
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method bind (line 39) | @Override
method bind (line 45) | @Override
method handlePostBind (line 59) | @Override
method onBind (line 75) | public CallbackPropModelViewModel_ onBind(
method unbind (line 82) | @Override
method onUnbind (line 99) | public CallbackPropModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 106) | @Override
method onVisibilityStateChanged (line 120) | public CallbackPropModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 127) | @Override
method onVisibilityChanged (line 142) | public CallbackPropModelViewModel_ onVisibilityChanged(
method onClickListener (line 152) | public CallbackPropModelViewModel_ onClickListener(
method onClickListener (line 169) | public CallbackPropModelViewModel_ onClickListener(
method onClickListener (line 176) | @Nullable
method id (line 181) | @Override
method id (line 187) | @Override
method id (line 193) | @Override
method id (line 199) | @Override
method id (line 205) | @Override
method id (line 211) | @Override
method layout (line 217) | @Override
method spanSizeOverride (line 223) | @Override
method show (line 230) | @Override
method show (line 236) | @Override
method hide (line 242) | @Override
method getDefaultLayout (line 248) | @Override
method reset (line 254) | @Override
method equals (line 265) | @Override
method hashCode (line 295) | @Override
method toString (line 306) | @Override
method from (line 313) | public static CallbackPropModelViewModel_ from(ModelProperties propert...
method getSpanSize (line 322) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ksp/GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_.java
class GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_ (line 17) | public class GroupPropMultipleSupportedAttributeDifferentNameModelViewMo...
method addTo (line 39) | @Override
method handlePreBind (line 45) | @Override
method bind (line 51) | @Override
method bind (line 65) | @Override
method handlePostBind (line 91) | @Override
method onBind (line 108) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method unbind (line 115) | @Override
method onUnbind (line 131) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method onVisibilityStateChanged (line 138) | @Override
method onVisibilityStateChanged (line 153) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method onVisibilityChanged (line 160) | @Override
method onVisibilityChanged (line 176) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method titleString (line 188) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method titleStringString (line 201) | @NonNull
method titleInt (line 211) | public GroupPropMultipleSupportedAttributeDifferentNameModelViewModel_...
method titleIntInt (line 220) | public int titleIntInt() {
method id (line 224) | @Override
method id (line 230) | @Override
method id (line 237) | @Override
method id (line 243) | @Override
method id (line 250) | @Override
method id (line 257) | @Override
method layout (line 264) | @Override
method spanSizeOverride (line 270) | @Override
method show (line 277) | @Override
method show (line 283) | @Override
method hide (line 289) | @Override
method getDefaultLayout (line 295) | @Override
method reset (line 301) | @Override
method equals (line 314) | @Override
method hashCode (line 347) | @Override
method toString (line 359) | @Override
method from (line 367) | public static GroupPropMultipleSupportedAttributeDifferentNameModelVie...
method getSpanSize (line 379) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ksp/GroupPropMultipleSupportedAttributeSameNameModelViewModel_.java
class GroupPropMultipleSupportedAttributeSameNameModelViewModel_ (line 17) | public class GroupPropMultipleSupportedAttributeSameNameModelViewModel_ ...
method addTo (line 39) | @Override
method handlePreBind (line 45) | @Override
method bind (line 51) | @Override
method bind (line 65) | @Override
method handlePostBind (line 91) | @Override
method onBind (line 108) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ onBind(
method unbind (line 115) | @Override
method onUnbind (line 131) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ onUn...
method onVisibilityStateChanged (line 138) | @Override
method onVisibilityStateChanged (line 153) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ onVi...
method onVisibilityChanged (line 160) | @Override
method onVisibilityChanged (line 176) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ onVi...
method titleString (line 188) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ titl...
method titleStringString (line 201) | @NonNull
method titleInt (line 211) | public GroupPropMultipleSupportedAttributeSameNameModelViewModel_ titl...
method titleIntInt (line 220) | public int titleIntInt() {
method id (line 224) | @Override
method id (line 230) | @Override
method id (line 236) | @Override
method id (line 242) | @Override
method id (line 248) | @Override
method id (line 255) | @Override
method layout (line 262) | @Override
method spanSizeOverride (line 268) | @Override
method show (line 275) | @Override
method show (line 281) | @Override
method hide (line 287) | @Override
method getDefaultLayout (line 293) | @Override
method reset (line 299) | @Override
method equals (line 312) | @Override
method hashCode (line 345) | @Override
method toString (line 357) | @Override
method from (line 365) | public static GroupPropMultipleSupportedAttributeSameNameModelViewMode...
method getSpanSize (line 377) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ksp/GroupPropSingleSupportedAttributeModelViewModel_.java
class GroupPropSingleSupportedAttributeModelViewModel_ (line 18) | public class GroupPropSingleSupportedAttributeModelViewModel_ extends Ep...
method addTo (line 41) | @Override
method handlePreBind (line 50) | @Override
method bind (line 56) | @Override
method bind (line 67) | @Override
method handlePostBind (line 89) | @Override
method onBind (line 106) | public GroupPropSingleSupportedAttributeModelViewModel_ onBind(
method unbind (line 113) | @Override
method onUnbind (line 129) | public GroupPropSingleSupportedAttributeModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 136) | @Override
method onVisibilityStateChanged (line 151) | public GroupPropSingleSupportedAttributeModelViewModel_ onVisibilitySt...
method onVisibilityChanged (line 158) | @Override
method onVisibilityChanged (line 174) | public GroupPropSingleSupportedAttributeModelViewModel_ onVisibilityCh...
method title (line 186) | public GroupPropSingleSupportedAttributeModelViewModel_ title(@NonNull...
method titleString (line 198) | @NonNull
method title (line 208) | public GroupPropSingleSupportedAttributeModelViewModel_ title(@NonNull...
method titleObject (line 220) | @NonNull
method id (line 225) | @Override
method id (line 231) | @Override
method id (line 237) | @Override
method id (line 243) | @Override
method id (line 249) | @Override
method id (line 256) | @Override
method layout (line 262) | @Override
method spanSizeOverride (line 268) | @Override
method show (line 275) | @Override
method show (line 281) | @Override
method hide (line 287) | @Override
method getDefaultLayout (line 293) | @Override
method reset (line 299) | @Override
method equals (line 312) | @Override
method hashCode (line 345) | @Override
method toString (line 357) | @Override
method from (line 365) | public static GroupPropSingleSupportedAttributeModelViewModel_ from(Mo...
method getSpanSize (line 374) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ksp/ListSubtypeModelViewModel_.java
class ListSubtypeModelViewModel_ (line 19) | public class ListSubtypeModelViewModel_ extends EpoxyModel<ListSubtypeMo...
method addTo (line 36) | @Override
method handlePreBind (line 45) | @Override
method bind (line 51) | @Override
method bind (line 57) | @Override
method handlePostBind (line 71) | @Override
method onBind (line 87) | public ListSubtypeModelViewModel_ onBind(
method unbind (line 94) | @Override
method onUnbind (line 110) | public ListSubtypeModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 117) | @Override
method onVisibilityStateChanged (line 131) | public ListSubtypeModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 138) | @Override
method onVisibilityChanged (line 153) | public ListSubtypeModelViewModel_ onVisibilityChanged(
method stringArrayList (line 165) | public ListSubtypeModelViewModel_ stringArrayList(@NonNull ArrayList<S...
method stringArrayList (line 175) | @NonNull
method id (line 180) | @Override
method id (line 186) | @Override
method id (line 192) | @Override
method id (line 198) | @Override
method id (line 204) | @Override
method id (line 210) | @Override
method layout (line 216) | @Override
method spanSizeOverride (line 222) | @Override
method show (line 229) | @Override
method show (line 235) | @Override
method hide (line 241) | @Override
method getDefaultLayout (line 247) | @Override
method reset (line 253) | @Override
method equals (line 265) | @Override
method hashCode (line 295) | @Override
method toString (line 306) | @Override
method getSpanSize (line 313) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ksp/ModelFactoryBaseModelViewModel_.java
class ModelFactoryBaseModelViewModel_ (line 18) | public class ModelFactoryBaseModelViewModel_ extends EpoxyModel<ModelFac...
method addTo (line 35) | @Override
method handlePreBind (line 44) | @Override
method bind (line 50) | @Override
method bind (line 56) | @Override
method handlePostBind (line 70) | @Override
method onBind (line 86) | public ModelFactoryBaseModelViewModel_ onBind(
method unbind (line 93) | @Override
method onUnbind (line 109) | public ModelFactoryBaseModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 116) | @Override
method onVisibilityStateChanged (line 131) | public ModelFactoryBaseModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 138) | @Override
method onVisibilityChanged (line 153) | public ModelFactoryBaseModelViewModel_ onVisibilityChanged(
method title (line 165) | public ModelFactoryBaseModelViewModel_ title(@NonNull String title) {
method title (line 175) | @NonNull
method id (line 180) | @Override
method id (line 186) | @Override
method id (line 192) | @Override
method id (line 198) | @Override
method id (line 204) | @Override
method id (line 211) | @Override
method layout (line 217) | @Override
method spanSizeOverride (line 223) | @Override
method show (line 230) | @Override
method show (line 236) | @Override
method hide (line 242) | @Override
method getDefaultLayout (line 248) | @Override
method reset (line 254) | @Override
method equals (line 266) | @Override
method hashCode (line 296) | @Override
method toString (line 307) | @Override
method from (line 314) | public static ModelFactoryBaseModelViewModel_ from(ModelProperties pro...
method getSpanSize (line 323) | @Override
FILE: epoxy-modelfactorytest/src/test/resources/ksp/ModelFactoryBasicModelWithAttribute_.java
class ModelFactoryBasicModelWithAttribute_ (line 14) | public class ModelFactoryBasicModelWithAttribute_ extends ModelFactoryBa...
method ModelFactoryBasicModelWithAttribute_ (line 23) | public ModelFactoryBasicModelWithAttribute_() {
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method handlePostBind (line 38) | @Override
method onBind (line 54) | public ModelFactoryBasicModelWithAttribute_ onBind(
method unbind (line 61) | @Override
method onUnbind (line 77) | public ModelFactoryBasicModelWithAttribute_ onUnbind(
method onVisibilityStateChanged (line 84) | @Override
method onVisibilityStateChanged (line 98) | public ModelFactoryBasicModelWithAttribute_ onVisibilityStateChanged(
method onVisibilityChanged (line 105) | @Override
method onVisibilityChanged (line 120) | public ModelFactoryBasicModelWithAttribute_ onVisibilityChanged(
method value (line 127) | public ModelFactoryBasicModelWithAttribute_ value(int value) {
method value (line 133) | public int value() {
method id (line 137) | @Override
method id (line 143) | @Override
method id (line 149) | @Override
method id (line 155) | @Override
method id (line 161) | @Override
method id (line 168) | @Override
method layout (line 174) | @Override
method spanSizeOverride (line 180) | @Override
method show (line 187) | @Override
method show (line 193) | @Override
method hide (line 199) | @Override
method reset (line 205) | @Override
method equals (line 216) | @Override
method hashCode (line 246) | @Override
method toString (line 257) | @Override
method from (line 264) | public static ModelFactoryBasicModelWithAttribute_ from(ModelPropertie...
FILE: epoxy-modelfactorytest/src/test/resources/ksp/TextPropModelViewModel_.java
class TextPropModelViewModel_ (line 21) | public class TextPropModelViewModel_ extends EpoxyModel<TextPropModelVie...
method addTo (line 37) | @Override
method handlePreBind (line 46) | @Override
method bind (line 52) | @Override
method bind (line 58) | @Override
method handlePostBind (line 72) | @Override
method onBind (line 88) | public TextPropModelViewModel_ onBind(
method unbind (line 95) | @Override
method onUnbind (line 111) | public TextPropModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 118) | @Override
method onVisibilityStateChanged (line 132) | public TextPropModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 139) | @Override
method onVisibilityChanged (line 154) | public TextPropModelViewModel_ onVisibilityChanged(
method getTitle (line 161) | public CharSequence getTitle(Context context) {
method title (line 170) | public TextPropModelViewModel_ title(@NonNull CharSequence title) {
method title (line 187) | public TextPropModelViewModel_ title(@StringRes int stringRes) {
method title (line 201) | public TextPropModelViewModel_ title(@StringRes int stringRes, Object....
method titleQuantityRes (line 215) | public TextPropModelViewModel_ titleQuantityRes(@PluralsRes int plural...
method id (line 223) | @Override
method id (line 229) | @Override
method id (line 235) | @Override
method id (line 241) | @Override
method id (line 247) | @Override
method id (line 253) | @Override
method layout (line 259) | @Override
method spanSizeOverride (line 265) | @Override
method show (line 272) | @Override
method show (line 278) | @Override
method hide (line 284) | @Override
method getDefaultLayout (line 290) | @Override
method reset (line 296) | @Override
method equals (line 308) | @Override
method hashCode (line 338) | @Override
method toString (line 349) | @Override
method from (line 356) | public static TextPropModelViewModel_ from(ModelProperties properties) {
method getSpanSize (line 365) | @Override
FILE: epoxy-processor/src/main/java/com/airbnb/epoxy/processor/ImportScanner.java
class ImportScanner (line 14) | public class ImportScanner extends ElementScanner7<Void, Void> {
method getImportedTypes (line 18) | public Set<String> getImportedTypes() {
method visitType (line 22) | @Override
method visitExecutable (line 34) | @Override
method visitTypeParameter (line 42) | @Override
method visitVariable (line 50) | @Override
FILE: epoxy-processortest/src/main/java/com/airbnb/integrationtest/processortest/ProcessorTestModel.java
class ProcessorTestModel (line 8) | public class ProcessorTestModel extends ProcessorTest2Model<View> {
method getDefaultLayout (line 13) | @Override
FILE: epoxy-processortest/src/main/java/com/airbnb/integrationtest/processortest/differentpackage/Model.java
class Model (line 6) | public class Model extends ProcessorTestModel {
FILE: epoxy-processortest/src/test/java/com/airbnb/epoxy/testpackage/DifferentPackageTest.java
class DifferentPackageTest (line 13) | public class DifferentPackageTest {
method differentPackageUsage (line 15) | @Test
FILE: epoxy-processortest/src/test/resources/AbstractEpoxyModelWithView.java
class AbstractEpoxyModelWithView (line 11) | @EpoxyModelClass
method buildView (line 13) | @Override
FILE: epoxy-processortest/src/test/resources/AbstractEpoxyModelWithView_.java
class AbstractEpoxyModelWithView_ (line 15) | public class AbstractEpoxyModelWithView_ extends AbstractEpoxyModelWithV...
method AbstractEpoxyModelWithView_ (line 24) | public AbstractEpoxyModelWithView_() {
method addTo (line 28) | @Override
method handlePreBind (line 34) | @Override
method handlePostBind (line 39) | @Override
method onBind (line 55) | public AbstractEpoxyModelWithView_ onBind(
method unbind (line 62) | @Override
method onUnbind (line 78) | public AbstractEpoxyModelWithView_ onUnbind(
method onVisibilityStateChanged (line 85) | @Override
method onVisibilityStateChanged (line 99) | public AbstractEpoxyModelWithView_ onVisibilityStateChanged(
method onVisibilityChanged (line 106) | @Override
method onVisibilityChanged (line 121) | public AbstractEpoxyModelWithView_ onVisibilityChanged(
method layout (line 128) | @Override
method id (line 134) | @Override
method id (line 140) | @Override
method id (line 146) | @Override
method id (line 152) | @Override
method id (line 158) | @Override
method id (line 165) | @Override
method spanSizeOverride (line 171) | @Override
method show (line 178) | @Override
method show (line 184) | @Override
method hide (line 190) | @Override
method reset (line 196) | @Override
method equals (line 206) | @Override
method hashCode (line 233) | @Override
method toString (line 243) | @Override
FILE: epoxy-processortest/src/test/resources/AbstractModelWithHolder.java
class AbstractModelWithHolder (line 6) | @EpoxyModelClass
method getDefaultLayout (line 11) | @Override
class Holder (line 16) | static class Holder extends EpoxyHolder {
method bindView (line 18) | protected void bindView(@NonNull View itemView) {
FILE: epoxy-processortest/src/test/resources/AbstractModelWithHolder_.java
class AbstractModelWithHolder_ (line 15) | public class AbstractModelWithHolder_ extends AbstractModelWithHolder im...
method AbstractModelWithHolder_ (line 24) | public AbstractModelWithHolder_() {
method addTo (line 28) | @Override
method handlePreBind (line 34) | @Override
method handlePostBind (line 40) | @Override
method onBind (line 56) | public AbstractModelWithHolder_ onBind(
method unbind (line 63) | @Override
method onUnbind (line 79) | public AbstractModelWithHolder_ onUnbind(
method onVisibilityStateChanged (line 86) | @Override
method onVisibilityStateChanged (line 101) | public AbstractModelWithHolder_ onVisibilityStateChanged(
method onVisibilityChanged (line 108) | @Override
method onVisibilityChanged (line 123) | public AbstractModelWithHolder_ onVisibilityChanged(
method value (line 130) | public AbstractModelWithHolder_ value(int value) {
method value (line 136) | public int value() {
method id (line 140) | @Override
method id (line 146) | @Override
method id (line 152) | @Override
method id (line 158) | @Override
method id (line 164) | @Override
method id (line 171) | @Override
method layout (line 177) | @Override
method spanSizeOverride (line 183) | @Override
method show (line 190) | @Override
method show (line 196) | @Override
method hide (line 202) | @Override
method createNewHolder (line 208) | @Override
method reset (line 213) | @Override
method equals (line 224) | @Override
method hashCode (line 254) | @Override
method toString (line 265) | @Override
FILE: epoxy-processortest/src/test/resources/AutoLayoutModelView.java
class AutoLayoutModelView (line 6) | @ModelView(autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT)
method AutoLayoutModelView (line 9) | public AutoLayoutModelView(Context context) {
method setValue (line 13) | @ModelProp
FILE: epoxy-processortest/src/test/resources/AutoLayoutModelViewManualLayoutParams.java
class AutoLayoutModelViewManualLayoutParams (line 9) | @ModelView(autoLayout = Size.MANUAL)
method AutoLayoutModelViewManualLayoutParams (line 12) | public AutoLayoutModelViewManualLayoutParams(Context context) {
method setValue (line 17) | @ModelProp
FILE: epoxy-processortest/src/test/resources/AutoLayoutModelViewManualLayoutParamsModel_.java
class AutoLayoutModelViewManualLayoutParamsModel_ (line 17) | public class AutoLayoutModelViewManualLayoutParamsModel_ extends EpoxyMo...
method addTo (line 28) | @Override
method getViewType (line 34) | @Override
method buildView (line 39) | @Override
method handlePreBind (line 48) | @Override
method bind (line 54) | @Override
method bind (line 60) | @Override
method handlePostBind (line 74) | @Override
method onBind (line 90) | public AutoLayoutModelViewManualLayoutParamsModel_ onBind(
method unbind (line 97) | @Override
method onUnbind (line 113) | public AutoLayoutModelViewManualLayoutParamsModel_ onUnbind(
method onVisibilityStateChanged (line 120) | @Override
method onVisibilityStateChanged (line 135) | public AutoLayoutModelViewManualLayoutParamsModel_ onVisibilityStateCh...
method onVisibilityChanged (line 142) | @Override
method onVisibilityChanged (line 157) | public AutoLayoutModelViewManualLayoutParamsModel_ onVisibilityChanged(
method value (line 169) | public AutoLayoutModelViewManualLayoutParamsModel_ value(int value) {
method value (line 175) | public int value() {
method id (line 179) | @Override
method id (line 185) | @Override
method id (line 191) | @Override
method id (line 197) | @Override
method id (line 203) | @Override
method id (line 210) | @Override
method layout (line 216) | @Override
method spanSizeOverride (line 221) | @Override
method show (line 228) | @Override
method show (line 234) | @Override
method hide (line 240) | @Override
method getDefaultLayout (line 246) | @Override
method reset (line 252) | @Override
method equals (line 263) | @Override
method hashCode (line 293) | @Override
method toString (line 304) | @Override
method getSpanSize (line 311) | @Override
FILE: epoxy-processortest/src/test/resources/AutoLayoutModelViewMatchParent.java
class AutoLayoutModelViewMatchParent (line 8) | @ModelView(autoLayout = Size.MATCH_WIDTH_MATCH_HEIGHT)
method AutoLayoutModelViewMatchParent (line 11) | public AutoLayoutModelViewMatchParent(Context context) {
method setValue (line 15) | @ModelProp
FILE: epoxy-processortest/src/test/resources/AutoLayoutModelViewMatchParentModel_.java
class AutoLayoutModelViewMatchParentModel_ (line 16) | public class AutoLayoutModelViewMatchParentModel_ extends EpoxyModel<Aut...
method addTo (line 27) | @Override
method getViewType (line 33) | @Override
method buildView (line 38) | @Override
method handlePreBind (line 45) | @Override
method bind (line 51) | @Override
method bind (line 57) | @Override
method handlePostBind (line 71) | @Override
method onBind (line 87) | public AutoLayoutModelViewMatchParentModel_ onBind(
method unbind (line 94) | @Override
method onUnbind (line 110) | public AutoLayoutModelViewMatchParentModel_ onUnbind(
method onVisibilityStateChanged (line 117) | @Override
method onVisibilityStateChanged (line 132) | public AutoLayoutModelViewMatchParentModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 139) | @Override
method onVisibilityChanged (line 154) | public AutoLayoutModelViewMatchParentModel_ onVisibilityChanged(
method value (line 166) | public AutoLayoutModelViewMatchParentModel_ value(int value) {
method value (line 172) | public int value() {
method id (line 176) | @Override
method id (line 182) | @Override
method id (line 188) | @Override
method id (line 194) | @Override
method id (line 200) | @Override
method id (line 207) | @Override
method layout (line 213) | @Override
method spanSizeOverride (line 218) | @Override
method show (line 225) | @Override
method show (line 231) | @Override
method hide (line 237) | @Override
method getDefaultLayout (line 243) | @Override
method reset (line 249) | @Override
method equals (line 260) | @Override
method hashCode (line 290) | @Override
method toString (line 301) | @Override
method getSpanSize (line 308) | @Override
FILE: epoxy-processortest/src/test/resources/AutoLayoutModelViewModel_.java
class AutoLayoutModelViewModel_ (line 16) | public class AutoLayoutModelViewModel_ extends EpoxyModel<AutoLayoutMode...
method addTo (line 27) | @Override
method getViewType (line 33) | @Override
method buildView (line 38) | @Override
method handlePreBind (line 45) | @Override
method bind (line 51) | @Override
method bind (line 57) | @Override
method handlePostBind (line 71) | @Override
method onBind (line 87) | public AutoLayoutModelViewModel_ onBind(
method unbind (line 94) | @Override
method onUnbind (line 110) | public AutoLayoutModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 117) | @Override
method onVisibilityStateChanged (line 131) | public AutoLayoutModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 138) | @Override
method onVisibilityChanged (line 153) | public AutoLayoutModelViewModel_ onVisibilityChanged(
method value (line 165) | public AutoLayoutModelViewModel_ value(int value) {
method value (line 171) | public int value() {
method id (line 175) | @Override
method id (line 181) | @Override
method id (line 187) | @Override
method id (line 193) | @Override
method id (line 199) | @Override
method id (line 206) | @Override
method layout (line 212) | @Override
method spanSizeOverride (line 217) | @Override
method show (line 224) | @Override
method show (line 230) | @Override
method hide (line 236) | @Override
method getDefaultLayout (line 242) | @Override
method reset (line 248) | @Override
method equals (line 259) | @Override
method hashCode (line 289) | @Override
method toString (line 300) | @Override
method getSpanSize (line 307) | @Override
FILE: epoxy-processortest/src/test/resources/AutoModelNotInAutoAdapter.java
class AutoModelNotInAutoAdapter (line 6) | public class AutoModelNotInAutoAdapter {
FILE: epoxy-processortest/src/test/resources/AutoModelNotOnModelField.java
class AutoModelNotOnModelField (line 6) | public class AutoModelNotOnModelField extends EpoxyController {
method buildModels (line 10) | @Override
FILE: epoxy-processortest/src/test/resources/BaseModelView.java
class BaseModelView (line 6) | @ModelView(defaultLayout = 1, baseModelClass = TestBaseModel.class)
method BaseModelView (line 9) | public BaseModelView(Context context) {
method setClickListener (line 13) | @ModelProp
FILE: epoxy-processortest/src/test/resources/BaseModelViewModel_.java
class BaseModelViewModel_ (line 18) | public class BaseModelViewModel_ extends TestBaseModel<BaseModelView> im...
method BaseModelViewModel_ (line 35) | public BaseModelViewModel_(long id) {
method addTo (line 39) | @Override
method handlePreBind (line 48) | @Override
method bind (line 54) | @Override
method bind (line 60) | @Override
method handlePostBind (line 74) | @Override
method onBind (line 90) | public BaseModelViewModel_ onBind(
method unbind (line 97) | @Override
method onUnbind (line 113) | public BaseModelViewModel_ onUnbind(
method onVisibilityStateChanged (line 120) | @Override
method onVisibilityStateChanged (line 134) | public BaseModelViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 141) | @Override
method onVisibilityChanged (line 156) | public BaseModelViewModel_ onVisibilityChanged(
method clickListener (line 168) | public BaseModelViewModel_ clickListener(@NonNull String clickListener) {
method clickListener (line 178) | @NonNull
method id (line 183) | @Override
method id (line 189) | @Override
method id (line 195) | @Override
method id (line 201) | @Override
method id (line 207) | @Override
method id (line 213) | @Override
method layout (line 219) | @Override
method spanSizeOverride (line 225) | @Override
method show (line 232) | @Override
method show (line 238) | @Override
method hide (line 244) | @Override
method getDefaultLayout (line 250) | @Override
method reset (line 256) | @Override
method equals (line 268) | @Override
method hashCode (line 298) | @Override
method toString (line 309) | @Override
method getSpanSize (line 316) | @Override
FILE: epoxy-processortest/src/test/resources/BasicModelWithAttribute.java
class BasicModelWithAttribute (line 3) | public class BasicModelWithAttribute extends EpoxyModel<Object> {
method getDefaultLayout (line 6) | @Override
FILE: epoxy-processortest/src/test/resources/BasicModelWithAttribute_.java
class BasicModelWithAttribute_ (line 14) | public class BasicModelWithAttribute_ extends BasicModelWithAttribute im...
method BasicModelWithAttribute_ (line 23) | public BasicModelWithAttribute_() {
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method handlePostBind (line 38) | @Override
method onBind (line 54) | public BasicModelWithAttribute_ onBind(
method unbind (line 61) | @Override
method onUnbind (line 77) | public BasicModelWithAttribute_ onUnbind(
method onVisibilityStateChanged (line 84) | @Override
method onVisibilityStateChanged (line 98) | public BasicModelWithAttribute_ onVisibilityStateChanged(
method onVisibilityChanged (line 105) | @Override
method onVisibilityChanged (line 120) | public BasicModelWithAttribute_ onVisibilityChanged(
method value (line 127) | public BasicModelWithAttribute_ value(int value) {
method value (line 133) | public int value() {
method id (line 137) | @Override
method id (line 143) | @Override
method id (line 149) | @Override
method id (line 155) | @Override
method id (line 161) | @Override
method id (line 168) | @Override
method layout (line 174) | @Override
method spanSizeOverride (line 180) | @Override
method show (line 187) | @Override
method show (line 193) | @Override
method hide (line 199) | @Override
method reset (line 205) | @Override
method equals (line 216) | @Override
method hashCode (line 246) | @Override
method toString (line 257) | @Override
FILE: epoxy-processortest/src/test/resources/ControllerProcessorTest/controllerWithAutoModel/ControllerWithAutoModel_EpoxyHelper.java
class ControllerWithAutoModel_EpoxyHelper (line 13) | public class ControllerWithAutoModel_EpoxyHelper extends ControllerHelpe...
method ControllerWithAutoModel_EpoxyHelper (line 20) | public ControllerWithAutoModel_EpoxyHelper(ControllerWithAutoModel con...
method resetAutoModels (line 24) | @Override
method validateModelsHaveNotChanged (line 34) | private void validateModelsHaveNotChanged() {
method validateSameModel (line 40) | private void validateSameModel(EpoxyModel expectedObject, EpoxyModel a...
method saveModelsForNextValidation (line 50) | private void saveModelsForNextValidation() {
FILE: epoxy-processortest/src/test/resources/ControllerProcessorTest/controllerWithAutoModel/ksp/ControllerWithAutoModel_EpoxyHelper.java
class ControllerWithAutoModel_EpoxyHelper (line 15) | public class ControllerWithAutoModel_EpoxyHelper extends ControllerHelpe...
method ControllerWithAutoModel_EpoxyHelper (line 24) | public ControllerWithAutoModel_EpoxyHelper(ControllerWithAutoModel con...
method resetAutoModels (line 28) | @Override
method validateModelsHaveNotChanged (line 40) | private void validateModelsHaveNotChanged() {
method validateSameModel (line 47) | private void validateSameModel(EpoxyModel expectedObject, EpoxyModel a...
method saveModelsForNextValidation (line 57) | private void saveModelsForNextValidation() {
FILE: epoxy-processortest/src/test/resources/ControllerWithAutoModel.java
class ControllerWithAutoModel (line 7) | public class ControllerWithAutoModel extends EpoxyController {
method buildModels (line 12) | @Override
FILE: epoxy-processortest/src/test/resources/ControllerWithAutoModelAndImplicitAdding.java
class ControllerWithAutoModelAndImplicitAdding (line 7) | public class ControllerWithAutoModelAndImplicitAdding extends EpoxyContr...
method buildModels (line 12) | @Override
FILE: epoxy-processortest/src/test/resources/ControllerWithAutoModelAndImplicitAdding_EpoxyHelper.java
class ControllerWithAutoModelAndImplicitAdding_EpoxyHelper (line 13) | public class ControllerWithAutoModelAndImplicitAdding_EpoxyHelper extend...
method ControllerWithAutoModelAndImplicitAdding_EpoxyHelper (line 20) | public ControllerWithAutoModelAndImplicitAdding_EpoxyHelper(
method resetAutoModels (line 25) | @Override
method validateModelsHaveNotChanged (line 37) | private void validateModelsHaveNotChanged() {
method validateSameModel (line 43) | private void validateSameModel(EpoxyModel expectedObject, EpoxyModel a...
method saveModelsForNextValidation (line 53) | private void saveModelsForNextValidation() {
FILE: epoxy-processortest/src/test/resources/ControllerWithAutoModelWithSuperClass$SubControllerWithAutoModelWithSuperClass_EpoxyHelper.java
class ControllerWithAutoModelWithSuperClass$SubControllerWithAutoModelWithSuperClass_EpoxyHelper (line 13) | public class ControllerWithAutoModelWithSuperClass$SubControllerWithAuto...
method ControllerWithAutoModelWithSuperClass$SubControllerWithAutoModelWithSuperClass_EpoxyHelper (line 22) | public ControllerWithAutoModelWithSuperClass$SubControllerWithAutoMode...
method resetAutoModels (line 27) | @Override
method validateModelsHaveNotChanged (line 39) | private void validateModelsHaveNotChanged() {
method validateSameModel (line 46) | private void validateSameModel(EpoxyModel expectedObject, EpoxyModel a...
method saveModelsForNextValidation (line 56) | private void saveModelsForNextValidation() {
FILE: epoxy-processortest/src/test/resources/ControllerWithAutoModelWithSuperClass.java
class ControllerWithAutoModelWithSuperClass (line 7) | public class ControllerWithAutoModelWithSuperClass extends EpoxyControll...
method buildModels (line 12) | @Override
class SubControllerWithAutoModelWithSuperClass (line 17) | public static class SubControllerWithAutoModelWithSuperClass extends C...
method buildModels (line 21) | @Override
FILE: epoxy-processortest/src/test/resources/ControllerWithAutoModelWithSuperClass_EpoxyHelper.java
class ControllerWithAutoModelWithSuperClass_EpoxyHelper (line 13) | public class ControllerWithAutoModelWithSuperClass_EpoxyHelper extends C...
method ControllerWithAutoModelWithSuperClass_EpoxyHelper (line 20) | public ControllerWithAutoModelWithSuperClass_EpoxyHelper(
method resetAutoModels (line 25) | @Override
method validateModelsHaveNotChanged (line 35) | private void validateModelsHaveNotChanged() {
method validateSameModel (line 41) | private void validateSameModel(EpoxyModel expectedObject, EpoxyModel a...
method saveModelsForNextValidation (line 51) | private void saveModelsForNextValidation() {
FILE: epoxy-processortest/src/test/resources/ControllerWithAutoModelWithoutValidation.java
class ControllerWithAutoModelWithoutValidation (line 7) | public class ControllerWithAutoModelWithoutValidation extends EpoxyContr...
method buildModels (line 12) | @Override
FILE: epoxy-processortest/src/test/resources/ControllerWithAutoModelWithoutValidation_EpoxyHelper.java
class ControllerWithAutoModelWithoutValidation_EpoxyHelper (line 10) | public class ControllerWithAutoModelWithoutValidation_EpoxyHelper extend...
method ControllerWithAutoModelWithoutValidation_EpoxyHelper (line 13) | public ControllerWithAutoModelWithoutValidation_EpoxyHelper(
method resetAutoModels (line 18) | @Override
FILE: epoxy-processortest/src/test/resources/ControllerWithAutoModel_EpoxyHelper.java
class ControllerWithAutoModel_EpoxyHelper (line 13) | public class ControllerWithAutoModel_EpoxyHelper extends ControllerHelpe...
method ControllerWithAutoModel_EpoxyHelper (line 20) | public ControllerWithAutoModel_EpoxyHelper(ControllerWithAutoModel con...
method resetAutoModels (line 24) | @Override
method validateModelsHaveNotChanged (line 34) | private void validateModelsHaveNotChanged() {
method validateSameModel (line 40) | private void validateSameModel(EpoxyModel expectedObject, EpoxyModel a...
method saveModelsForNextValidation (line 50) | private void saveModelsForNextValidation() {
FILE: epoxy-processortest/src/test/resources/CustomPackageLayoutPatternViewModel_.java
class CustomPackageLayoutPatternViewModel_ (line 14) | public class CustomPackageLayoutPatternViewModel_ extends EpoxyModel<Cus...
method addTo (line 23) | @Override
method handlePreBind (line 29) | @Override
method bind (line 35) | @Override
method bind (line 40) | @Override
method handlePostBind (line 50) | @Override
method onBind (line 66) | public CustomPackageLayoutPatternViewModel_ onBind(
method unbind (line 73) | @Override
method onUnbind (line 89) | public CustomPackageLayoutPatternViewModel_ onUnbind(
method onVisibilityStateChanged (line 96) | @Override
method onVisibilityStateChanged (line 111) | public CustomPackageLayoutPatternViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 118) | @Override
method onVisibilityChanged (line 133) | public CustomPackageLayoutPatternViewModel_ onVisibilityChanged(
method id (line 140) | @Override
method id (line 146) | @Override
method id (line 152) | @Override
method id (line 158) | @Override
method id (line 164) | @Override
method id (line 171) | @Override
method layout (line 177) | @Override
method spanSizeOverride (line 183) | @Override
method show (line 190) | @Override
method show (line 196) | @Override
method hide (line 202) | @Override
method getDefaultLayout (line 208) | @Override
method reset (line 214) | @Override
method equals (line 224) | @Override
method hashCode (line 251) | @Override
method toString (line 261) | @Override
method getSpanSize (line 267) | @Override
FILE: epoxy-processortest/src/test/resources/DataBindingConfig.java
type EpoxyDataBindingConfig (line 3) | @EpoxyDataBindingLayouts({R.layout.model_with_data_binding})
FILE: epoxy-processortest/src/test/resources/DataBindingModelWithAllFieldTypes.java
class DataBindingModelWithAllFieldTypes (line 5) | @EpoxyModelClass
method getDefaultLayout (line 29) | @Override
FILE: epoxy-processortest/src/test/resources/DataBindingModelWithAllFieldTypesNoValidation.java
class DataBindingModelWithAllFieldTypesNoValidation (line 5) | @EpoxyModelClass
method getDefaultLayout (line 29) | @Override
FILE: epoxy-processortest/src/test/resources/DataBindingModelWithAllFieldTypesNoValidation_.java
class DataBindingModelWithAllFieldTypesNoValidation_ (line 26) | public class DataBindingModelWithAllFieldTypesNoValidation_ extends Data...
method DataBindingModelWithAllFieldTypesNoValidation_ (line 35) | public DataBindingModelWithAllFieldTypesNoValidation_() {
method handlePreBind (line 39) | @Override
method handlePostBind (line 44) | @Override
method onBind (line 59) | public DataBindingModelWithAllFieldTypesNoValidation_ onBind(
method unbind (line 66) | @Override
method onUnbind (line 82) | public DataBindingModelWithAllFieldTypesNoValidation_ onUnbind(
method onVisibilityStateChanged (line 89) | @Override
method onVisibilityStateChanged (line 104) | public DataBindingModelWithAllFieldTypesNoValidation_ onVisibilityStat...
method onVisibilityChanged (line 111) | @Override
method onVisibilityChanged (line 126) | public DataBindingModelWithAllFieldTypesNoValidation_ onVisibilityChan...
method valueInt (line 133) | public DataBindingModelWithAllFieldTypesNoValidation_ valueInt(int val...
method valueInt (line 139) | public int valueInt() {
method valueInteger (line 143) | public DataBindingModelWithAllFieldTypesNoValidation_ valueInteger(Int...
method valueInteger (line 149) | public Integer valueInteger() {
method valueShort (line 153) | public DataBindingModelWithAllFieldTypesNoValidation_ valueShort(short...
method valueShort (line 159) | public short valueShort() {
method valueShortWrapper (line 163) | public DataBindingModelWithAllFieldTypesNoValidation_ valueShortWrappe...
method valueShortWrapper (line 169) | public Short valueShortWrapper() {
method valueChar (line 173) | public DataBindingModelWithAllFieldTypesNoValidation_ valueChar(char v...
method valueChar (line 179) | public char valueChar() {
method valueCharacter (line 183) | public DataBindingModelWithAllFieldTypesNoValidation_ valueCharacter(C...
method valueCharacter (line 189) | public Character valueCharacter() {
method valuebByte (line 193) | public DataBindingModelWithAllFieldTypesNoValidation_ valuebByte(byte ...
method valuebByte (line 199) | public byte valuebByte() {
method valueByteWrapper (line 203) | public DataBindingModelWithAllFieldTypesNoValidation_ valueByteWrapper...
method valueByteWrapper (line 209) | public Byte valueByteWrapper() {
method valueLong (line 213) | public DataBindingModelWithAllFieldTypesNoValidation_ valueLong(long v...
method valueLong (line 219) | public long valueLong() {
method valueLongWrapper (line 223) | public DataBindingModelWithAllFieldTypesNoValidation_ valueLongWrapper...
method valueLongWrapper (line 229) | public Long valueLongWrapper() {
method valueDouble (line 233) | public DataBindingModelWithAllFieldTypesNoValidation_ valueDouble(doub...
method valueDouble (line 239) | public double valueDouble() {
method valueDoubleWrapper (line 243) | public DataBindingModelWithAllFieldTypesNoValidation_ valueDoubleWrapper(
method valueDoubleWrapper (line 250) | public Double valueDoubleWrapper() {
method valueFloat (line 254) | public DataBindingModelWithAllFieldTypesNoValidation_ valueFloat(float...
method valueFloat (line 260) | public float valueFloat() {
method valueFloatWrapper (line 264) | public DataBindingModelWithAllFieldTypesNoValidation_ valueFloatWrappe...
method valueFloatWrapper (line 270) | public Float valueFloatWrapper() {
method valueBoolean (line 274) | public DataBindingModelWithAllFieldTypesNoValidation_ valueBoolean(boo...
method valueBoolean (line 280) | public boolean valueBoolean() {
method valueBooleanWrapper (line 284) | public DataBindingModelWithAllFieldTypesNoValidation_ valueBooleanWrap...
method valueBooleanWrapper (line 291) | public Boolean valueBooleanWrapper() {
method valueIntArray (line 295) | public DataBindingModelWithAllFieldTypesNoValidation_ valueIntArray(in...
method valueIntArray (line 301) | public int[] valueIntArray() {
method valueObjectArray (line 305) | public DataBindingModelWithAllFieldTypesNoValidation_ valueObjectArray(
method valueObjectArray (line 312) | public Object[] valueObjectArray() {
method valueString (line 316) | public DataBindingModelWithAllFieldTypesNoValidation_ valueString(Stri...
method valueString (line 322) | public String valueString() {
method valueObject (line 326) | public DataBindingModelWithAllFieldTypesNoValidation_ valueObject(Obje...
method valueObject (line 332) | public Object valueObject() {
method valueList (line 336) | public DataBindingModelWithAllFieldTypesNoValidation_ valueList(List<S...
method valueList (line 342) | public List<String> valueList() {
method id (line 346) | @Override
method id (line 352) | @Override
method id (line 358) | @Override
method id (line 364) | @Override
method id (line 370) | @Override
method id (line 377) | @Override
method layout (line 383) | @Override
method spanSizeOverride (line 389) | @Override
method show (line 396) | @Override
method show (line 402) | @Override
method hide (line 408) | @Override
method setDataBindingVariables (line 414) | @Override
method setDataBindingVariables (line 439) | @Override
method reset (line 511) | @Override
method equals (line 542) | @Override
method hashCode (line 632) | @Override
method toString (line 665) | @Override
FILE: epoxy-processortest/src/test/resources/DataBindingModelWithAllFieldTypes_.java
class DataBindingModelWithAllFieldTypes_ (line 26) | public class DataBindingModelWithAllFieldTypes_ extends DataBindingModel...
method DataBindingModelWithAllFieldTypes_ (line 35) | public DataBindingModelWithAllFieldTypes_() {
method addTo (line 39) | @Override
method handlePreBind (line 45) | @Override
method handlePostBind (line 51) | @Override
method onBind (line 67) | public DataBindingModelWithAllFieldTypes_ onBind(
method unbind (line 74) | @Override
method onUnbind (line 90) | public DataBindingModelWithAllFieldTypes_ onUnbind(
method onVisibilityStateChanged (line 97) | @Override
method onVisibilityStateChanged (line 112) | public DataBindingModelWithAllFieldTypes_ onVisibilityStateChanged(
method onVisibilityChanged (line 119) | @Override
method onVisibilityChanged (line 134) | public DataBindingModelWithAllFieldTypes_ onVisibilityChanged(
method valueInt (line 141) | public DataBindingModelWithAllFieldTypes_ valueInt(int valueInt) {
method valueInt (line 147) | public int valueInt() {
method valueInteger (line 151) | public DataBindingModelWithAllFieldTypes_ valueInteger(Integer valueIn...
method valueInteger (line 157) | public Integer valueInteger() {
method valueShort (line 161) | public DataBindingModelWithAllFieldTypes_ valueShort(short valueShort) {
method valueShort (line 167) | public short valueShort() {
method valueShortWrapper (line 171) | public DataBindingModelWithAllFieldTypes_ valueShortWrapper(Short valu...
method valueShortWrapper (line 177) | public Short valueShortWrapper() {
method valueChar (line 181) | public DataBindingModelWithAllFieldTypes_ valueChar(char valueChar) {
method valueChar (line 187) | public char valueChar() {
method valueCharacter (line 191) | public DataBindingModelWithAllFieldTypes_ valueCharacter(Character val...
method valueCharacter (line 197) | public Character valueCharacter() {
method valuebByte (line 201) | public DataBindingModelWithAllFieldTypes_ valuebByte(byte valuebByte) {
method valuebByte (line 207) | public byte valuebByte() {
method valueByteWrapper (line 211) | public DataBindingModelWithAllFieldTypes_ valueByteWrapper(Byte valueB...
method valueByteWrapper (line 217) | public Byte valueByteWrapper() {
method valueLong (line 221) | public DataBindingModelWithAllFieldTypes_ valueLong(long valueLong) {
method valueLong (line 227) | public long valueLong() {
method valueLongWrapper (line 231) | public DataBindingModelWithAllFieldTypes_ valueLongWrapper(Long valueL...
method valueLongWrapper (line 237) | public Long valueLongWrapper() {
method valueDouble (line 241) | public DataBindingModelWithAllFieldTypes_ valueDouble(double valueDoub...
method valueDouble (line 247) | public double valueDouble() {
method valueDoubleWrapper (line 251) | public DataBindingModelWithAllFieldTypes_ valueDoubleWrapper(Double va...
method valueDoubleWrapper (line 257) | public Double valueDoubleWrapper() {
method valueFloat (line 261) | public DataBindingModelWithAllFieldTypes_ valueFloat(float valueFloat) {
method valueFloat (line 267) | public float valueFloat() {
method valueFloatWrapper (line 271) | public DataBindingModelWithAllFieldTypes_ valueFloatWrapper(Float valu...
method valueFloatWrapper (line 277) | public Float valueFloatWrapper() {
method valueBoolean (line 281) | public DataBindingModelWithAllFieldTypes_ valueBoolean(boolean valueBo...
method valueBoolean (line 287) | public boolean valueBoolean() {
method valueBooleanWrapper (line 291) | public DataBindingModelWithAllFieldTypes_ valueBooleanWrapper(Boolean ...
method valueBooleanWrapper (line 297) | public Boolean valueBooleanWrapper() {
method valueIntArray (line 301) | public DataBindingModelWithAllFieldTypes_ valueIntArray(int[] valueInt...
method valueIntArray (line 307) | public int[] valueIntArray() {
method valueObjectArray (line 311) | public DataBindingModelWithAllFieldTypes_ valueObjectArray(Object[] va...
method valueObjectArray (line 317) | public Object[] valueObjectArray() {
method valueString (line 321) | public DataBindingModelWithAllFieldTypes_ valueString(String valueStri...
method valueString (line 327) | public String valueString() {
method valueObject (line 331) | public DataBindingModelWithAllFieldTypes_ valueObject(Object valueObje...
method valueObject (line 337) | public Object valueObject() {
method valueList (line 341) | public DataBindingModelWithAllFieldTypes_ valueList(List<String> value...
method valueList (line 347) | public List<String> valueList() {
method id (line 351) | @Override
method id (line 357) | @Override
method id (line 363) | @Override
method id (line 369) | @Override
method id (line 375) | @Override
method id (line 382) | @Override
method layout (line 388) | @Override
method spanSizeOverride (line 394) | @Override
method show (line 401) | @Override
method show (line 407) | @Override
method hide (line 413) | @Override
method setDataBindingVariables (line 419) | @Override
method setDataBindingVariables (line 486) | @Override
method reset (line 558) | @Override
method equals (line 589) | @Override
method hashCode (line 679) | @Override
method toString (line 712) | @Override
FILE: epoxy-processortest/src/test/resources/DefaultPackageLayoutPatternViewModel_.java
class DefaultPackageLayoutPatternViewModel_ (line 14) | public class DefaultPackageLayoutPatternViewModel_ extends EpoxyModel<De...
method addTo (line 23) | @Override
method handlePreBind (line 29) | @Override
method bind (line 35) | @Override
method bind (line 40) | @Override
method handlePostBind (line 50) | @Override
method onBind (line 66) | public DefaultPackageLayoutPatternViewModel_ onBind(
method unbind (line 73) | @Override
method onUnbind (line 89) | public DefaultPackageLayoutPatternViewModel_ onUnbind(
method onVisibilityStateChanged (line 96) | @Override
method onVisibilityStateChanged (line 111) | public DefaultPackageLayoutPatternViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 118) | @Override
method onVisibilityChanged (line 133) | public DefaultPackageLayoutPatternViewModel_ onVisibilityChanged(
method id (line 140) | @Override
method id (line 146) | @Override
method id (line 152) | @Override
method id (line 158) | @Override
method id (line 164) | @Override
method id (line 171) | @Override
method layout (line 177) | @Override
method spanSizeOverride (line 183) | @Override
method show (line 190) | @Override
method show (line 196) | @Override
method hide (line 202) | @Override
method getDefaultLayout (line 208) | @Override
method reset (line 214) | @Override
method equals (line 224) | @Override
method hashCode (line 251) | @Override
method toString (line 261) | @Override
method getSpanSize (line 267) | @Override
FILE: epoxy-processortest/src/test/resources/DoNotHashView.java
class DoNotHashView (line 8) | @ModelView(defaultLayout = 1)
method DoNotHashView (line 11) | public DoNotHashView(Context context) {
method setTitle (line 15) | @ModelProp(options = Option.DoNotHash)
method setClickListener (line 20) | @ModelProp(options = Option.DoNotHash)
method normalProp (line 25) | @ModelProp
FILE: epoxy-processortest/src/test/resources/DoNotHashViewModel_.java
class DoNotHashViewModel_ (line 19) | public class DoNotHashViewModel_ extends EpoxyModel<DoNotHashView> imple...
method addTo (line 48) | @Override
method handlePreBind (line 63) | @Override
method bind (line 69) | @Override
method bind (line 77) | @Override
method handlePostBind (line 99) | @Override
method onBind (line 115) | public DoNotHashViewModel_ onBind(
method unbind (line 122) | @Override
method onUnbind (line 138) | public DoNotHashViewModel_ onUnbind(
method onVisibilityStateChanged (line 145) | @Override
method onVisibilityStateChanged (line 159) | public DoNotHashViewModel_ onVisibilityStateChanged(
method onVisibilityChanged (line 166) | @Override
method onVisibilityChanged (line 181) | public DoNotHashViewModel_ onVisibilityChanged(
method title (line 193) | public DoNotHashViewModel_ title(@NonNull CharSequence title) {
method title (line 203) | @NonNull
method clickListener (line 211) | public DoNotHashViewModel_ clickListener(
method clickListener (line 229) | public DoNotHashViewModel_ clickListener(@NonNull View.OnClickListener...
method clickListener (line 239) | @NonNull
method normalProp (line 249) | public DoNotHashViewModel_ normalProp(@NonNull CharSequence normalProp) {
method normalProp (line 259) | @NonNull
method id (line 264) | @Override
method id (line 270) | @Override
method id (line 276) | @Override
method id (line 282) | @Override
method id (line 288) | @Override
method id (line 294) | @Override
method layout (line 300) | @Override
method spanSizeOverride (line 306) | @Override
method show (line 313) | @Override
method show (line 319) | @Override
method hide (line 325) | @Override
method getDefaultLayout (line 331) | @Override
method reset (line 337) | @Override
method equals (line 351) | @Override
method hashCode (line 387) | @Override
method toString (line 400) | @Override
method getSpanSize (line 409) | @Override
FILE: epoxy-processortest/src/test/resources/EpoxyModelGroupWithAnnotations.java
class EpoxyModelGroupWithAnnotations (line 5) | @EpoxyModelClass
method EpoxyModelGroupWithAnnotations (line 8) | public EpoxyModelGroupWithAnnotations(int layoutRes, Collection<? exte...
FILE: epoxy-processortest/src/test/resources/EpoxyModelGroupWithAnnotations_.java
class EpoxyModelGroupWithAnnotations_ (line 15) | public class EpoxyModelGroupWithAnnotations_ extends EpoxyModelGroupWith...
method EpoxyModelGroupWithAnnotations_ (line 24) | public EpoxyModelGroupWithAnnotations_(int layoutRes,
method addTo (line 29) | @Override
method handlePreBind (line 35) | @Override
method handlePostBind (line 41) | @Override
method onBind (line 57) | public EpoxyModelGroupWithAnnotations_ onBind(
method unbind (line 64) | @Override
method onUnbind (line 80) | public EpoxyModelGroupWithAnnotations_ onUnbind(
method onVisibilityStateChanged (line 87) | @Override
method onVisibilityStateChanged (line 101) | public EpoxyModelGroupWithAnnotations_ onVisibilityStateChanged(
method onVisibilityChanged (line 108) | @Override
method onVisibilityChanged (line 123) | public EpoxyModelGroupWithAnnotations_ onVisibilityChanged(
method value (line 130) | public EpoxyModelGroupWithAnnotations_ value(int value) {
method value (line 136) | public int value() {
method shouldSaveViewState (line 140) | @Override
method id (line 146) | @Override
method id (line 152) | @Override
method id (line 158) | @Override
method id (line 164) | @Override
method id (line 170) | @Override
method id (line 177) | @Override
method layout (line 183) | @Override
method spanSizeOverride (line 189) | @Override
method show (line 196) | @Override
method show (line 202) | @Override
method hide (line 208) | @Override
method reset (line 214) | @Override
method equals (line 225) | @Override
method hashCode (line 255) | @Override
method toString (line 266) | @Override
FILE: epoxy-processortest/src/test/resources/GenerateDefaultLayoutMethod.java
class GenerateDefaultLayoutMethod (line 3) | @EpoxyModelClass(layout = 1)
FILE: epoxy-processortest/src/test/resources/GenerateDefaultLayoutMethodNextParentLayout$NoLayout_.java
class GenerateDefaultLayoutMethodNextParentLayout$NoLayout_ (line 14) | public class GenerateDefaultLayoutMethodNextParentLayout$NoLayout_ exten...
method GenerateDefaultLayoutMethodNextParentLayout$NoLayout_ (line 23) | public GenerateDefaultLayoutMethodNextParentLayout$NoLayout_() {
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method handlePostBind (line 38) | @Override
method onBind (line 54) | public GenerateDefaultLayoutMethodNextParentLayout$NoLayout_ onBind(
method unbind (line 61) | @Override
method onUnbind (line 77) | public GenerateDefaultLayoutMethodNextParentLayout$NoLayout_ onUnbind(
method onVisibilityStateChanged (line 84) | @Override
method onVisibilityStateChanged (line 98) | public GenerateDefaultLayoutMethodNextParentLayout$NoLayout_ onVisibil...
method onVisibilityChanged (line 105) | @Override
method onVisibilityChanged (line 120) | public GenerateDefaultLayoutMethodNextParentLayout$NoLayout_ onVisibil...
method value (line 127) | public GenerateDefaultLayoutMethodNextParentLayout$NoLayout_ value(int...
method value (line 133) | public int value() {
method id (line 137) | @Override
method id (line 143) | @Override
method id (line 149) | @Override
method id (line 155) | @Override
method id (line 161) | @Override
method id (line 168) | @Override
method layout (line 175) | @Override
method spanSizeOverride (line 181) | @Override
method show (line 188) | @Override
method show (line 194) | @Override
method hide (line 200) | @Override
method getDefaultLayout (line 206) | @Override
method reset (line 212) | @Override
method equals (line 223) | @Override
method hashCode (line 253) | @Override
method toString (line 264) | @Override
FILE: epoxy-processortest/src/test/resources/GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_.java
class GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_ (line 14) | public class GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_ ...
method GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_ (line 23) | public GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_() {
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method handlePostBind (line 38) | @Override
method onBind (line 54) | public GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_ onBind(
method unbind (line 61) | @Override
method onUnbind (line 77) | public GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_ onUn...
method onVisibilityStateChanged (line 84) | @Override
method onVisibilityStateChanged (line 98) | public GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_ onVi...
method onVisibilityChanged (line 105) | @Override
method onVisibilityChanged (line 120) | public GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_ onVi...
method id (line 127) | @Override
method id (line 133) | @Override
method id (line 139) | @Override
method id (line 145) | @Override
method id (line 151) | @Override
method id (line 158) | @Override
method layout (line 165) | @Override
method spanSizeOverride (line 172) | @Override
method show (line 179) | @Override
method show (line 185) | @Override
method hide (line 191) | @Override
method getDefaultLayout (line 197) | @Override
method reset (line 203) | @Override
method equals (line 213) | @Override
method hashCode (line 240) | @Override
method toString (line 250) | @Override
FILE: epoxy-processortest/src/test/resources/GenerateDefaultLayoutMethodNextParentLayout$WithLayout_.java
class GenerateDefaultLayoutMethodNextParentLayout$WithLayout_ (line 14) | public class GenerateDefaultLayoutMethodNextParentLayout$WithLayout_ ext...
method GenerateDefaultLayoutMethodNextParentLayout$WithLayout_ (line 23) | public GenerateDefaultLayoutMethodNextParentLayout$WithLayout_() {
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method handlePostBind (line 38) | @Override
method onBind (line 54) | public GenerateDefaultLayoutMethodNextParentLayout$WithLayout_ onBind(
method unbind (line 61) | @Override
method onUnbind (line 77) | public GenerateDefaultLayoutMethodNextParentLayout$WithLayout_ onUnbind(
method onVisibilityStateChanged (line 84) | @Override
method onVisibilityStateChanged (line 98) | public GenerateDefaultLayoutMethodNextParentLayout$WithLayout_ onVisib...
method onVisibilityChanged (line 105) | @Override
method onVisibilityChanged (line 120) | public GenerateDefaultLayoutMethodNextParentLayout$WithLayout_ onVisib...
method id (line 127) | @Override
method id (line 133) | @Override
method id (line 139) | @Override
method id (line 145) | @Override
method id (line 151) | @Override
method id (line 158) | @Override
method layout (line 165) | @Override
method spanSizeOverride (line 171) | @Override
method show (line 178) | @Override
method show (line 184) | @Override
method hide (line 190) | @Override
method getDefaultLayout (line 196) | @Override
method reset (line 202) | @Override
method equals (line 212) | @Override
method hashCode (line 239) | @Override
method toString (line 249) | @Override
FILE: epoxy-processortest/src/test/resources/GenerateDefaultLayoutMethodNextParentLayout.java
class GenerateDefaultLayoutMethodNextParentLayout (line 3) | public class GenerateDefaultLayoutMethodNextParentLayout {
class NoLayout (line 5) | @EpoxyModelClass
class StillNoLayout (line 10) | @EpoxyModelClass
class WithLayout (line 15) | @EpoxyModelClass(layout = 1)
FILE: epoxy-processortest/src/test/resources/GenerateDefaultLayoutMethodNoLayout.java
class GenerateDefaultLayoutMethodNoLayout (line 3) | @EpoxyModelClass
FILE: epoxy-processortest/src/test/resources/GenerateDefaultLayoutMethodParentLayout$NoLayout_.java
class GenerateDefaultLayoutMethodParentLayout$NoLayout_ (line 14) | public class GenerateDefaultLayoutMethodParentLayout$NoLayout_ extends G...
method GenerateDefaultLayoutMethodParentLayout$NoLayout_ (line 23) | public GenerateDefaultLayoutMethodParentLayout$NoLayout_() {
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method handlePostBind (line 38) | @Override
method onBind (line 54) | public GenerateDefaultLayoutMethodParentLayout$NoLayout_ onBind(
method unbind (line 61) | @Override
method onUnbind (line 77) | public GenerateDefaultLayoutMethodParentLayout$NoLayout_ onUnbind(
method onVisibilityStateChanged (line 84) | @Override
method onVisibilityStateChanged (line 98) | public GenerateDefaultLayoutMethodParentLayout$NoLayout_ onVisibilityS...
method onVisibilityChanged (line 105) | @Override
method onVisibilityChanged (line 120) | public GenerateDefaultLayoutMethodParentLayout$NoLayout_ onVisibilityC...
method value (line 127) | public GenerateDefaultLayoutMethodParentLayout$NoLayout_ value(int val...
method value (line 133) | public int value() {
method id (line 137) | @Override
method id (line 143) | @Override
method id (line 149) | @Override
method id (line 155) | @Override
method id (line 161) | @Override
method id (line 168) | @Override
method layout (line 174) | @Override
method spanSizeOverride (line 180) | @Override
method show (line 187) | @Override
method show (line 193) | @Override
method hide (line 199) | @Override
method getDefaultLayout (line 205) | @Override
method reset (line 211) | @Override
method equals (line 222) | @Override
method hashCode (line 252) | @Override
method toString (line 263) | @Override
FILE: epoxy-processortest/src/test/resources/GenerateDefaultLayoutMethodParentLayout$WithLayout_.java
class GenerateDefaultLayoutMethodParentLayout$WithLayout_ (line 14) | public class GenerateDefaultLayoutMethodParentLayout$WithLayout_ extends...
method GenerateDefaultLayoutMethodParentLayout$WithLayout_ (line 23) | public GenerateDefaultLayoutMethodParentLayout$WithLayout_() {
method addTo (line 27) | @Override
method handlePreBind (line 33) | @Override
method handlePostBind (line 38) | @Override
method onBind (line 54) | public GenerateDefaultLayoutMethodParentLayout$WithLayout_ onBind(
method unbind (line 61) | @Override
method onUnbind (line 77) | public GenerateDefaultLayoutMethodParentLayout$WithLayout_ onUnbind(
method onVisibilityStateChanged (line 84) | @Override
method onVisibilityStateChanged (line 98) | public GenerateDefaultLayoutMethodParentLayout$WithLayout_ onVis
Condensed preview — 936 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,393K chars).
[
{
"path": ".github/workflows/build_test.yml",
"chars": 1019,
"preview": "name: Build/Test\n\non:\n # Trigger on every pull request\n pull_request:\n\npermissions:\n contents: read\n\njobs:\n build-te"
},
{
"path": ".gitignore",
"chars": 327,
"preview": "# macOS\n.DS_Store\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.war\n*.ear\n\n# virtual machine crash logs"
},
{
"path": ".idea/codeStyleSettings.xml",
"chars": 13046,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"ProjectCodeStyleSettingsManager\">\n <o"
},
{
"path": "CHANGELOG.md",
"chars": 36718,
"preview": "# 5.2.1\n\nFix some issues in KSP2 when multiple processing rounds occur (https://github.com/airbnb/epoxy/pull/1396)\n\n# 5."
},
{
"path": "CONTRIBUTING.MD",
"chars": 953,
"preview": "# Epoxy is an Open Source Project\n\nPull requests are welcome! We'd love help improving this library.\n\nWe have a code sty"
},
{
"path": "LICENSE",
"chars": 11342,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 13276,
"preview": "[](https://travis-ci.com/github/airbnb/epoxy)\n[![Ma"
},
{
"path": "RELEASING.md",
"chars": 1593,
"preview": "Releasing\n========\n\n1. Bump the VERSION_NAME property in `gradle.properties` based on Major.Minor.Patch naming scheme\n2."
},
{
"path": "UpdateProcessorTestResources.kt",
"chars": 2846,
"preview": "#!/usr/bin/env kscript\n@file:DependsOn(\"org.jsoup:jsoup:1.13.1\")\n\nimport org.jsoup.Jsoup\nimport org.jsoup.nodes.Document"
},
{
"path": "blessedDeps.gradle",
"chars": 7784,
"preview": "/**\n * \"Blessed\" dependencies give us the ability to force a dependency(s) version to be consistent\n * for packaging a "
},
{
"path": "build.gradle",
"chars": 2780,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n\n ext"
},
{
"path": "epoxy-adapter/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "epoxy-adapter/build.gradle",
"chars": 1534,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-kapt'\napply plugin: 'kotlin-par"
},
{
"path": "epoxy-adapter/gradle.properties",
"chars": 54,
"preview": "POM_NAME=Epoxy\nPOM_ARTIFACT_ID=epoxy\nPOM_PACKAGING=jar"
},
{
"path": "epoxy-adapter/lint.xml",
"chars": 367,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<lint>\n <issue id=\"InvalidPackage\" severity=\"warning\" />\n <!-- https://code.goo"
},
{
"path": "epoxy-adapter/proguard-rules.pro",
"chars": 436,
"preview": "# The generated ControllerHelper classes are needed when using AutoModel annotations.\n# Each ControllerHelper is looked "
},
{
"path": "epoxy-adapter/src/main/AndroidManifest.xml",
"chars": 44,
"preview": "<manifest>\n\n <application />\n\n</manifest>"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ActivityRecyclerPool.kt",
"chars": 3400,
"preview": "package com.airbnb.epoxy\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.ContextWrapp"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/AsyncEpoxyController.java",
"chars": 1300,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Handler;\n\nimport static com.airbnb.epoxy.EpoxyAsyncUtil.MAIN_THREAD_HANDLER"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/AsyncEpoxyDiffer.java",
"chars": 9487,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Handler;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java."
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/BaseEpoxyAdapter.java",
"chars": 11257,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Bundle;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport co"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/BaseEpoxyTouchCallback.java",
"chars": 1123,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\n\ninterface BaseEpoxyTouchCallback<T extends EpoxyModel> {\n\n /**\n "
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/BoundViewHolders.java",
"chars": 1502,
"preview": "\npackage com.airbnb.epoxy;\n\nimport java.util.Iterator;\nimport java.util.NoSuchElementException;\n\nimport androidx.annotat"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/Carousel.java",
"chars": 18202,
"preview": "package com.airbnb.epoxy;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.util.Display"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ControllerHelper.java",
"chars": 874,
"preview": "package com.airbnb.epoxy;\n\nimport java.util.List;\n\n/**\n * A helper class for {@link EpoxyController} to handle {@link\n *"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ControllerHelperLookup.java",
"chars": 2530,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.InvocationTargetException;\nimp"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ControllerModelList.java",
"chars": 1196,
"preview": "package com.airbnb.epoxy;\n\n/**\n * This ArrayList subclass enforces that no changes are made to the list after {@link #fr"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/DebugTimer.java",
"chars": 834,
"preview": "package com.airbnb.epoxy;\n\nimport android.util.Log;\n\nclass DebugTimer implements Timer {\n\n private final String tag;\n "
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/DiffHelper.java",
"chars": 16631,
"preview": "\npackage com.airbnb.epoxy;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/DiffPayload.java",
"chars": 2783,
"preview": "package com.airbnb.epoxy;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport androidx.annotation.Nullable;\nim"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/DiffResult.java",
"chars": 2939,
"preview": "package com.airbnb.epoxy;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport androidx.annotation.NonNull;\nimp"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyAdapter.java",
"chars": 12039,
"preview": "\npackage com.airbnb.epoxy;\n\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport j"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyAsyncUtil.java",
"chars": 2952,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Build;\nimport android.os.Handler;\nimport android.os.Handler.Callback;\nimpor"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyController.java",
"chars": 38125,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\n\nimport com.ai"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyControllerAdapter.java",
"chars": 8807,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Handler;\nimport android.view.View;\n\nimport com.airbnb.epoxy.AsyncEpoxyDiffe"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyDiffLogger.java",
"chars": 1806,
"preview": "package com.airbnb.epoxy;\n\nimport android.util.Log;\n\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.w"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyDragCallback.java",
"chars": 2453,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\n\n/**\n * For use with {@link EpoxyModelTouchCallback}\n */\npublic int"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyHolder.java",
"chars": 825,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\nimport android.view.ViewParent;\n\nimport androidx.annotation.NonNull"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyItemSpacingDecorator.java",
"chars": 5726,
"preview": "package com.airbnb.epoxy;\n\nimport android.graphics.Rect;\nimport android.view.View;\n\nimport androidx.annotation.Px;\nimpor"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModel.java",
"chars": 24810,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelGroup.java",
"chars": 10621,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\nimport android.view.ViewParent;\nimport android.view.ViewStub;\n\nimpo"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelTouchCallback.java",
"chars": 8368,
"preview": "package com.airbnb.epoxy;\n\nimport android.graphics.Canvas;\nimport android.view.View;\n\nimport com.airbnb.viewmodeladapter"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelWithHolder.java",
"chars": 2105,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.ViewParent;\n\nimport com.airbnb.epoxy.VisibilityState.Visibility;\n\nimport "
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelWithView.java",
"chars": 2252,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.LayoutRe"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyRecyclerView.kt",
"chars": 24904,
"preview": "package com.airbnb.epoxy\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.ContextWrapp"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxySwipeCallback.java",
"chars": 3308,
"preview": "package com.airbnb.epoxy;\n\nimport android.graphics.Canvas;\nimport android.view.View;\n\nimport androidx.recyclerview.widge"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyTouchHelper.java",
"chars": 17089,
"preview": "package com.airbnb.epoxy;\n\nimport android.graphics.Canvas;\nimport android.view.View;\n\nimport java.util.ArrayList;\nimport"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyTouchHelperCallback.kt",
"chars": 6365,
"preview": "package com.airbnb.epoxy\n\nimport android.graphics.Canvas\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport andr"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyViewHolder.java",
"chars": 4294,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\nimport android.view.ViewParent;\n\nimport com.airbnb.epoxy.ViewHolder"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyVisibilityItem.kt",
"chars": 7411,
"preview": "package com.airbnb.epoxy\n\nimport android.graphics.Rect\nimport android.view.View\nimport android.view.ViewGroup\nimport and"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyVisibilityTracker.kt",
"chars": 21619,
"preview": "package com.airbnb.epoxy\n\nimport android.util.Log\nimport android.util.SparseArray\nimport android.view.View\nimport androi"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/GeneratedModel.java",
"chars": 1068,
"preview": "package com.airbnb.epoxy;\n\n/** Interface applied to generated models to allow the base adapter to interact with them. */"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/GroupModel.kt",
"chars": 651,
"preview": "package com.airbnb.epoxy\n\nimport androidx.annotation.LayoutRes\n\n/**\n * An [EpoxyModelGroup] usable in a DSL manner via t"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/HandlerExecutor.java",
"chars": 774,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Handler;\nimport android.os.Looper;\n\nimport java.util.concurrent.Executor;\n\n"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/HiddenEpoxyModel.java",
"chars": 564,
"preview": "\npackage com.airbnb.epoxy;\n\nimport android.widget.Space;\n\nimport com.airbnb.viewmodeladapter.R;\n\n/**\n * Used by the {@li"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/IdUtils.java",
"chars": 1439,
"preview": "package com.airbnb.epoxy;\n\nimport androidx.annotation.Nullable;\n\n/**\n * Utilities for generating 64-bit long IDs from ty"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/IllegalEpoxyUsage.java",
"chars": 156,
"preview": "package com.airbnb.epoxy;\n\npublic class IllegalEpoxyUsage extends RuntimeException {\n public IllegalEpoxyUsage(String m"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ImmutableModelException.java",
"chars": 1650,
"preview": "package com.airbnb.epoxy;\n\nimport androidx.annotation.NonNull;\n\n/**\n * Thrown if a model is changed after it is added to"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/InternalExposer.kt",
"chars": 459,
"preview": "package com.airbnb.epoxy\n\n/**\n * Exposes package private things as internal so files in other packages can use them.\n */"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ListenersUtils.java",
"chars": 1079,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\nimport android.view.ViewParent;\n\nimport androidx.annotation.Nullabl"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/MainThreadExecutor.java",
"chars": 491,
"preview": "package com.airbnb.epoxy;\n\nimport static com.airbnb.epoxy.EpoxyAsyncUtil.AYSNC_MAIN_THREAD_HANDLER;\nimport static com.ai"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ModelCollector.kt",
"chars": 289,
"preview": "package com.airbnb.epoxy\n\n/**\n * Interface used to collect models. Used by [EpoxyController]. It is also convenient to b"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ModelGroupHolder.kt",
"chars": 8928,
"preview": "package com.airbnb.epoxy\n\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewParent\nimport a"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ModelList.java",
"chars": 13979,
"preview": "package com.airbnb.epoxy;\n\nimport java.util.AbstractList;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimpor"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ModelState.java",
"chars": 2157,
"preview": "package com.airbnb.epoxy;\n\n/** Helper to store relevant information about a model that we need to determine if it change"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/NoOpControllerHelper.java",
"chars": 285,
"preview": "package com.airbnb.epoxy;\n\n/**\n * A {@link ControllerHelper} implementation for adapters with no {@link\n * com.airbnb.ep"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/NoOpTimer.java",
"chars": 164,
"preview": "package com.airbnb.epoxy;\n\nclass NoOpTimer implements Timer {\n @Override\n public void start(String sectionName) {\n\n }"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/NotifyBlocker.java",
"chars": 1332,
"preview": "package com.airbnb.epoxy;\n\nimport androidx.recyclerview.widget.RecyclerView.AdapterDataObserver;\n\n/**\n * We don't allow "
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelBoundListener.java",
"chars": 511,
"preview": "package com.airbnb.epoxy;\n\n/** Used to register an onBind callback with a generated model. */\npublic interface OnModelBo"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelBuildFinishedListener.java",
"chars": 483,
"preview": "package com.airbnb.epoxy;\n\nimport androidx.annotation.NonNull;\n\n/**\n * Used with {@link EpoxyController#addModelBuildLis"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelCheckedChangeListener.java",
"chars": 741,
"preview": "package com.airbnb.epoxy;\n\nimport android.widget.CompoundButton;\n\npublic interface OnModelCheckedChangeListener<T extend"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelClickListener.java",
"chars": 685,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\n\n/** Used to register a click listener on a generated model. */\npub"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelLongClickListener.java",
"chars": 633,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\n\npublic interface OnModelLongClickListener<T extends EpoxyModel<?>,"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelUnboundListener.java",
"chars": 343,
"preview": "package com.airbnb.epoxy;\n\n/** Used to register an onUnbind callback with a generated model. */\npublic interface OnModel"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelVisibilityChangedListener.java",
"chars": 1270,
"preview": "package com.airbnb.epoxy;\n\nimport androidx.annotation.FloatRange;\nimport androidx.annotation.Px;\n\n/** Used to register a"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelVisibilityStateChangedListener.java",
"chars": 608,
"preview": "package com.airbnb.epoxy;\n\nimport com.airbnb.epoxy.VisibilityState.Visibility;\n\n/** Used to register an onVisibilityChan"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/QuantityStringResAttribute.java",
"chars": 1748,
"preview": "package com.airbnb.epoxy;\n\nimport android.content.Context;\n\nimport java.util.Arrays;\n\nimport androidx.annotation.Nullabl"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/SimpleEpoxyAdapter.java",
"chars": 3065,
"preview": "package com.airbnb.epoxy;\n\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * A non-abstract version of {@link "
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/SimpleEpoxyController.java",
"chars": 1099,
"preview": "package com.airbnb.epoxy;\n\nimport java.util.List;\n\n/**\n * A small wrapper around {@link com.airbnb.epoxy.EpoxyController"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/SimpleEpoxyModel.java",
"chars": 2263,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\n\nimport androidx.annotation.CallSuper;\nimport androidx.annotation.L"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/StringAttributeData.java",
"chars": 3608,
"preview": "package com.airbnb.epoxy;\n\nimport android.content.Context;\n\nimport java.util.Arrays;\n\nimport androidx.annotation.Nullabl"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/StyleBuilderCallback.java",
"chars": 263,
"preview": "package com.airbnb.epoxy;\n\n/**\n * Used for specifying dynamic styling for a view when creating a model. This is only use"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/Timer.java",
"chars": 96,
"preview": "package com.airbnb.epoxy;\n\ninterface Timer {\n void start(String sectionName);\n void stop();\n}\n"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/Typed2EpoxyController.java",
"chars": 2520,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Handler;\n\n/**\n * This is a wrapper around {@link com.airbnb.epoxy.EpoxyCont"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/Typed3EpoxyController.java",
"chars": 2601,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Handler;\n\n/**\n * This is a wrapper around {@link com.airbnb.epoxy.EpoxyCont"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/Typed4EpoxyController.java",
"chars": 2680,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Handler;\n\n/**\n * This is a wrapper around {@link com.airbnb.epoxy.EpoxyCont"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/TypedEpoxyController.java",
"chars": 2440,
"preview": "package com.airbnb.epoxy;\n\nimport android.os.Handler;\nimport androidx.annotation.Nullable;\n\n/**\n * This is a wrapper aro"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/UnboundedViewPool.kt",
"chars": 1655,
"preview": "package com.airbnb.epoxy\n\nimport android.util.SparseArray\nimport androidx.recyclerview.widget.RecyclerView.RecycledViewP"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/UpdateOp.java",
"chars": 2117,
"preview": "\npackage com.airbnb.epoxy;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport j"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/UpdateOpHelper.java",
"chars": 4787,
"preview": "package com.airbnb.epoxy;\n\nimport com.airbnb.epoxy.UpdateOp.Type;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\ni"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ViewHolderState.java",
"chars": 6376,
"preview": "\npackage com.airbnb.epoxy;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport android.util.SparseArray;\nimp"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/ViewTypeManager.java",
"chars": 3468,
"preview": "package com.airbnb.epoxy;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport androidx.annotation.Nullable;\nimport "
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/VisibilityState.java",
"chars": 2707,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport a"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/WrappedEpoxyModelCheckedChangeListener.java",
"chars": 2183,
"preview": "package com.airbnb.epoxy;\n\nimport android.widget.CompoundButton;\nimport android.widget.CompoundButton.OnCheckedChangeLis"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/WrappedEpoxyModelClickListener.kt",
"chars": 5495,
"preview": "package com.airbnb.epoxy\n\nimport android.view.View\nimport android.view.View.OnClickListener\nimport android.view.View.OnL"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/preload/EpoxyModelPreloader.kt",
"chars": 5945,
"preview": "package com.airbnb.epoxy.preload\n\nimport android.view.View\nimport com.airbnb.epoxy.EpoxyModel\n\n/**\n * Describes how view"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/preload/EpoxyPreloader.kt",
"chars": 10878,
"preview": "package com.airbnb.epoxy.preload\n\nimport android.content.Context\nimport android.view.View\nimport android.widget.ImageVie"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/preload/PreloadTargetProvider.kt",
"chars": 1098,
"preview": "package com.airbnb.epoxy.preload\n\nimport java.util.ArrayDeque\n\ninternal class PreloadTargetProvider<P : PreloadRequestHo"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/preload/Preloadable.kt",
"chars": 420,
"preview": "package com.airbnb.epoxy.preload\n\nimport android.view.View\n\n/**\n * Declares Views that should be preloaded. This can eit"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/preload/PreloadableViewDataProvider.kt",
"chars": 6641,
"preview": "package com.airbnb.epoxy.preload\n\nimport android.view.View\nimport androidx.core.view.ViewCompat\nimport com.airbnb.epoxy."
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/preload/PreloaderExtensions.kt",
"chars": 1388,
"preview": "package com.airbnb.epoxy.preload\n\nimport androidx.recyclerview.widget.RecyclerView\nimport com.airbnb.epoxy.EpoxyControll"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/stickyheader/StickyHeaderCallbacks.kt",
"chars": 1114,
"preview": "package com.airbnb.epoxy.stickyheader\n\nimport android.view.View\nimport androidx.recyclerview.widget.RecyclerView\n\n/**\n *"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/stickyheader/StickyHeaderLinearLayoutManager.kt",
"chars": 26065,
"preview": "package com.airbnb.epoxy.stickyheader\n\nimport android.content.Context\nimport android.graphics.PointF\nimport android.os.B"
},
{
"path": "epoxy-adapter/src/main/java/com/airbnb/epoxy/utils/utils.kt",
"chars": 240,
"preview": "package com.airbnb.epoxy.utils\n\nimport android.content.Context\nimport android.content.pm.ApplicationInfo\n\n@PublishedApi\n"
},
{
"path": "epoxy-adapter/src/main/res/layout/view_holder_empty_view.xml",
"chars": 171,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Space xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:lay"
},
{
"path": "epoxy-adapter/src/main/res/values/attrs.xml",
"chars": 192,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <declare-styleable name=\"EpoxyRecyclerView\">\n <attr name=\""
},
{
"path": "epoxy-adapter/src/main/res/values/ids.xml",
"chars": 430,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <item name=\"view_model_state_saving_id\" type=\"id\" />\n <item na"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/DiffPayloadTest.java",
"chars": 8364,
"preview": "package com.airbnb.epoxy;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.m"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/DifferCorrectnessTest.java",
"chars": 12829,
"preview": "package com.airbnb.epoxy;\n\nimport com.google.common.collect.Collections2;\n\nimport junit.framework.Assert;\n\nimport org.ju"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/DifferNotifyTest.java",
"chars": 4676,
"preview": "package com.airbnb.epoxy;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.RobolectricTes"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyAdapterTest.java",
"chars": 11869,
"preview": "package com.airbnb.epoxy;\n\nimport junit.framework.Assert;\n\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.ju"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyControllerTest.java",
"chars": 12740,
"preview": "package com.airbnb.epoxy;\n\nimport com.airbnb.epoxy.EpoxyController.Interceptor;\n\nimport org.junit.Test;\nimport org.junit"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyModelGroupTest.kt",
"chars": 7480,
"preview": "package com.airbnb.epoxy\n\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewStub\nimport and"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyRecyclerViewTest.kt",
"chars": 2837,
"preview": "package com.airbnb.epoxy\n\nimport android.view.View\nimport androidx.test.core.app.ApplicationProvider\nimport org.junit.As"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyViewHolderTest.kt",
"chars": 1282,
"preview": "package com.airbnb.epoxy\n\nimport android.view.View\nimport android.view.ViewParent\nimport org.junit.Before\nimport org.jun"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyVisibilityTrackerNestedTest.kt",
"chars": 10894,
"preview": "package com.airbnb.epoxy\n\nimport android.app.Activity\nimport android.util.Log\nimport androidx.recyclerview.widget.Linear"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyVisibilityTrackerTest.kt",
"chars": 38520,
"preview": "package com.airbnb.epoxy\n\nimport android.app.Activity\nimport android.util.Log\nimport android.view.View\nimport android.vi"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/InsertedModel.java",
"chars": 195,
"preview": "package com.airbnb.epoxy;\n\nclass InsertedModel extends TestModel {\n static final InsertedModel INSTANCE = new InsertedM"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/ModelListTest.java",
"chars": 4803,
"preview": "package com.airbnb.epoxy;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.r"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/ModelTestUtils.java",
"chars": 1766,
"preview": "package com.airbnb.epoxy;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nclass ModelTestUtils {\n private static f"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/TestAdapter.java",
"chars": 114,
"preview": "package com.airbnb.epoxy;\n\nclass TestAdapter extends EpoxyAdapter {\n\n TestAdapter() {\n enableDiffing();\n }\n}\n"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/TestModel.java",
"chars": 1439,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\n\nimport java.util.Random;\n\npublic class TestModel extends EpoxyMode"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/TestObserver.java",
"chars": 2094,
"preview": "package com.airbnb.epoxy;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport androidx.recyclerview.widget.Recyc"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/TypedEpoxyControllerTest.java",
"chars": 997,
"preview": "package com.airbnb.epoxy;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.RobolectricTes"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/UnboundedViewPoolTests.kt",
"chars": 2238,
"preview": "package com.airbnb.epoxy\n\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimpor"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/UpdateOpHelperTest.java",
"chars": 5855,
"preview": "package com.airbnb.epoxy;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.RobolectricTes"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/ViewTypeManagerIntegrationTest.java",
"chars": 4269,
"preview": "package com.airbnb.epoxy;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.FrameLayout;\n\n"
},
{
"path": "epoxy-adapter/src/test/java/com/airbnb/epoxy/test/CarouselTest.java",
"chars": 896,
"preview": "package com.airbnb.epoxy.test;\n\nimport android.content.Context;\n\nimport com.airbnb.epoxy.Carousel;\nimport com.airbnb.epo"
},
{
"path": "epoxy-annotations/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "epoxy-annotations/build.gradle",
"chars": 415,
"preview": "apply plugin: 'java'\napply plugin: 'org.jetbrains.kotlin.jvm'\napply from: '../publishing.gradle'\n\nkotlin {\n jvmToolchai"
},
{
"path": "epoxy-annotations/gradle.properties",
"chars": 78,
"preview": "POM_NAME=Epoxy annotations\nPOM_ARTIFACT_ID=epoxy-annotations\nPOM_PACKAGING=jar"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/AfterPropsSet.java",
"chars": 811,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/AutoModel.java",
"chars": 649,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/CallbackProp.java",
"chars": 970,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/EpoxyAttribute.java",
"chars": 3735,
"preview": "\npackage com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java."
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/EpoxyBuildScope.kt",
"chars": 306,
"preview": "package com.airbnb.epoxy\n\n/**\n * Used to mark Epoxy model building DSLs so that when using generated kotlin extension fu"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/EpoxyDataBindingLayouts.java",
"chars": 1500,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/EpoxyDataBindingPattern.java",
"chars": 1684,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/EpoxyModelClass.java",
"chars": 1211,
"preview": "\npackage com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java."
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/ModelProp.java",
"chars": 4557,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/ModelView.java",
"chars": 2827,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/OnViewRecycled.java",
"chars": 502,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/OnVisibilityChanged.java",
"chars": 856,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/OnVisibilityStateChanged.java",
"chars": 895,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/PackageEpoxyConfig.java",
"chars": 2963,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/PackageModelViewConfig.java",
"chars": 3704,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-annotations/src/main/java/com/airbnb/epoxy/TextProp.java",
"chars": 696,
"preview": "package com.airbnb.epoxy;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.l"
},
{
"path": "epoxy-compose/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "epoxy-compose/build.gradle",
"chars": 1037,
"preview": "plugins {\n id 'com.android.library'\n id 'kotlin-android'\n id 'org.jetbrains.kotlin.plugin.compose'\n}\napply from: '../"
},
{
"path": "epoxy-compose/consumer-rules.pro",
"chars": 0,
"preview": ""
},
{
"path": "epoxy-compose/gradle.properties",
"chars": 79,
"preview": "POM_NAME=Epoxy Compose Interop \nPOM_ARTIFACT_ID=epoxy-compose\nPOM_PACKAGING=jar"
},
{
"path": "epoxy-compose/proguard-rules.pro",
"chars": 750,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "epoxy-compose/src/main/AndroidManifest.xml",
"chars": 51,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest />"
},
{
"path": "epoxy-compose/src/main/java/com/airbnb/epoxy/ComposeInterop.kt",
"chars": 5228,
"preview": "package com.airbnb.epoxy\n\nimport android.util.SparseArray\nimport android.view.View\nimport android.view.ViewGroup\nimport "
},
{
"path": "epoxy-composeinterop-maverickssample/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "epoxy-composeinterop-maverickssample/build.gradle",
"chars": 2223,
"preview": "plugins {\n id 'com.android.application'\n id 'kotlin-android'\n id 'kotlin-kapt'\n id 'org.jetbrains.kotlin.plugin.comp"
},
{
"path": "epoxy-composeinterop-maverickssample/proguard-rules.pro",
"chars": 750,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "epoxy-composeinterop-maverickssample/src/androidTest/java/com/airbnb/epoxy/composeinterop/maverickssample/MultiKeyComposeInteropFragmentTest.kt",
"chars": 5840,
"preview": "package com.airbnb.epoxy.composeinterop.maverickssample\n\nimport androidx.compose.ui.test.assertIsDisplayed\nimport androi"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/AndroidManifest.xml",
"chars": 818,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <appli"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/java/com/airbnb/epoxy/composeinterop/maverickssample/ComposeInteropListFragmnet.kt",
"chars": 3633,
"preview": "package com.airbnb.epoxy.composeinterop.maverickssample\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimp"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/java/com/airbnb/epoxy/composeinterop/maverickssample/MainActivity.kt",
"chars": 329,
"preview": "package com.airbnb.epoxy.composeinterop.maverickssample\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompa"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/java/com/airbnb/epoxy/composeinterop/maverickssample/MultiKeyComposeInteropFragment.kt",
"chars": 11331,
"preview": "package com.airbnb.epoxy.composeinterop.maverickssample\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimp"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/java/com/airbnb/epoxy/composeinterop/maverickssample/SampleApplication.kt",
"chars": 262,
"preview": "package com.airbnb.epoxy.composeinterop.maverickssample\n\nimport android.app.Application\nimport com.airbnb.mvrx.Mavericks"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/java/com/airbnb/epoxy/composeinterop/maverickssample/epoxyviews/HeaderView.kt",
"chars": 1906,
"preview": "package com.airbnb.epoxy.composeinterop.maverickssample.epoxyviews\n\nimport android.content.Context\nimport android.view.V"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/drawable/ic_launcher_background.xml",
"chars": 5606,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:wi"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/drawable-v24/ic_launcher_foreground.xml",
"chars": 1702,
"preview": "<vector xmlns:aapt=\"http://schemas.android.com/aapt\"\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/layout/activity_main.xml",
"chars": 360,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.fragment.app.FragmentContainerView android:id=\"@+id/frame_layout\"\n a"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/layout/fragment_multi_key_compose_interop.xml",
"chars": 304,
"preview": "<com.airbnb.epoxy.EpoxyRecyclerView android:id=\"@+id/epoxyRecyclerView\"\n xmlns:android=\"http://schemas.android.com/ap"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/layout/fragment_my.xml",
"chars": 304,
"preview": "<com.airbnb.epoxy.EpoxyRecyclerView android:id=\"@+id/epoxyRecyclerView\"\n xmlns:android=\"http://schemas.android.com/ap"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/layout/header_view.xml",
"chars": 1224,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/values/colors.xml",
"chars": 378,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"purple_200\">#FFBB86FC</color>\n <color name=\"purpl"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/values/strings.xml",
"chars": 79,
"preview": "<resources>\n <string name=\"app_name\">MavericksExample</string>\n</resources>\n"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/values/themes.xml",
"chars": 827,
"preview": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Base application theme. -->\n <style name=\"Theme.E"
},
{
"path": "epoxy-composeinterop-maverickssample/src/main/res/values-night/themes.xml",
"chars": 827,
"preview": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Base application theme. -->\n <style name=\"Theme.E"
},
{
"path": "epoxy-composesample/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "epoxy-composesample/build.gradle",
"chars": 1525,
"preview": "plugins {\n id 'com.android.application'\n id 'kotlin-android'\n id 'kotlin-kapt'\n id 'org.jetbrains.kotlin.plugin.comp"
},
{
"path": "epoxy-composesample/proguard-rules.pro",
"chars": 750,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "epoxy-composesample/src/main/AndroidManifest.xml",
"chars": 1051,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <appli"
},
{
"path": "epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/ComposableInteropActivity.kt",
"chars": 2451,
"preview": "package com.airbnb.epoxy.compose.sample\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport andr"
},
{
"path": "epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/EpoxyInteropActivity.kt",
"chars": 2048,
"preview": "package com.airbnb.epoxy.compose.sample\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport andr"
},
{
"path": "epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/MainActivity.kt",
"chars": 667,
"preview": "package com.airbnb.epoxy.compose.sample\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.View"
},
{
"path": "epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/epoxyviews/HeaderView.kt",
"chars": 2310,
"preview": "package com.airbnb.epoxy.compose.sample.epoxyviews\n\nimport android.content.Context\nimport android.view.View\nimport andro"
},
{
"path": "epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/ui/theme/Color.kt",
"chars": 227,
"preview": "package com.airbnb.epoxy.compose.sample.ui.theme\n\nimport androidx.compose.ui.graphics.Color\n\nval Purple200 = Color(0xFFB"
},
{
"path": "epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/ui/theme/Shape.kt",
"chars": 323,
"preview": "package com.airbnb.epoxy.compose.sample.ui.theme\n\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport and"
},
{
"path": "epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/ui/theme/Theme.kt",
"chars": 1116,
"preview": "package com.airbnb.epoxy.compose.sample.ui.theme\n\nimport androidx.compose.foundation.isSystemInDarkTheme\nimport androidx"
},
{
"path": "epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/ui/theme/Type.kt",
"chars": 809,
"preview": "package com.airbnb.epoxy.compose.sample.ui.theme\n\nimport androidx.compose.material.Typography\nimport androidx.compose.ui"
},
{
"path": "epoxy-composesample/src/main/res/drawable/ic_launcher_background.xml",
"chars": 5606,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:wi"
},
{
"path": "epoxy-composesample/src/main/res/drawable-v24/ic_launcher_foreground.xml",
"chars": 1702,
"preview": "<vector xmlns:aapt=\"http://schemas.android.com/aapt\"\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "epoxy-composesample/src/main/res/layout/activity_composable_interop.xml",
"chars": 259,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.airbnb.epoxy.EpoxyRecyclerView android:id=\"@+id/epoxy_recycler_view\"\n xml"
},
{
"path": "epoxy-composesample/src/main/res/layout/activity_epoxy_interop.xml",
"chars": 258,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.compose.ui.platform.ComposeView android:id=\"@+id/compose_view\"\n xmln"
},
{
"path": "epoxy-composesample/src/main/res/layout/activity_main.xml",
"chars": 1188,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "epoxy-composesample/src/main/res/layout/header_view.xml",
"chars": 1213,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "epoxy-composesample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "epoxy-composesample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "epoxy-composesample/src/main/res/values/colors.xml",
"chars": 378,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"purple_200\">#FFBB86FC</color>\n <color name=\"purpl"
},
{
"path": "epoxy-composesample/src/main/res/values/strings.xml",
"chars": 82,
"preview": "<resources>\n <string name=\"app_name\">Epoxy Compose Sample</string>\n</resources>"
},
{
"path": "epoxy-composesample/src/main/res/values/themes.xml",
"chars": 1161,
"preview": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Base application theme. -->\n <style name=\"Theme.E"
},
{
"path": "epoxy-composesample/src/main/res/values-night/themes.xml",
"chars": 827,
"preview": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Base application theme. -->\n <style name=\"Theme.E"
}
]
// ... and 736 more files (download for full content)
About this extraction
This page contains the full source code of the airbnb/epoxy GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 936 files (86.9 MB), approximately 1.3M tokens, and a symbol index with 9605 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.