├── .github └── workflows │ └── build_test.yml ├── .gitignore ├── .idea ├── codeStyleSettings.xml └── codeStyles │ ├── Project.xml │ └── codeStyleConfig.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-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ ├── header.png │ └── ic_launcher_background.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 │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── values-night │ └── themes.xml │ └── values │ ├── colors.xml │ ├── strings.xml │ └── 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-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ ├── header.png │ └── ic_launcher_background.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 │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── values-night │ └── themes.xml │ └── values │ ├── colors.xml │ ├── strings.xml │ └── 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 │ │ ├── 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 ├── epoxy_sample_app.gif ├── proguard-rules.pro ├── sample_touch.gif └── 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-w820dp │ └── dimens.xml │ └── values │ ├── dimens.xml │ └── strings.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.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.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-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.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 │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── 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 /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS 2 | .DS_Store 3 | 4 | # Mobile Tools for Java (J2ME) 5 | .mtj.tmp/ 6 | 7 | # Package Files # 8 | *.war 9 | *.ear 10 | 11 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 12 | hs_err_pid* 13 | 14 | # IntelliJ 15 | *.iml 16 | .idea/ 17 | !.idea/codeStyles/ 18 | !.idea/codeStyleSettings.xml 19 | 20 | # Android 21 | .gradle 22 | build/ 23 | local.properties 24 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /epoxy-adapter/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /epoxy-adapter/gradle.properties: -------------------------------------------------------------------------------- 1 | POM_NAME=Epoxy 2 | POM_ARTIFACT_ID=epoxy 3 | POM_PACKAGING=jar -------------------------------------------------------------------------------- /epoxy-adapter/lint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /epoxy-adapter/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # The generated ControllerHelper classes are needed when using AutoModel annotations. 2 | # Each ControllerHelper is looked up reflectively, so we need to make sure it is 3 | # kept and its name not obfuscated so the reflective lookup works. 4 | -keep class * extends com.airbnb.epoxy.EpoxyController { *; } 5 | -keep class * extends com.airbnb.epoxy.ControllerHelper { *; } 6 | -keepclasseswithmembernames class * { @com.airbnb.epoxy.AutoModel ; } -------------------------------------------------------------------------------- /epoxy-adapter/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/GroupModel.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy 2 | 3 | import androidx.annotation.LayoutRes 4 | 5 | /** 6 | * An [EpoxyModelGroup] usable in a DSL manner via the [group] extension. 7 | *

