├── domic ├── android │ ├── src │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── lyft │ │ │ │ └── domic │ │ │ │ └── android │ │ │ │ ├── annotations │ │ │ │ └── MutatedByFramework.kt │ │ │ │ ├── AndroidButton.kt │ │ │ │ ├── rendering │ │ │ │ ├── RenderingAction.kt │ │ │ │ ├── RenderingBuffer.kt │ │ │ │ ├── RenderingBufferImpl.kt │ │ │ │ └── AndroidRenderer.kt │ │ │ │ ├── AndroidEditText.kt │ │ │ │ ├── AndroidCompoundButton.kt │ │ │ │ ├── AndroidTextView.kt │ │ │ │ └── AndroidView.kt │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── lyft │ │ │ └── domic │ │ │ └── android │ │ │ └── rendering │ │ │ ├── RenderingBufferImplTest.kt │ │ │ ├── TestChoreographer.kt │ │ │ ├── AbstractRenderingBufferTest.kt │ │ │ └── AndroidRendererTest.kt │ └── build.gradle ├── api │ ├── build.gradle │ └── src │ │ └── main │ │ └── kotlin │ │ └── com │ │ └── lyft │ │ └── domic │ │ └── api │ │ ├── Button.kt │ │ ├── extensions.kt │ │ ├── rendering │ │ ├── Change.kt │ │ └── Renderer.kt │ │ ├── EditText.kt │ │ ├── CompoundButton.kt │ │ ├── TextView.kt │ │ └── View.kt ├── util │ ├── build.gradle │ └── src │ │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── lyft │ │ │ └── domic │ │ │ └── util │ │ │ └── SharedDistinctUntilChangedTest.kt │ │ └── main │ │ └── java │ │ └── com │ │ └── lyft │ │ └── domic │ │ └── util │ │ └── SharedDistinctUntilChanged.kt └── test │ ├── build.gradle │ └── src │ ├── main │ └── java │ │ └── com │ │ └── lyft │ │ └── domic │ │ └── test │ │ ├── TestButton.kt │ │ ├── TestPublishRelay.kt │ │ ├── TestCompoundButton.kt │ │ ├── TestEditText.kt │ │ ├── TestTextView.kt │ │ └── TestView.kt │ └── test │ └── java │ └── com │ └── lyft │ └── domic │ └── test │ ├── TestPublishRelayTest.kt │ └── TestViewTest.kt ├── samples ├── shared │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── res │ │ │ ├── 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 │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── layout │ │ │ │ └── activity_main.xml │ │ │ └── java │ │ │ └── com │ │ │ └── lyft │ │ │ └── domic │ │ │ └── samples │ │ │ └── shared │ │ │ └── signin │ │ │ ├── SignInService.kt │ │ │ ├── RealSignInService.kt │ │ │ └── TestSignInService.kt │ └── build.gradle ├── performance │ ├── src │ │ └── main │ │ │ ├── res │ │ │ ├── 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 │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── layout │ │ │ │ ├── activity_main.xml │ │ │ │ └── activity_performance.xml │ │ │ ├── java │ │ │ └── com │ │ │ │ └── lyft │ │ │ │ └── domic │ │ │ │ └── samples │ │ │ │ └── performance │ │ │ │ ├── main │ │ │ │ ├── MainView.kt │ │ │ │ ├── MainViewModel.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ └── AndroidMainView.kt │ │ │ │ ├── domic │ │ │ │ ├── DomicView.kt │ │ │ │ ├── DomicActivity.kt │ │ │ │ ├── AndroidDomicView.kt │ │ │ │ └── DomicViewModel.kt │ │ │ │ ├── regular │ │ │ │ ├── RegularView.kt │ │ │ │ ├── RegularActivity.kt │ │ │ │ ├── AndroidRegularView.kt │ │ │ │ └── RegularPresenter.kt │ │ │ │ └── PerformanceApplication.kt │ │ │ └── AndroidManifest.xml │ ├── proguard-rules.pro │ └── build.gradle ├── mvp │ ├── proguard-rules.pro │ ├── src │ │ ├── main │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── lyft │ │ │ │ │ └── domic │ │ │ │ │ └── samples │ │ │ │ │ └── mvp │ │ │ │ │ ├── signin │ │ │ │ │ ├── SignInView.kt │ │ │ │ │ ├── AndroidSignInView.kt │ │ │ │ │ └── SignInPresenter.kt │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── lyft │ │ │ └── domic │ │ │ └── samples │ │ │ └── mvp │ │ │ └── signin │ │ │ └── SignInPresenterTest.kt │ └── build.gradle ├── mvvm │ ├── proguard-rules.pro │ ├── src │ │ ├── main │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── lyft │ │ │ │ │ └── domic │ │ │ │ │ └── samples │ │ │ │ │ └── mvvm │ │ │ │ │ ├── signin │ │ │ │ │ ├── SignInView.kt │ │ │ │ │ ├── AndroidSignInView.kt │ │ │ │ │ └── SignInViewModel.kt │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── lyft │ │ │ └── domic │ │ │ └── samples │ │ │ └── mvvm │ │ │ └── signin │ │ │ └── SignInViewModelTest.kt │ └── build.gradle └── redux │ └── rxredux │ ├── proguard-rules.pro │ ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── lyft │ │ │ │ └── domic │ │ │ │ └── samples │ │ │ │ └── redux │ │ │ │ └── rxredux │ │ │ │ ├── signin │ │ │ │ ├── SignInView.kt │ │ │ │ ├── AndroidSignInView.kt │ │ │ │ └── SignInStateMachine.kt │ │ │ │ └── MainActivity.kt │ │ └── AndroidManifest.xml │ └── test │ │ └── java │ │ └── com │ │ └── lyft │ │ └── samples │ │ └── redux │ │ └── rxredux │ │ └── signin │ │ └── SignInStateMachineTest.kt │ └── build.gradle ├── gradle ├── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── lint.gradle └── dependency-resolution.gradle ├── CODE_OF_CONDUCT.md ├── ci └── build.sh ├── settings.gradle ├── .gitignore ├── .travis.yml ├── gradle.properties ├── gradlew.bat ├── dependencies.gradle ├── gradlew ├── README.md └── LICENSE /domic/android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /samples/shared/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /samples/shared/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/shared/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/shared/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/shared/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/shared/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/shared/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/shared/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/shared/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/shared/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/shared/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/performance/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/performance/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/performance/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/performance/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/performance/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/performance/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/shared/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/shared/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/shared/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/shared/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/performance/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/performance/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/performance/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/performance/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /samples/shared/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/shared/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/shared/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/shared/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /domic/api/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java-library' 2 | apply plugin: 'kotlin' 3 | 4 | dependencies { 5 | api libraries.kotlinStdlib 6 | api libraries.rxJava 7 | } 8 | -------------------------------------------------------------------------------- /samples/mvp/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # For more details, see 3 | # http://developer.android.com/guide/developing/tools/proguard.html 4 | -------------------------------------------------------------------------------- /samples/performance/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/performance/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/performance/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/performance/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/shared/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/shared/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/mvvm/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # For more details, see 3 | # http://developer.android.com/guide/developing/tools/proguard.html 4 | -------------------------------------------------------------------------------- /samples/performance/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/performance/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/performance/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/performance/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | This project is governed by [Lyft's code of conduct](https://github.com/lyft/code-of-conduct). 2 | All contributors and participants agree to abide by its terms. 3 | -------------------------------------------------------------------------------- /samples/performance/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # For more details, see 3 | # http://developer.android.com/guide/developing/tools/proguard.html 4 | -------------------------------------------------------------------------------- /samples/performance/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyft/domic/HEAD/samples/performance/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /samples/redux/rxredux/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # For more details, see 3 | # http://developer.android.com/guide/developing/tools/proguard.html 4 | -------------------------------------------------------------------------------- /samples/performance/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Domic Performance 3 | Regular UI 4 | Domic 5 | 6 | -------------------------------------------------------------------------------- /ci/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -eu 3 | 4 | # You can run it from any directory. 5 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 6 | PROJECT_DIR="$DIR/.." 7 | 8 | pushd "$PROJECT_DIR" > /dev/null 9 | 10 | ./gradlew build --stacktrace 11 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /domic/util/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java-library' 2 | apply plugin: 'kotlin' 3 | 4 | dependencies { 5 | api libraries.kotlinStdlib 6 | api libraries.rxJava 7 | } 8 | 9 | dependencies { 10 | testImplementation testLibraries.junit 11 | } 12 | -------------------------------------------------------------------------------- /samples/shared/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /samples/shared/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Virtual DOM Sample 3 | Email 4 | Password 5 | Sign in 6 | 7 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':domic:api' 2 | include ':domic:android' 3 | include ':domic:test' 4 | include ':domic:util' 5 | 6 | include ':samples:mvvm' 7 | include ':samples:redux:rxredux' 8 | include ':samples:mvp' 9 | include ':samples:performance' 10 | include ':samples:shared' 11 | -------------------------------------------------------------------------------- /domic/android/src/test/java/com/lyft/domic/android/rendering/RenderingBufferImplTest.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.android.rendering 2 | 3 | class RenderingBufferImplTest : AbstractRenderingBufferTest() { 4 | override fun createRenderingBuffer(): RenderingBuffer = RenderingBufferImpl() 5 | } -------------------------------------------------------------------------------- /domic/api/src/main/kotlin/com/lyft/domic/api/Button.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.api 2 | 3 | interface Button : TextView { 4 | 5 | override val observe: Observe 6 | override val change: Change 7 | 8 | interface Observe : TextView.Observe 9 | 10 | interface Change : TextView.Change 11 | } 12 | -------------------------------------------------------------------------------- /domic/api/src/main/kotlin/com/lyft/domic/api/extensions.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.api 2 | 3 | import com.lyft.domic.api.rendering.Change 4 | import io.reactivex.Observable 5 | import io.reactivex.disposables.Disposable 6 | 7 | inline fun Observable.subscribe(crossinline bindFunc: (stream: Observable) -> Disposable): Disposable = 8 | bindFunc.invoke(this) 9 | 10 | -------------------------------------------------------------------------------- /domic/test/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java-library' 2 | apply plugin: 'kotlin' 3 | 4 | dependencies { 5 | api project(':domic:api') 6 | } 7 | 8 | dependencies { 9 | implementation project(':domic:util') 10 | implementation libraries.rxRelay 11 | } 12 | 13 | dependencies { 14 | testImplementation testLibraries.junit 15 | testImplementation testLibraries.assertJ 16 | } 17 | -------------------------------------------------------------------------------- /samples/mvvm/src/main/java/com/lyft/domic/samples/mvvm/signin/SignInView.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.samples.mvvm.signin 2 | 3 | import com.lyft.domic.api.Button 4 | import com.lyft.domic.api.EditText 5 | import com.lyft.domic.api.TextView 6 | 7 | interface SignInView { 8 | val emailEditText: EditText 9 | val passwordEditText: EditText 10 | val signInButton: Button 11 | val resultTextView: TextView 12 | } 13 | -------------------------------------------------------------------------------- /domic/api/src/main/kotlin/com/lyft/domic/api/rendering/Change.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.api.rendering 2 | 3 | /** 4 | * Change to be rendered. 5 | * 6 | * [Renderer] might use [equals] and [hashCode] to compare [Change]s and optimize rendering pipeline based on that. 7 | */ 8 | interface Change { 9 | 10 | /** 11 | * Called once by [Renderer] on appropriate thread (by default on Main Thread). 12 | */ 13 | fun perform() 14 | } 15 | -------------------------------------------------------------------------------- /samples/performance/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | *.apk 3 | *.ap_ 4 | .gradle/ 5 | build/ 6 | 7 | # files for the dex VM 8 | *.dex 9 | 10 | # Java class files 11 | *.class 12 | 13 | # generated files 14 | bin/ 15 | gen/ 16 | out/ 17 | target/ 18 | /captures 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Eclipse project files 24 | .classpath 25 | .project 26 | 27 | # Idea IDE files 28 | *.iml 29 | .idea/ 30 | 31 | *.DS_STORE 32 | -------------------------------------------------------------------------------- /samples/shared/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /domic/api/src/main/kotlin/com/lyft/domic/api/EditText.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.api 2 | 3 | import io.reactivex.Observable 4 | import io.reactivex.disposables.Disposable 5 | 6 | interface EditText :TextView { 7 | 8 | override val observe: Observe 9 | override val change: Change 10 | 11 | interface Observe : TextView.Observe 12 | 13 | interface Change : TextView.Change { 14 | 15 | fun selection(selectionValues: Observable): Disposable 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /samples/performance/src/main/java/com/lyft/domic/samples/performance/main/MainView.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.samples.performance.main 2 | 3 | import android.support.annotation.AnyThread 4 | import com.lyft.domic.api.Button 5 | import io.reactivex.Completable 6 | 7 | interface MainView { 8 | val regularUiButton: Button 9 | val domicButton: Button 10 | 11 | @AnyThread 12 | fun navigateToRegular(): Completable 13 | 14 | @AnyThread 15 | fun navigateToDomic(): Completable 16 | } 17 | -------------------------------------------------------------------------------- /domic/android/src/main/java/com/lyft/domic/android/annotations/MutatedByFramework.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.android.annotations 2 | 3 | import kotlin.annotation.AnnotationRetention.SOURCE 4 | import kotlin.annotation.AnnotationTarget.PROPERTY 5 | 6 | /** 7 | * Means that property needs to be observed in order to keep state in sync between Android Framework and Domic. 8 | * Also means that there is no point in making property lazy. 9 | */ 10 | @Target(PROPERTY) 11 | @Retention(SOURCE) 12 | internal annotation class MutatedByFramework -------------------------------------------------------------------------------- /samples/redux/rxredux/src/main/java/com/lyft/domic/samples/redux/rxredux/signin/SignInView.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.samples.redux.rxredux.signin 2 | 3 | import com.lyft.domic.samples.redux.rxredux.signin.SignInStateMachine.Action 4 | import com.lyft.domic.samples.redux.rxredux.signin.SignInStateMachine.State 5 | import io.reactivex.Observable 6 | import io.reactivex.disposables.Disposable 7 | 8 | interface SignInView { 9 | val actions: Observable 10 | fun render(signInState: Observable): Disposable 11 | } 12 | -------------------------------------------------------------------------------- /samples/shared/src/main/java/com/lyft/domic/samples/shared/signin/SignInService.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.samples.shared.signin 2 | 3 | import io.reactivex.Observable 4 | 5 | interface SignInService { 6 | 7 | data class Credentials(val email: CharSequence, val password: CharSequence) 8 | 9 | sealed class SignInResult { 10 | object Success : SignInResult() 11 | data class Error(val cause: Throwable) : SignInResult() 12 | } 13 | 14 | fun signIn(credentials: Credentials): Observable 15 | } 16 | -------------------------------------------------------------------------------- /domic/api/src/main/kotlin/com/lyft/domic/api/CompoundButton.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.api 2 | 3 | import io.reactivex.Observable 4 | import io.reactivex.disposables.Disposable 5 | 6 | interface CompoundButton : Button { 7 | 8 | override val observe: Observe 9 | override val change: Change 10 | 11 | interface Observe : Button.Observe { 12 | val checked: Observable 13 | } 14 | 15 | interface Change : Button.Change { 16 | fun checked(checkedValues: Observable): Disposable 17 | } 18 | } -------------------------------------------------------------------------------- /samples/mvp/src/main/java/com/lyft/domic/samples/mvp/signin/SignInView.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.samples.mvp.signin 2 | 3 | import io.reactivex.Observable 4 | import io.reactivex.disposables.Disposable 5 | 6 | interface SignInView { 7 | fun observeEmail(): Observable 8 | fun observePassword(): Observable 9 | fun observeSingInSubmitActions(): Observable 10 | 11 | fun changeSignInEnable(enabledValues: Observable): Disposable 12 | fun changeResultText(textValues: Observable): Disposable 13 | } 14 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | 3 | jdk: 4 | - oraclejdk8 5 | 6 | before_install: 7 | - mkdir "$ANDROID_HOME/licenses" 8 | - echo "24333f8a63b6825ea9c5514f83c2829b004d1fee" > "$ANDROID_HOME/licenses/android-sdk-license" 9 | 10 | # Prevent Travis from running automatic project install. 11 | install: 12 | - true 13 | 14 | script: 15 | - ci/build.sh 16 | 17 | before_cache: 18 | - rm -f "$HOME"/.gradle/caches/modules-2/modules-2.lock 19 | 20 | cache: 21 | directories: 22 | - $HOME/.gradle/caches 23 | - $HOME/.gradle/wrapper 24 | 25 | notifications: 26 | email: false 27 | -------------------------------------------------------------------------------- /samples/shared/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | defaultConfig { 6 | minSdkVersion versions.minSdk 7 | compileSdkVersion versions.compileSdk 8 | buildToolsVersion versions.buildTools 9 | } 10 | 11 | lintOptions { 12 | disable 'UnusedResources' // Lint doesn't see resource usage from other modules. 13 | } 14 | } 15 | 16 | dependencies { 17 | api libraries.kotlinStdlib 18 | api libraries.rxJava 19 | api libraries.rxRelay 20 | api supportLibraries.appCompat 21 | api supportLibraries.constraintLayout 22 | } 23 | 24 | -------------------------------------------------------------------------------- /domic/api/src/main/kotlin/com/lyft/domic/api/TextView.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.api 2 | 3 | import io.reactivex.Observable 4 | import io.reactivex.disposables.Disposable 5 | 6 | interface TextView : View { 7 | 8 | override val observe: Observe 9 | override val change: Change 10 | 11 | interface Observe : View.Observe { 12 | val textChanges: Observable 13 | 14 | // TODO: delete, suggest to map [textChanges] to [Unit]. 15 | val textChangeEvents: Observable 16 | } 17 | 18 | interface Change : View.Change { 19 | 20 | fun text(textValues: Observable): Disposable 21 | } 22 | } 23 | 24 | -------------------------------------------------------------------------------- /domic/android/src/main/java/com/lyft/domic/android/AndroidButton.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.android 2 | 3 | import com.lyft.domic.api.Button 4 | import com.lyft.domic.api.TextView 5 | import com.lyft.domic.api.rendering.Renderer 6 | 7 | class AndroidButton( 8 | private val realButton: android.widget.Button, 9 | private val renderer: Renderer 10 | ) : Button { 11 | 12 | private val asTextView: TextView = AndroidTextView(realButton, renderer) 13 | 14 | override val observe: Button.Observe = object : Button.Observe, TextView.Observe by asTextView.observe { 15 | 16 | } 17 | 18 | override val change: Button.Change = object : Button.Change, TextView.Change by asTextView.change { 19 | 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /samples/performance/src/main/java/com/lyft/domic/samples/performance/domic/DomicView.kt: -------------------------------------------------------------------------------- 1 | package com.lyft.domic.samples.performance.domic 2 | 3 | import com.lyft.domic.api.Button 4 | import com.lyft.domic.api.CompoundButton 5 | import com.lyft.domic.api.EditText 6 | import com.lyft.domic.api.TextView 7 | 8 | interface DomicView { 9 | val counter0: TextView 10 | val counter1: TextView 11 | val counter2: TextView 12 | val counter3: TextView 13 | val counter4: TextView 14 | val counter5: TextView 15 | val counter6: TextView 16 | val counter7: TextView 17 | val counter8: TextView 18 | val counter9: TextView 19 | 20 | val button: Button 21 | val checkBox: CompoundButton 22 | val radioButton: CompoundButton 23 | } 24 | -------------------------------------------------------------------------------- /samples/performance/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 |