8 | * Example: 9 | * ``` 10 | * group { 11 | * id("photos") 12 | * layout(R.layout.photo_grid) 13 | * 14 | * // add your models here, example: 15 | * for (photo in photos) { 16 | * imageView { 17 | * id(photo.id) 18 | * url(photo.url) 19 | * } 20 | * } 21 | * } 22 | * ``` 23 | */ 24 | @EpoxyModelClass 25 | abstract class GroupModel : EpoxyModelGroup, ModelCollector { 26 | constructor() : super() 27 | constructor(@LayoutRes layoutRes: Int) : super(layoutRes) 28 | 29 | override fun add(model: EpoxyModel<*>) { 30 | super.addModel(model) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/HiddenEpoxyModel.java: -------------------------------------------------------------------------------- 1 | 2 | package com.airbnb.epoxy; 3 | 4 | import android.widget.Space; 5 | 6 | import com.airbnb.viewmodeladapter.R; 7 | 8 | /** 9 | * Used by the {@link EpoxyAdapter} as a placeholder for when {@link EpoxyModel#isShown()} is false. 10 | * Using a zero height and width {@link Space} view, as well as 0 span size, to exclude itself from 11 | * view. 12 | */ 13 | class HiddenEpoxyModel extends EpoxyModel { 14 | @Override 15 | public int getDefaultLayout() { 16 | return R.layout.view_holder_empty_view; 17 | } 18 | 19 | @Override 20 | public int getSpanSize(int spanCount, int position, int itemCount) { 21 | return 0; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/IllegalEpoxyUsage.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | public class IllegalEpoxyUsage extends RuntimeException { 4 | public IllegalEpoxyUsage(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/InternalExposer.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy 2 | 3 | /** 4 | * Exposes package private things as internal so files in other packages can use them. 5 | */ 6 | 7 | internal fun EpoxyViewHolder.objectToBindInternal() = objectToBind() 8 | 9 | internal fun EpoxyModel<*>.viewTypeInternal() = viewType 10 | internal fun BaseEpoxyAdapter.boundViewHoldersInternal() = boundViewHolders 11 | internal fun BaseEpoxyAdapter.getModelForPositionInternal(position: Int): EpoxyModel<*>? { 12 | return getModelForPosition(position) 13 | } 14 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/MainThreadExecutor.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | import static com.airbnb.epoxy.EpoxyAsyncUtil.AYSNC_MAIN_THREAD_HANDLER; 4 | import static com.airbnb.epoxy.EpoxyAsyncUtil.MAIN_THREAD_HANDLER; 5 | 6 | class MainThreadExecutor extends HandlerExecutor { 7 | static final MainThreadExecutor INSTANCE = new MainThreadExecutor(false); 8 | static final MainThreadExecutor ASYNC_INSTANCE = new MainThreadExecutor(true); 9 | 10 | MainThreadExecutor(boolean async) { 11 | super(async ? AYSNC_MAIN_THREAD_HANDLER : MAIN_THREAD_HANDLER); 12 | } 13 | } 14 | 15 | 16 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/ModelCollector.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy 2 | 3 | /** 4 | * Interface used to collect models. Used by [EpoxyController]. It is also convenient to build DSL 5 | * helpers for carousel: @link https://github.com/airbnb/epoxy/issues/847. 6 | */ 7 | @EpoxyBuildScope 8 | interface ModelCollector { 9 | 10 | fun add(model: EpoxyModel<*>) 11 | } 12 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/NoOpControllerHelper.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | /** 4 | * A {@link ControllerHelper} implementation for adapters with no {@link 5 | * com.airbnb.epoxy.AutoModel} usage. 6 | */ 7 | class NoOpControllerHelper extends ControllerHelper { 8 | 9 | @Override 10 | public void resetAutoModels() { 11 | // No - Op 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/NoOpTimer.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | class NoOpTimer implements Timer { 4 | @Override 5 | public void start(String sectionName) { 6 | 7 | } 8 | 9 | @Override 10 | public void stop() { 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelBoundListener.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | /** Used to register an onBind callback with a generated model. */ 4 | public interface OnModelBoundListener, V> { 5 | /** 6 | * This will be called immediately after a model was bound, with the model and view that were 7 | * bound together. 8 | * 9 | * @param model The model being bound 10 | * @param view The view that is being bound to the model 11 | * @param position The adapter position of the model 12 | */ 13 | void onModelBound(T model, V view, int position); 14 | } 15 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelBuildFinishedListener.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | /** 6 | * Used with {@link EpoxyController#addModelBuildListener(OnModelBuildFinishedListener)} to be 7 | * alerted to new model changes. 8 | */ 9 | public interface OnModelBuildFinishedListener { 10 | /** 11 | * Called after {@link EpoxyController#buildModels()} has run and changes have been notified to 12 | * the adapter. This will be called even if no changes existed. 13 | */ 14 | void onModelBuildFinished(@NonNull DiffResult result); 15 | } 16 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelClickListener.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | import android.view.View; 4 | 5 | /** Used to register a click listener on a generated model. */ 6 | public interface OnModelClickListener, V> { 7 | /** 8 | * Called when the view bound to the model is clicked. 9 | * 10 | * @param model The model that the view is bound to. 11 | * @param parentView The view bound to the model which received the click. 12 | * @param clickedView The view that received the click. This is either a child of the parentView 13 | * or the parentView itself 14 | * @param position The position of the model in the adapter. 15 | */ 16 | void onClick(T model, V parentView, View clickedView, int position); 17 | } 18 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelLongClickListener.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | import android.view.View; 4 | 5 | public interface OnModelLongClickListener, V> { 6 | /** 7 | * Called when the view bound to the model is clicked. 8 | * 9 | * @param model The model that the view is bound to. 10 | * @param parentView The view bound to the model which received the click. 11 | * @param clickedView The view that received the click. This is either a child of the parentView 12 | * or the parentView itself 13 | * @param position The position of the model in the adapter. 14 | */ 15 | boolean onLongClick(T model, V parentView, View clickedView, int position); 16 | } 17 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelUnboundListener.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | /** Used to register an onUnbind callback with a generated model. */ 4 | public interface OnModelUnboundListener, V> { 5 | /** 6 | * This will be called immediately after a model is unbound from a view, with the view and model 7 | * that were unbound. 8 | */ 9 | void onModelUnbound(T model, V view); 10 | } 11 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/OnModelVisibilityStateChangedListener.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | import com.airbnb.epoxy.VisibilityState.Visibility; 4 | 5 | /** Used to register an onVisibilityChanged callback with a generated model. */ 6 | public interface OnModelVisibilityStateChangedListener, V> { 7 | 8 | /** 9 | * This will be called once the visibility changed. 10 | *

11 | * @param model The model being bound 12 | * @param view The view that is being bound to the model 13 | * @param visibilityState The new visibility 14 | *

15 | * @see VisibilityState 16 | */ 17 | void onVisibilityStateChanged(T model, V view, @Visibility int visibilityState); 18 | } 19 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/StyleBuilderCallback.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | /** 4 | * Used for specifying dynamic styling for a view when creating a model. This is only used if the 5 | * view is set up to be styled with the Paris library. 6 | */ 7 | public interface StyleBuilderCallback { 8 | void buildStyle(T builder); 9 | } 10 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/Timer.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | interface Timer { 4 | void start(String sectionName); 5 | void stop(); 6 | } 7 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/preload/Preloadable.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.preload 2 | 3 | import android.view.View 4 | 5 | /** 6 | * Declares Views that should be preloaded. This can either be implemented by a custom view or by an [EpoxyHolder]. 7 | * 8 | * The preloadable views can be recursive ie if [Preloadable.viewsToPreload] includes any views that are themselves Preloadable those nested 9 | * views will instead by used. 10 | */ 11 | interface Preloadable { 12 | val viewsToPreload: List 13 | } 14 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/java/com/airbnb/epoxy/utils/utils.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.utils 2 | 3 | import android.content.Context 4 | import android.content.pm.ApplicationInfo 5 | 6 | @PublishedApi 7 | internal val Context.isDebuggable: Boolean 8 | get() = (applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0 9 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/res/layout/view_holder_empty_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /epoxy-adapter/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /epoxy-adapter/src/test/java/com/airbnb/epoxy/InsertedModel.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | class InsertedModel extends TestModel { 4 | static final InsertedModel INSTANCE = new InsertedModel(); 5 | 6 | @Override 7 | public int getDefaultLayout() { 8 | return 0; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /epoxy-adapter/src/test/java/com/airbnb/epoxy/TestAdapter.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | class TestAdapter extends EpoxyAdapter { 4 | 5 | TestAdapter() { 6 | enableDiffing(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /epoxy-annotations/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /epoxy-annotations/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | apply plugin: 'org.jetbrains.kotlin.jvm' 3 | apply from: '../publishing.gradle' 4 | 5 | sourceCompatibility = rootProject.JAVA_SOURCE_VERSION 6 | targetCompatibility = rootProject.JAVA_TARGET_VERSION 7 | 8 | compileKotlin { 9 | kotlinOptions { 10 | jvmTarget = "1.8" 11 | } 12 | } 13 | 14 | dependencies { 15 | implementation rootProject.deps.androidAnnotations 16 | // Allow us to use android support library annotations (@LayoutRes) in this project. 17 | // Since this isn't an android module normally we couldn't access them otherwise. 18 | compileOnly rootProject.deps.androidRuntime 19 | } 20 | -------------------------------------------------------------------------------- /epoxy-annotations/gradle.properties: -------------------------------------------------------------------------------- 1 | POM_NAME=Epoxy annotations 2 | POM_ARTIFACT_ID=epoxy-annotations 3 | POM_PACKAGING=jar -------------------------------------------------------------------------------- /epoxy-annotations/src/main/java/com/airbnb/epoxy/AutoModel.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * Used to annotate model fields in an EpoxyController. Model fields annotated with this should not 10 | * be assigned a value directly; a model will automatically be created for them. A stable ID will 11 | * also be generated and assigned to the model. This ID will be the same across all instances of the 12 | * adapter, so it can be used for saving state of a model. 13 | */ 14 | @Target(ElementType.FIELD) 15 | @Retention(RetentionPolicy.CLASS) 16 | public @interface AutoModel { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /epoxy-annotations/src/main/java/com/airbnb/epoxy/EpoxyBuildScope.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy 2 | 3 | /** 4 | * Used to mark Epoxy model building DSLs so that when using generated kotlin extension functions 5 | * for building models you cannot incorrectly nest models and also don't see cluttered, incorrect 6 | * code completion suggestions. 7 | */ 8 | @DslMarker 9 | annotation class EpoxyBuildScope 10 | -------------------------------------------------------------------------------- /epoxy-annotations/src/main/java/com/airbnb/epoxy/OnViewRecycled.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * This can be used to annotate methods inside classes with a {@link com.airbnb.epoxy.ModelView} 10 | * annotation. Methods with this annotation will be called when the view is recycled by the 11 | * RecyclerView. 12 | */ 13 | @Target(ElementType.METHOD) 14 | @Retention(RetentionPolicy.CLASS) 15 | public @interface OnViewRecycled { 16 | } 17 | -------------------------------------------------------------------------------- /epoxy-annotations/src/main/java/com/airbnb/epoxy/TextProp.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | import androidx.annotation.StringRes; 9 | 10 | /** 11 | * A convenient replacement for {@link ModelProp} when the prop represents text. 12 | *

13 | * This can only be used when the setter parameter is a {@link CharSequence} 14 | *

15 | * This is the same as using {@link ModelProp} with the option {@link 16 | * com.airbnb.epoxy.ModelProp.Option#GenerateStringOverloads} 17 | */ 18 | @Target({ElementType.METHOD, ElementType.FIELD}) 19 | @Retention(RetentionPolicy.CLASS) 20 | public @interface TextProp { 21 | 22 | @StringRes int defaultRes() default 0; 23 | } 24 | -------------------------------------------------------------------------------- /epoxy-compose/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /epoxy-compose/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-compose/consumer-rules.pro -------------------------------------------------------------------------------- /epoxy-compose/gradle.properties: -------------------------------------------------------------------------------- 1 | POM_NAME=Epoxy Compose Interop 2 | POM_ARTIFACT_ID=epoxy-compose 3 | POM_PACKAGING=jar -------------------------------------------------------------------------------- /epoxy-compose/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /epoxy-compose/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/java/com/airbnb/epoxy/composeinterop/maverickssample/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.composeinterop.maverickssample 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | 6 | class MainActivity : AppCompatActivity() { 7 | override fun onCreate(savedInstanceState: Bundle?) { 8 | super.onCreate(savedInstanceState) 9 | setContentView(R.layout.activity_main) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/java/com/airbnb/epoxy/composeinterop/maverickssample/SampleApplication.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.composeinterop.maverickssample 2 | 3 | import android.app.Application 4 | import com.airbnb.mvrx.Mavericks 5 | 6 | class SampleApplication : Application() { 7 | override fun onCreate() { 8 | super.onCreate() 9 | Mavericks.initialize(this) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/drawable/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/drawable/header.png -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/layout/fragment_multi_key_compose_interop.xml: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/layout/fragment_my.xml: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composeinterop-maverickssample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /epoxy-composeinterop-maverickssample/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MavericksExample 3 | 4 | -------------------------------------------------------------------------------- /epoxy-composesample/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /epoxy-composesample/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.compose.sample 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import android.view.View 6 | import androidx.appcompat.app.AppCompatActivity 7 | 8 | class MainActivity : AppCompatActivity() { 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | 12 | setContentView(R.layout.activity_main) 13 | 14 | findViewById(R.id.button).setOnClickListener { 15 | startActivity(Intent(this, ComposableInteropActivity::class.java)) 16 | } 17 | 18 | findViewById(R.id.button2).setOnClickListener { 19 | startActivity(Intent(this, EpoxyInteropActivity::class.java)) 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.compose.sample.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val Purple200 = Color(0xFFBB86FC) 6 | val Purple500 = Color(0xFF6200EE) 7 | val Purple700 = Color(0xFF3700B3) 8 | val Teal200 = Color(0xFF03DAC5) 9 | -------------------------------------------------------------------------------- /epoxy-composesample/src/main/java/com/airbnb/epoxy/compose/sample/ui/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.compose.sample.ui.theme 2 | 3 | import androidx.compose.foundation.shape.RoundedCornerShape 4 | import androidx.compose.material.Shapes 5 | import androidx.compose.ui.unit.dp 6 | 7 | val Shapes = Shapes( 8 | small = RoundedCornerShape(4.dp), 9 | medium = RoundedCornerShape(4.dp), 10 | large = RoundedCornerShape(0.dp) 11 | ) 12 | -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/drawable/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/drawable/header.png -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/layout/activity_composable_interop.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/layout/activity_epoxy_interop.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbnb/epoxy/c0813764351e4de97b7abd0694af5dad9db848f2/epoxy-composesample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /epoxy-composesample/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Epoxy Compose Sample 3 | -------------------------------------------------------------------------------- /epoxy-databinding/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /epoxy-databinding/gradle.properties: -------------------------------------------------------------------------------- 1 | POM_NAME=Epoxy Data Binding Support 2 | POM_ARTIFACT_ID=epoxy-databinding 3 | POM_PACKAGING=jar -------------------------------------------------------------------------------- /epoxy-databinding/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /epoxy-glide-preloader/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /epoxy-glide-preloader/gradle.properties: -------------------------------------------------------------------------------- 1 | POM_NAME=Epoxy Glide Preloading 2 | POM_ARTIFACT_ID=epoxy-glide-preloading 3 | POM_PACKAGING=jar 4 | -------------------------------------------------------------------------------- /epoxy-glide-preloader/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /epoxy-integrationtest/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /epoxy-integrationtest/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/eli_hart/tools/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/AdapterWithFieldAssigned.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import com.airbnb.epoxy.AutoModel; 4 | import com.airbnb.epoxy.EpoxyController; 5 | 6 | public class AdapterWithFieldAssigned extends EpoxyController { 7 | 8 | @AutoModel Model_ model1 = new Model_(); 9 | 10 | @Override 11 | protected void buildModels() { 12 | add(model1); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/AdapterWithIdChanged.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import com.airbnb.epoxy.AutoModel; 4 | import com.airbnb.epoxy.EpoxyController; 5 | 6 | public class AdapterWithIdChanged extends EpoxyController { 7 | 8 | @AutoModel Model_ model1 = new Model_(); 9 | 10 | @Override 11 | protected void buildModels() { 12 | add(model1.id(23)); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/BasicAutoModelsAdapter.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import com.airbnb.epoxy.AutoModel; 4 | import com.airbnb.epoxy.EpoxyController; 5 | 6 | public class BasicAutoModelsAdapter extends EpoxyController { 7 | 8 | @AutoModel Model_ model1; 9 | @AutoModel Model_ model2; 10 | 11 | @Override 12 | protected void buildModels() { 13 | add(model1.id(1)); 14 | add(model2.id(2)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ControllerWithAutoModel.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import com.airbnb.epoxy.AutoModel; 4 | import com.airbnb.epoxy.EpoxyController; 5 | 6 | public class ControllerWithAutoModel extends EpoxyController { 7 | 8 | @AutoModel Model_ model; 9 | 10 | @Override 11 | protected void buildModels() { 12 | add(model); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ControllerWithoutImplicityAdding.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import com.airbnb.epoxy.AutoModel; 4 | import com.airbnb.epoxy.EpoxyController; 5 | 6 | public class ControllerWithoutImplicityAdding extends EpoxyController { 7 | @AutoModel Model_ model1; 8 | 9 | @Override 10 | protected void buildModels() { 11 | model1.value(3); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/EpoxyDataBindingConfig.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import com.airbnb.epoxy.EpoxyDataBindingLayouts; 4 | import com.airbnb.epoxy.EpoxyDataBindingPattern; 5 | 6 | @EpoxyDataBindingPattern(rClass = R.class, layoutPrefix = "view_holder") 7 | @EpoxyDataBindingLayouts({R.layout.model_with_data_binding}) 8 | interface EpoxyDataBindingConfig {} 9 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/Model.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import android.widget.TextView; 4 | 5 | import com.airbnb.epoxy.EpoxyAttribute; 6 | import com.airbnb.epoxy.EpoxyModel; 7 | import com.airbnb.epoxy.EpoxyModelClass; 8 | 9 | import androidx.annotation.NonNull; 10 | 11 | @EpoxyModelClass 12 | public abstract class Model extends EpoxyModel { 13 | @EpoxyAttribute public int value; 14 | 15 | @Override 16 | protected int getDefaultLayout() { 17 | return R.layout.model_with_click_listener; 18 | } 19 | 20 | @Override 21 | public void bind(@NonNull TextView view) { 22 | view.setText(String.valueOf(value)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelChangesDuringBind.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import android.view.View; 4 | 5 | import com.airbnb.epoxy.EpoxyAttribute; 6 | import com.airbnb.epoxy.EpoxyModel; 7 | 8 | import androidx.annotation.NonNull; 9 | 10 | public class ModelChangesDuringBind extends EpoxyModel { 11 | @EpoxyAttribute public int value; 12 | 13 | @Override 14 | protected int getDefaultLayout() { 15 | return R.layout.model_with_click_listener; 16 | } 17 | 18 | @Override 19 | public void bind(@NonNull View view) { 20 | super.bind(view); 21 | value = 3; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelWithClickListener.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import android.view.View; 4 | 5 | import com.airbnb.epoxy.EpoxyAttribute; 6 | import com.airbnb.epoxy.EpoxyModel; 7 | 8 | import androidx.annotation.NonNull; 9 | 10 | public class ModelWithClickListener extends EpoxyModel { 11 | 12 | @EpoxyAttribute public View.OnClickListener clickListener; 13 | 14 | @Override 15 | protected int getDefaultLayout() { 16 | return R.layout.model_with_click_listener; 17 | } 18 | 19 | @Override 20 | public void bind(@NonNull View view) { 21 | view.setOnClickListener(clickListener); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelWithLongClickListener.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import android.view.View; 4 | 5 | import com.airbnb.epoxy.EpoxyAttribute; 6 | import com.airbnb.epoxy.EpoxyModel; 7 | 8 | import androidx.annotation.NonNull; 9 | 10 | public class ModelWithLongClickListener extends EpoxyModel { 11 | 12 | @EpoxyAttribute View.OnLongClickListener clickListener; 13 | 14 | @Override 15 | protected int getDefaultLayout() { 16 | return R.layout.model_with_click_listener; 17 | } 18 | 19 | @Override 20 | public void bind(@NonNull View view) { 21 | view.setOnLongClickListener(clickListener); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ModelWithNoGeneratedClass.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest; 2 | 3 | import android.view.View; 4 | 5 | import com.airbnb.epoxy.EpoxyAttribute; 6 | import com.airbnb.epoxy.EpoxyModel; 7 | 8 | // This class isn't used, but tests that a model is not generated for this and the processor and 9 | // generated code handles this and compiles correctly. A kotlin extension function should not be 10 | // generated 11 | public abstract class ModelWithNoGeneratedClass extends EpoxyModel { 12 | @EpoxyAttribute int value; 13 | } 14 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/TestActivity.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | 5 | /** 6 | * Empty activity used for view testing. 7 | */ 8 | class TestActivity : AppCompatActivity() 9 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/ViewWithDelegate.kt: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest 2 | 3 | import android.content.Context 4 | import android.view.View 5 | import com.airbnb.epoxy.ModelProp 6 | import com.airbnb.epoxy.ModelView 7 | 8 | @ModelView(autoLayout = ModelView.Size.WRAP_WIDTH_MATCH_HEIGHT) 9 | class ViewWithDelegate @JvmOverloads constructor( 10 | context: Context, 11 | implementation: InterfaceImplementation = InterfaceImplementation() 12 | ) : View(context), InterfaceWithModelProp by implementation 13 | 14 | interface InterfaceWithModelProp { 15 | 16 | @set:ModelProp 17 | var flag: Boolean 18 | } 19 | 20 | class InterfaceImplementation : InterfaceWithModelProp { 21 | 22 | override var flag: Boolean = false 23 | } 24 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/java/com/airbnb/epoxy/integrationtest/autoaddautomodels/PackageConfig.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.epoxy.integrationtest.autoaddautomodels; 2 | 3 | import com.airbnb.epoxy.PackageEpoxyConfig; 4 | 5 | @PackageEpoxyConfig(implicitlyAddAutoModels = true) 6 | public interface PackageConfig { 7 | } 8 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/res/layout/model_with_checked_change.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/res/layout/model_with_click_listener.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /epoxy-integrationtest/src/main/res/layout/model_with_data_binding.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 13 | 14 | 15 |