From c959ea2db2cb87c49ca498905e6437390e23ca6b Mon Sep 17 00:00:00 2001 From: psteiger Date: Mon, 14 Oct 2024 03:49:34 -0400 Subject: [PATCH] Housekeeping --- android/{build.gradle => build.gradle.kts} | 6 +- android/conventions/build.gradle.kts | 4 +- .../conventions/src/main/kotlin/Extensions.kt | 23 ++--- ...android-application-conventions.gradle.kts | 26 +++-- ...lication-errorprone-conventions.gradle.kts | 1 - ...lin-android-library-conventions.gradle.kts | 19 ++-- ...ribs.kotlin-library-conventions.gradle.kts | 21 +++- .../ribs.spotless-convention.gradle.kts | 5 +- android/demos/compose/build.gradle | 18 ++-- .../com/uber/rib/compose/root/RootActivity.kt | 5 +- .../com/uber/rib/compose/root/RootRouter.kt | 7 +- .../com/uber/rib/compose/root/RootScope.kt | 18 ++-- .../com/uber/rib/compose/root/RootView.kt | 9 +- .../uber/rib/compose/root/main/AuthStream.kt | 6 +- .../uber/rib/compose/root/main/MainScope.kt | 9 +- .../uber/rib/compose/root/main/MainView.kt | 4 +- .../root/main/loggedin/LoggedInScope.kt | 10 +- .../root/main/loggedin/LoggedInView.kt | 4 +- .../compose/root/main/loggedin/ScoreStream.kt | 12 +-- .../loggedin/offgame/OffGameInteractor.kt | 2 +- .../main/loggedin/offgame/OffGameScope.kt | 12 +-- .../root/main/loggedin/tictactoe/Board.kt | 5 +- .../main/loggedin/tictactoe/TicTacToeEvent.kt | 1 + .../loggedin/tictactoe/TicTacToeInteractor.kt | 7 +- .../main/loggedin/tictactoe/TicTacToeScope.kt | 5 +- .../main/loggedin/tictactoe/TicTacToeView.kt | 4 +- .../loggedin/tictactoe/TicTacToeViewModel.kt | 5 +- .../root/main/loggedout/LoggedOutEvent.kt | 1 + .../main/loggedout/LoggedOutInteractor.kt | 2 +- .../root/main/loggedout/LoggedOutScope.kt | 5 +- .../root/main/loggedout/LoggedOutView.kt | 5 +- .../root/main/loggedout/LoggedOutViewModel.kt | 5 +- .../uber/rib/compose/util/AnalyticsClient.kt | 2 + .../com/uber/rib/compose/util/EventStream.kt | 8 +- .../com/uber/rib/compose/util/StateStream.kt | 6 +- android/demos/memory-leaks/build.gradle | 1 - .../java/com/uber/rib/SampleApplication.java | 51 +++++----- android/demos/rib-workers/build.gradle | 17 ++-- .../com/uber/rib/workers/root/RootActivity.kt | 5 +- .../uber/rib/workers/root/RootInteractor.kt | 5 +- .../com/uber/rib/workers/root/RootRouter.kt | 7 +- .../com/uber/rib/workers/root/RootScope.kt | 4 +- .../com/uber/rib/workers/root/RootView.kt | 7 +- .../uber/rib/workers/root/main/MainScope.kt | 11 +-- .../uber/rib/workers/root/main/MainView.kt | 4 +- .../RibWorkerSelectionInteractor.kt | 9 +- .../RibWorkerSelectionScope.kt | 5 +- .../RibWorkerSelectionView.kt | 11 +-- .../RibWorkerSelectionViewModel.kt | 4 +- .../root/main/workers/BackgroundWorker.kt | 2 +- .../rib/workers/root/main/workers/UiWorker.kt | 7 +- .../com/uber/rib/workers/util/EventStream.kt | 8 +- .../com/uber/rib/workers/util/StateStream.kt | 6 +- android/gradle/libs.versions.toml | 97 ++++++++++--------- android/gradle/test-libs.versions.toml | 16 ++- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../rib-android-compose/build.gradle | 13 +-- .../com/uber/rib/core/BasicComposeRouter.kt | 6 +- .../com/uber/rib/core/ComposePresenter.kt | 4 +- .../libraries/rib-android-core/build.gradle | 3 +- .../com/uber/rib/core/ActivityDelegate.kt | 18 ++-- .../uber/rib/core/CoreAppCompatActivity.kt | 14 +-- .../com/uber/rib/core/HasActivityDelegate.kt | 4 +- .../libraries/rib-android/build.gradle.kts | 4 +- .../com/uber/rib/core/ActivityContext.kt | 4 +- .../com/uber/rib/core/ActivityStarter.kt | 6 +- .../com/uber/rib/core/BasicViewRouter.kt | 6 +- .../kotlin/com/uber/rib/core/IntentCreator.kt | 6 +- .../com/uber/rib/core/IntentCreatorImpl.kt | 6 +- .../kotlin/com/uber/rib/core/IntentFactory.kt | 4 +- .../kotlin/com/uber/rib/core/RibActivity.kt | 55 ++++++----- .../com/uber/rib/core/RibDebugOverlay.kt | 8 +- .../com/uber/rib/core/RxActivityEvents.kt | 16 ++- .../kotlin/com/uber/rib/core/ViewBuilder.kt | 10 +- .../kotlin/com/uber/rib/core/ViewPresenter.kt | 4 +- .../kotlin/com/uber/rib/core/ViewRouter.kt | 6 +- .../src/main/kotlin/com/uber/rib/core/XRay.kt | 19 ++-- .../core/lifecycle/ActivityCallbackEvent.kt | 67 ++++++------- .../uber/rib/core/lifecycle/ActivityEvent.kt | 6 +- .../core/lifecycle/ActivityLifecycleEvent.kt | 24 ++--- .../com/uber/rib/core/RibActivityTest.kt | 12 +-- .../com/uber/rib/core/ViewBuilderTest.kt | 10 +- .../{build.gradle => build.gradle.kts} | 15 ++- .../com/uber/rib/core/BasicInteractor.kt | 4 +- .../main/kotlin/com/uber/rib/core/Bundle.kt | 22 ++--- .../kotlin/com/uber/rib/core/Interactor.kt | 40 +++----- .../com/uber/rib/core/LazyBackingProperty.kt | 5 +- .../kotlin/com/uber/rib/core/Presenter.kt | 4 +- .../src/main/kotlin/com/uber/rib/core/Rib.kt | 6 +- .../com/uber/rib/core/RibCoroutineWorker.kt | 77 +++------------ .../kotlin/com/uber/rib/core/RibEvents.kt | 4 +- .../kotlin/com/uber/rib/core/RibRefWatcher.kt | 1 + .../main/kotlin/com/uber/rib/core/Router.kt | 32 ++---- .../kotlin/com/uber/rib/core/WorkerBinder.kt | 67 +++---------- .../com/uber/rib/core/WorkerUnbinder.kt | 2 +- .../src/test/kotlin/android/os/Bundle.kt | 8 +- .../uber/rib/core/InteractorAndRouterTest.kt | 30 +++--- .../uber/rib/core/LazyBackingPropertyTest.kt | 6 +- .../uber/rib/core/RibCoroutineWorkerTest.kt | 21 ++-- .../kotlin/com/uber/rib/core/RibEventsTest.kt | 19 +++- .../kotlin/com/uber/rib/core/RouterTest.kt | 7 +- .../com/uber/rib/core/WorkerBinderTest.kt | 2 +- .../{build.gradle => build.gradle.kts} | 16 +-- .../com/uber/rib/compiler/AnnotatedClass.kt | 2 +- .../compiler/InteractorAnnotationVerifier.kt | 5 +- .../RibInteractorProcessorPipeline.kt | 16 +-- .../com/uber/rib/compiler/RibProcessor.kt | 10 +- .../rib/compiler/TypeProcessorPipeline.kt | 5 +- .../InteractorAnnotationVerifierTest.kt | 2 +- .../compiler/InteractorProcessorTestBase.kt | 15 +-- .../libraries/rib-compiler-test/build.gradle | 44 --------- .../rib-compiler-test/build.gradle.kts | 73 ++++++++++++++ .../com/uber/rib/compiler/RibTestProcessor.kt | 12 +-- ...nteractorTestGeneratorProcessorTestBase.kt | 20 ++-- .../rib-coroutines-test/build.gradle.kts | 5 +- .../com/uber/rib/core/RibCoroutinesRule.kt | 3 +- .../uber/rib/core/TestRibCoroutineScopes.kt | 7 +- .../com/uber/rib/core/TestRibDispatchers.kt | 2 + .../kotlin/com/uber/rib/core/RibScopesTest.kt | 1 + android/libraries/rib-coroutines/build.gradle | 5 +- .../com/uber/rib/core/RibCoroutineScopes.kt | 2 + .../com/uber/rib/core/RibCoroutinesConfig.kt | 2 +- .../com/uber/rib/core/RibDispatchers.kt | 4 + .../rib-debug-utils/build.gradle.kts | 4 +- .../rib-router-navigator/build.gradle | 4 +- .../com/uber/rib/core/RouterAndState.kt | 16 ++- .../uber/rib/core/RouterNavigatorEventType.kt | 2 +- .../uber/rib/core/RouterNavigatorFactory.kt | 11 +-- .../com/uber/rib/core/RouterNavigatorState.kt | 5 +- .../com/uber/rib/core/StackRouterNavigator.kt | 25 ++--- .../com/uber/rib/core/RouterAndStateTest.kt | 15 +-- .../rib-screen-stack-base/build.gradle | 2 +- .../rib/core/screenstack/ScreenStackBase.kt | 18 ++-- .../uber/rib/core/screenstack/ViewProvider.kt | 20 ++-- .../screenstack/lifecycle/ScreenStackEvent.kt | 2 +- android/libraries/rib-test/build.gradle.kts | 6 +- .../kotlin/com/uber/rib/core/FakeComponent.kt | 14 +-- .../kotlin/com/uber/rib/core/FakeRouter.kt | 1 + .../kotlin/com/uber/rib/core/WorkerHelper.kt | 5 +- .../rib-workflow-test/build.gradle.kts | 2 +- .../com/uber/rib/workflow/core/StepTester.kt | 21 ++-- android/libraries/rib-workflow/build.gradle | 4 +- .../uber/rib/workflow/core/ActionableItem.kt | 4 +- .../kotlin/com/uber/rib/workflow/core/Step.kt | 46 ++++----- .../com/uber/rib/workflow/core/Workflow.kt | 11 ++- .../core/internal/WorkflowFriendModuleApi.kt | 4 +- .../workflow/core/AndroidSchedulersRule.kt | 8 +- .../rib/workflow/core/DelegatingScheduler.kt | 30 ++---- .../com/uber/rib/workflow/core/StepTest.kt | 14 +-- .../uber/rib/workflow/core/WorkflowTest.kt | 5 +- android/settings.gradle | 15 ++- .../tooling/rib-flipper-plugin/build.gradle | 2 +- .../com/uber/rib/flipper/RibEventPayload.kt | 10 +- .../uber/rib/flipper/RibTreeMessageType.kt | 2 +- .../com/uber/rib/flipper/RibTreePlugin.kt | 12 +-- .../tooling/rib-intellij-plugin/build.gradle | 21 +--- .../{build.gradle => build.gradle.kts} | 8 +- .../plugin/android/rib/CommandLineUtils.kt | 13 +-- .../plugin/android/rib/RibHierarchyBrowser.kt | 34 +++---- .../plugin/android/rib/RibHierarchyUtils.kt | 10 +- .../plugin/android/rib/RibProjectService.kt | 12 +-- .../plugin/android/rib/RibViewBrowser.kt | 30 ++---- .../android/rib/io/LogcatMessageDecoder.kt | 8 +- .../android/rib/io/LogcatRequestProcessor.kt | 15 +-- .../android/rib/ui/HierarchyBrowserBase.kt | 5 +- .../rib/ui/RibHierarchyActivityDescriptor.kt | 4 +- .../ui/RibHierarchyApplicationDescriptor.kt | 4 +- .../android/rib/ui/RibHierarchyDescriptor.kt | 13 +-- .../rib/ui/RibHierarchyNodeDescriptor.kt | 8 +- .../rib/ui/RibHierarchyTreeStructure.kt | 12 +-- .../android/rib/ui/RibViewNodeDescriptor.kt | 12 +-- .../src/main/resources/META-INF/plugin.xml | 2 +- .../action/rib/RibGeneratorsTest.java | 2 + .../intellij-broadcast-core/build.gradle | 2 +- .../broadcast/core/DebugBroadcastRequest.java | 13 +-- 175 files changed, 875 insertions(+), 1212 deletions(-) rename android/{build.gradle => build.gradle.kts} (81%) rename android/libraries/rib-base/{build.gradle => build.gradle.kts} (84%) rename android/libraries/rib-compiler-app/{build.gradle => build.gradle.kts} (76%) delete mode 100644 android/libraries/rib-compiler-test/build.gradle create mode 100644 android/libraries/rib-compiler-test/build.gradle.kts rename android/tooling/rib-intellij-plugin/native/intellij-broadcast-rib/{build.gradle => build.gradle.kts} (90%) diff --git a/android/build.gradle b/android/build.gradle.kts similarity index 81% rename from android/build.gradle rename to android/build.gradle.kts index 58a747b81..a6d3f4d46 100644 --- a/android/build.gradle +++ b/android/build.gradle.kts @@ -16,9 +16,11 @@ plugins { alias(libs.plugins.androidApplication) apply false alias(libs.plugins.androidLibrary) apply false - alias(libs.plugins.kotlinAndroid) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.kotlin.symbol.processor) apply false alias(libs.plugins.kotlinKapt) apply false - alias(libs.plugins.mavenPublish) apply false + alias(libs.plugins.compose.compiler) apply false + alias(libs.plugins.maven.publish) apply false alias(libs.plugins.errorprone) apply false alias(libs.plugins.nullaway) apply false alias(libs.plugins.intellij) apply false diff --git a/android/conventions/build.gradle.kts b/android/conventions/build.gradle.kts index 9f6ae882a..25d7e7f20 100644 --- a/android/conventions/build.gradle.kts +++ b/android/conventions/build.gradle.kts @@ -15,7 +15,7 @@ */ plugins { `kotlin-dsl` - `kotlin-dsl-precompiled-script-plugins` + alias(libs.plugins.spotless) } repositories { @@ -27,7 +27,7 @@ repositories { dependencies { // Workaround for using version catalog on precompiled scripts. // https://github.com/gradle/gradle/issues/15383#issuecomment-779893192 - implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) + implementation(files((libs as Any).javaClass.superclass.protectionDomain.codeSource.location)) implementation(gradleApi()) implementation(libs.gradle.android.plugin) implementation(libs.gradle.kotlin.plugin) diff --git a/android/conventions/src/main/kotlin/Extensions.kt b/android/conventions/src/main/kotlin/Extensions.kt index 16f216f77..66d31eabd 100644 --- a/android/conventions/src/main/kotlin/Extensions.kt +++ b/android/conventions/src/main/kotlin/Extensions.kt @@ -14,8 +14,6 @@ * limitations under the License. */ import com.android.build.gradle.AbstractAppExtension -import com.android.build.gradle.LibraryExtension -import com.android.build.gradle.TestedExtension import com.android.build.gradle.api.BaseVariant import net.ltgt.gradle.errorprone.CheckSeverity import net.ltgt.gradle.errorprone.errorprone @@ -23,25 +21,18 @@ import net.ltgt.gradle.nullaway.nullaway fun AbstractAppExtension.errorprone() { applicationVariants.configureEach { errorprone() } - testErrorprone() -} - -fun LibraryExtension.errorprone() { - libraryVariants.configureEach { errorprone() } - testErrorprone() -} - -fun TestedExtension.testErrorprone() { testVariants.configureEach { errorprone() } unitTestVariants.configureEach { errorprone() } } -fun BaseVariant.errorprone() { +private fun BaseVariant.errorprone() { javaCompileProvider.configure { - options.errorprone.nullaway { - severity.set(CheckSeverity.ERROR) - annotatedPackages.add("com.uber") + options.errorprone { + nullaway { + severity.set(CheckSeverity.ERROR) + annotatedPackages.add("com.uber") + } + excludedPaths.set(".*/build/generated/.*") } - options.errorprone.excludedPaths.set(".*/build/generated/.*") } } diff --git a/android/conventions/src/main/kotlin/ribs.kotlin-android-application-conventions.gradle.kts b/android/conventions/src/main/kotlin/ribs.kotlin-android-application-conventions.gradle.kts index fbfd26dec..79080d4e3 100644 --- a/android/conventions/src/main/kotlin/ribs.kotlin-android-application-conventions.gradle.kts +++ b/android/conventions/src/main/kotlin/ribs.kotlin-android-application-conventions.gradle.kts @@ -24,40 +24,36 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { - compileSdk = 33 - + compileSdk = 34 defaultConfig { minSdk = 21 - targetSdk = 28 + targetSdk = 34 versionCode = 1 versionName = "1.0" } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + buildFeatures { + buildConfig = true } - // No need for lint. Those are just tutorials. lint { abortOnError = false quiet = true } - buildTypes { debug { matchingFallbacks.add("release") } } - - sourceSets { - getByName("main").java.srcDir("src/main/kotlin") - getByName("test").java.srcDir("src/test/kotlin") - getByName("androidTest").java.srcDir("src/androidTest/kotlin") + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = "11" } } diff --git a/android/conventions/src/main/kotlin/ribs.kotlin-android-application-errorprone-conventions.gradle.kts b/android/conventions/src/main/kotlin/ribs.kotlin-android-application-errorprone-conventions.gradle.kts index a06afdbc6..e82747877 100644 --- a/android/conventions/src/main/kotlin/ribs.kotlin-android-application-errorprone-conventions.gradle.kts +++ b/android/conventions/src/main/kotlin/ribs.kotlin-android-application-errorprone-conventions.gradle.kts @@ -32,6 +32,5 @@ dependencies { kapt(libs.uber.nullaway) errorprone(libs.errorprone.core) errorprone(libs.guava.jre) - errorproneJavac(libs.errorprone.javac) errorprone(libs.uber.nullaway) } diff --git a/android/conventions/src/main/kotlin/ribs.kotlin-android-library-conventions.gradle.kts b/android/conventions/src/main/kotlin/ribs.kotlin-android-library-conventions.gradle.kts index b49beb84e..a841c64a7 100644 --- a/android/conventions/src/main/kotlin/ribs.kotlin-android-library-conventions.gradle.kts +++ b/android/conventions/src/main/kotlin/ribs.kotlin-android-library-conventions.gradle.kts @@ -24,30 +24,27 @@ plugins { } kotlin { - jvmToolchain(8) + jvmToolchain(17) } android { - compileSdk = 33 + compileSdk = 34 defaultConfig { minSdk = 21 } - // This can be removed on AGP 8.1.0-alpha09 onwards, since we are using JVM Toolchain compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } - buildFeatures { - buildConfig = false + kotlinOptions { + jvmTarget = "11" } - sourceSets { - getByName("main").java.srcDir("src/main/kotlin") - getByName("test").java.srcDir("src/test/kotlin") - getByName("androidTest").java.srcDir("src/androidTest/kotlin") + buildFeatures { + buildConfig = false } testOptions { diff --git a/android/conventions/src/main/kotlin/ribs.kotlin-library-conventions.gradle.kts b/android/conventions/src/main/kotlin/ribs.kotlin-library-conventions.gradle.kts index 0a138b440..cf3257e50 100644 --- a/android/conventions/src/main/kotlin/ribs.kotlin-library-conventions.gradle.kts +++ b/android/conventions/src/main/kotlin/ribs.kotlin-library-conventions.gradle.kts @@ -13,18 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode +import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile + plugins { kotlin("jvm") id("ribs.spotless-convention") } -kotlin { - jvmToolchain(8) - explicitApi() +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } -tasks.named("compileKotlin", org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask::class.java) { +kotlin { + jvmToolchain(17) + explicitApi() compilerOptions { - freeCompilerArgs.add("-Xjvm-default=all") + freeCompilerArgs.addAll("-Xjvm-default=all") + jvmTarget = JvmTarget.JVM_11 } } + +tasks.withType().configureEach { + jvmTargetValidationMode = JvmTargetValidationMode.WARNING +} diff --git a/android/conventions/src/main/kotlin/ribs.spotless-convention.gradle.kts b/android/conventions/src/main/kotlin/ribs.spotless-convention.gradle.kts index bf1fbe417..61404c8c7 100644 --- a/android/conventions/src/main/kotlin/ribs.spotless-convention.gradle.kts +++ b/android/conventions/src/main/kotlin/ribs.spotless-convention.gradle.kts @@ -19,7 +19,7 @@ plugins { val libs = the() -configure { +spotless { format("misc") { target("**/*.md", "**/.gitignore") trimTrailingWhitespace() @@ -31,6 +31,7 @@ configure { mapOf( "indent_size" to "2", "continuation_indent_size" to "4", + "ktlint_function_naming_ignore_when_annotated_with" to "Composable", ) ) ktfmt(libs.versions.ktfmt.get()).googleStyle() @@ -40,7 +41,7 @@ configure { } java { target("src/*/java/**/*.java") - googleJavaFormat(libs.versions.gjf.get()) + googleJavaFormat(libs.versions.google.java.format.get()) licenseHeaderFile(rootProject.file("config/spotless/copyright.java")) removeUnusedImports() trimTrailingWhitespace() diff --git a/android/demos/compose/build.gradle b/android/demos/compose/build.gradle index 0b7c75e54..7cc2b2d45 100644 --- a/android/demos/compose/build.gradle +++ b/android/demos/compose/build.gradle @@ -1,6 +1,7 @@ plugins { id("ribs.kotlin-android-application-conventions") - alias(libs.plugins.kotlinKapt) + alias(libs.plugins.compose.compiler) + alias(libs.plugins.kotlin.symbol.processor) } android { @@ -12,13 +13,14 @@ android { buildFeatures { compose true } - composeOptions { - kotlinCompilerExtensionVersion libs.versions.compose.compiler.get() - } } dependencies { - kapt(libs.motif.compiler) + def composeBom = platform(libs.compose.bom) + implementation(composeBom) + androidTestImplementation(composeBom) + + ksp(libs.motif.compiler) implementation(project(":libraries:rib-android")) implementation(project(":libraries:rib-android-compose")) implementation(project(":libraries:rib-coroutines")) @@ -42,9 +44,9 @@ dependencies { // Flipper Debug tool integration - debugImplementation 'com.facebook.flipper:flipper:0.93.0' - debugImplementation 'com.facebook.soloader:soloader:0.10.1' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.93.0' + debugImplementation libs.flipper + debugImplementation libs.soloader + releaseImplementation libs.flipper.noop // Flipper RIBs plugin implementation(project(":tooling:rib-flipper-plugin")) diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootActivity.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootActivity.kt index d3352d77b..a4a393aee 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootActivity.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootActivity.kt @@ -25,11 +25,10 @@ import motif.ScopeFactory class RootActivity : RibActivity() { - override fun createRouter(parentViewGroup: ViewGroup): ViewRouter<*, *> { - return ScopeFactory.create(Parent::class.java) + override fun createRouter(parentViewGroup: ViewGroup): ViewRouter<*, *> = + ScopeFactory.create(Parent::class.java) .rootScope(this, findViewById(android.R.id.content)) .router() - } @motif.Scope interface Parent : Creatable { diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootRouter.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootRouter.kt index 0163591e3..ddd8d0821 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootRouter.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootRouter.kt @@ -18,11 +18,8 @@ package com.uber.rib.compose.root import com.uber.rib.compose.root.main.MainRouter import com.uber.rib.core.BasicViewRouter -class RootRouter( - view: RootView, - interactor: RootInteractor, - private val scope: RootScope, -) : BasicViewRouter(view, interactor) { +class RootRouter(view: RootView, interactor: RootInteractor, private val scope: RootScope) : + BasicViewRouter(view, interactor) { private var mainRouter: MainRouter? = null diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootScope.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootScope.kt index 8cb96553c..79c440de0 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootScope.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootScope.kt @@ -41,23 +41,17 @@ interface RootScope { abstract fun presenter(): EmptyPresenter - fun view(parentViewGroup: ViewGroup): RootView { - return RootView(parentViewGroup.context) - } + fun view(parentViewGroup: ViewGroup): RootView = RootView(parentViewGroup.context) @Expose - fun analyticsClient(activity: RibActivity): AnalyticsClient { - return AnalyticsClientImpl(activity.application) - } + fun analyticsClient(activity: RibActivity): AnalyticsClient = + AnalyticsClientImpl(activity.application) @Expose - fun experimentClient(activity: RibActivity): ExperimentClient { - return ExperimentClientImpl(activity.application) - } + fun experimentClient(activity: RibActivity): ExperimentClient = + ExperimentClientImpl(activity.application) @Expose - fun loggerClient(activity: RibActivity): LoggerClient { - return LoggerClientImpl(activity.application) - } + fun loggerClient(activity: RibActivity): LoggerClient = LoggerClientImpl(activity.application) } } diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootView.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootView.kt index 91cc8a0f5..92e11a439 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootView.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootView.kt @@ -23,11 +23,8 @@ import android.widget.TextView class RootView @JvmOverloads -constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0, -) : FrameLayout(context, attrs, defStyle) { +constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : + FrameLayout(context, attrs, defStyle) { init { setBackgroundColor(Color.RED) @@ -35,7 +32,7 @@ constructor( TextView(context).apply { text = "root (view)" setTextColor(Color.WHITE) - }, + } ) } } diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/AuthStream.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/AuthStream.kt index a39eacd55..7780eeef4 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/AuthStream.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/AuthStream.kt @@ -20,13 +20,13 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update class AuthStream { - private val _authFlow = MutableStateFlow(AuthInfo(false, "", "")) - private val authFlow = _authFlow.asStateFlow() + private val mutableAuthFlow = MutableStateFlow(AuthInfo(false, "", "")) + private val authFlow = mutableAuthFlow.asStateFlow() fun observe() = authFlow fun accept(value: AuthInfo) { - _authFlow.update { value } + mutableAuthFlow.update { value } } } diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/MainScope.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/MainScope.kt index c167261e6..1c04d6e6f 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/MainScope.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/MainScope.kt @@ -46,15 +46,12 @@ interface MainScope { analyticsClient: AnalyticsClient, experimentClient: ExperimentClient, loggerClient: LoggerClient, - ): ComposePresenter { - return object : ComposePresenter() { + ): ComposePresenter = + object : ComposePresenter() { override val composable = @Composable { MainView(childContent) } } - } - fun view(parentViewGroup: ViewGroup): ComposeView { - return ComposeView(parentViewGroup.context) - } + fun view(parentViewGroup: ViewGroup): ComposeView = ComposeView(parentViewGroup.context) abstract fun childContent(): MainRouter.ChildContent diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/MainView.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/MainView.kt index fdb483787..89dace8c2 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/MainView.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/MainView.kt @@ -39,9 +39,7 @@ fun MainView(childContent: MainRouter.ChildContent) { Modifier.fillMaxSize().padding(all = 4.dp).padding(top = 14.dp).background(Color(0xFFFFA500)), ) { Text("Main RIB (Compose w/ CompView)") - Box( - modifier = Modifier.fillMaxWidth().weight(1.0f).padding(4.dp).background(Color.Yellow), - ) { + Box(modifier = Modifier.fillMaxWidth().weight(1.0f).padding(4.dp).background(Color.Yellow)) { childContent.fullScreenSlot.value.invoke() } } diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/LoggedInScope.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/LoggedInScope.kt index 8661adc18..a5abb71ab 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/LoggedInScope.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/LoggedInScope.kt @@ -48,18 +48,16 @@ interface LoggedInScope { fun presenter( eventStream: EventStream, childContent: LoggedInRouter.ChildContent, - ): ComposePresenter { - return object : ComposePresenter() { + ): ComposePresenter = + object : ComposePresenter() { override val composable = @Composable { LoggedInView(eventStream, childContent) } } - } fun eventStream() = EventStream() @Expose - fun scoreSteam(authInfo: AuthInfo): ScoreStream { - return ScoreStream(authInfo.playerOne, authInfo.playerTwo) - } + fun scoreSteam(authInfo: AuthInfo): ScoreStream = + ScoreStream(authInfo.playerOne, authInfo.playerTwo) @Expose abstract fun startGameListener(interactor: LoggedInInteractor): OffGameInteractor.Listener diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/LoggedInView.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/LoggedInView.kt index 0e34472c4..09516bb99 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/LoggedInView.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/LoggedInView.kt @@ -46,9 +46,7 @@ fun LoggedInView( ) { Text("Logged In! (Compose RIB)") Spacer(Modifier.height(16.dp)) - Box( - modifier = Modifier.fillMaxWidth().weight(1.0f).padding(4.dp).background(Color.LightGray), - ) { + Box(modifier = Modifier.fillMaxWidth().weight(1.0f).padding(4.dp).background(Color.LightGray)) { childContent.fullScreenSlot.value.invoke() } CustomButton( diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/ScoreStream.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/ScoreStream.kt index 0a4b0e7ce..413a270ba 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/ScoreStream.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/ScoreStream.kt @@ -23,18 +23,12 @@ import kotlinx.coroutines.withContext class ScoreStream(playerOne: String, playerTwo: String) { - private val _scoresFlow = - MutableStateFlow( - mapOf( - playerOne to 0, - playerTwo to 0, - ), - ) - private val scoresFlow = _scoresFlow.asStateFlow() + private val mutableScoresFlow = MutableStateFlow(mapOf(playerOne to 0, playerTwo to 0)) + private val scoresFlow = mutableScoresFlow.asStateFlow() suspend fun addVictory(userName: String) = withContext(RibDispatchers.Default) { - _scoresFlow.update { scores -> + mutableScoresFlow.update { scores -> scores .toMutableMap() .apply { diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/offgame/OffGameInteractor.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/offgame/OffGameInteractor.kt index 687af4a80..3fc48b4c4 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/offgame/OffGameInteractor.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/offgame/OffGameInteractor.kt @@ -55,7 +55,7 @@ class OffGameInteractor( currentState.copy( playerOneWins = it[currentState.playerOne] ?: 0, playerTwoWins = it[currentState.playerTwo] ?: 0, - ), + ) ) } .launchIn(coroutineScope) diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/offgame/OffGameScope.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/offgame/OffGameScope.kt index 7b5f2423e..831a89396 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/offgame/OffGameScope.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/offgame/OffGameScope.kt @@ -35,8 +35,8 @@ interface OffGameScope { fun presenter( stateStream: StateStream, eventStream: EventStream, - ): ComposePresenter { - return object : ComposePresenter() { + ): ComposePresenter = + object : ComposePresenter() { override val composable = @Composable { OffGameView( @@ -45,16 +45,10 @@ interface OffGameScope { ) } } - } fun eventStream() = EventStream() fun stateStream(authInfo: AuthInfo) = - StateStream( - OffGameViewModel( - playerOne = authInfo.playerOne, - playerTwo = authInfo.playerTwo, - ), - ) + StateStream(OffGameViewModel(playerOne = authInfo.playerOne, playerTwo = authInfo.playerTwo)) } } diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/Board.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/Board.kt index dea8f8b9e..990427568 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/Board.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/Board.kt @@ -35,8 +35,8 @@ class Board @Inject constructor() { } /** Return true if the player with "theSeed" has won after placing at (currentRow, currentCol) */ - fun hasWon(theSeed: MarkerType): Boolean { - return (cells[currentRow][0] == theSeed && + fun hasWon(theSeed: MarkerType): Boolean = + (cells[currentRow][0] == theSeed && cells[currentRow][1] == theSeed && cells[currentRow][2] == theSeed || cells[0][currentCol] == theSeed && @@ -50,7 +50,6 @@ class Board @Inject constructor() { cells[0][2] == theSeed && cells[1][1] == theSeed && cells[2][0] == theSeed) - } enum class MarkerType { CROSS, diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeEvent.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeEvent.kt index aaf55c55a..129d47c93 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeEvent.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeEvent.kt @@ -17,5 +17,6 @@ package com.uber.rib.compose.root.main.loggedin.tictactoe sealed class TicTacToeEvent { object XpButtonClick : TicTacToeEvent() + class BoardClick(val coordinate: BoardCoordinate) : TicTacToeEvent() } diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeInteractor.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeInteractor.kt index b398c8d9e..5356a9cf1 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeInteractor.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeInteractor.kt @@ -76,12 +76,7 @@ class TicTacToeInteractor( } stateStream.dispatch( - stateStream - .current() - .copy( - board = board, - currentPlayer = newPlayerName, - ), + stateStream.current().copy(board = board, currentPlayer = newPlayerName) ) } TicTacToeEvent.XpButtonClick -> TODO("Go somewhere") diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeScope.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeScope.kt index 354c36837..a30f4a0c7 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeScope.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeScope.kt @@ -35,8 +35,8 @@ interface TicTacToeScope { fun presenter( stateStream: StateStream, eventStream: EventStream, - ): ComposePresenter { - return object : ComposePresenter() { + ): ComposePresenter = + object : ComposePresenter() { override val composable = @Composable { TicTacToeView( @@ -45,7 +45,6 @@ interface TicTacToeScope { ) } } - } fun eventStream() = EventStream() diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeView.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeView.kt index 7630ae797..a7dfcc6f7 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeView.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeView.kt @@ -49,9 +49,7 @@ fun TicTacToeView(viewModel: State, eventStream: EventStream modifier = Modifier.fillMaxSize().background(Color.Blue), ) { Text("Current Player: ${viewModel.value.currentPlayer}", color = Color.White) - Box( - modifier = Modifier.aspectRatio(1f).fillMaxSize(), - ) { + Box(modifier = Modifier.aspectRatio(1f).fillMaxSize()) { LazyVerticalGrid(columns = GridCells.Fixed(3), modifier = Modifier.fillMaxSize()) { val board = viewModel.value.board items(9) { i -> diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeViewModel.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeViewModel.kt index 0b4518666..9ef75726a 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeViewModel.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedin/tictactoe/TicTacToeViewModel.kt @@ -15,7 +15,4 @@ */ package com.uber.rib.compose.root.main.loggedin.tictactoe -data class TicTacToeViewModel( - val currentPlayer: String, - val board: Board, -) +data class TicTacToeViewModel(val currentPlayer: String, val board: Board) diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutEvent.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutEvent.kt index 19932a67f..444a9071f 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutEvent.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutEvent.kt @@ -17,5 +17,6 @@ package com.uber.rib.compose.root.main.loggedout sealed class LoggedOutEvent { class PlayerNameChanged(val name: String, val num: Int) : LoggedOutEvent() + object LogInClick : LoggedOutEvent() } diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutInteractor.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutInteractor.kt index d0d479df5..d2cc275de 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutInteractor.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutInteractor.kt @@ -45,7 +45,7 @@ class LoggedOutInteractor( .copy( playerOne = if (it.num == 1) it.name else current().playerOne, playerTwo = if (it.num == 2) it.name else current().playerTwo, - ), + ) ) } } diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutScope.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutScope.kt index 900f07d50..7867b3a7c 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutScope.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutScope.kt @@ -34,8 +34,8 @@ interface LoggedOutScope { fun presenter( stateStream: StateStream, eventStream: EventStream, - ): ComposePresenter { - return object : ComposePresenter() { + ): ComposePresenter = + object : ComposePresenter() { override val composable = @Composable { LoggedOutView( @@ -44,7 +44,6 @@ interface LoggedOutScope { ) } } - } fun eventStream() = EventStream() diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutView.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutView.kt index 82f479a10..e7d4ee5dd 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutView.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutView.kt @@ -55,10 +55,7 @@ fun LoggedOutView(viewModel: State, eventStream: EventStream ) Button( colors = - ButtonDefaults.buttonColors( - backgroundColor = Color.Black, - contentColor = Color.White, - ), + ButtonDefaults.buttonColors(backgroundColor = Color.Black, contentColor = Color.White), onClick = { eventStream.notify(LoggedOutEvent.LogInClick) }, modifier = Modifier.fillMaxWidth(), ) { diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutViewModel.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutViewModel.kt index e98444537..ae45a01d0 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutViewModel.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/loggedout/LoggedOutViewModel.kt @@ -15,7 +15,4 @@ */ package com.uber.rib.compose.root.main.loggedout -data class LoggedOutViewModel( - val playerOne: String = "", - val playerTwo: String = "", -) +data class LoggedOutViewModel(val playerOne: String = "", val playerTwo: String = "") diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/AnalyticsClient.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/AnalyticsClient.kt index fa6d47bcd..b8f4d3bd9 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/AnalyticsClient.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/AnalyticsClient.kt @@ -42,10 +42,12 @@ class AnalyticsClientImpl(private val application: Application) : AnalyticsClien object NoOpAnalyticsClient : AnalyticsClient { override fun trackClick(id: String) = Unit + override fun trackImpression(id: String) = Unit } interface AnalyticsClient { fun trackClick(id: String) + fun trackImpression(id: String) } diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/EventStream.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/EventStream.kt index aad65b83b..d7234a83e 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/EventStream.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/EventStream.kt @@ -19,10 +19,10 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow class EventStream { - private val _sharedFlow = MutableSharedFlow(extraBufferCapacity = 1) - private val sharedFlow = _sharedFlow.asSharedFlow() + private val mutableEventFlow = MutableSharedFlow(extraBufferCapacity = 1) + private val eventFlow = mutableEventFlow.asSharedFlow() - fun notify(event: T) = _sharedFlow.tryEmit(event) + fun notify(event: T) = mutableEventFlow.tryEmit(event) - fun observe() = sharedFlow + fun observe() = eventFlow } diff --git a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/StateStream.kt b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/StateStream.kt index c3039c1e5..70cbba316 100644 --- a/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/StateStream.kt +++ b/android/demos/compose/src/main/kotlin/com/uber/rib/compose/util/StateStream.kt @@ -20,10 +20,10 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update class StateStream(default: T) { - private val _stateFlow = MutableStateFlow(default) - private val stateFlow = _stateFlow.asStateFlow() + private val mutableStateFlow = MutableStateFlow(default) + private val stateFlow = mutableStateFlow.asStateFlow() - fun dispatch(viewModel: T) = _stateFlow.update { viewModel } + fun dispatch(viewModel: T) = mutableStateFlow.update { viewModel } fun observe() = stateFlow diff --git a/android/demos/memory-leaks/build.gradle b/android/demos/memory-leaks/build.gradle index 6a83737f1..7814ecdae 100644 --- a/android/demos/memory-leaks/build.gradle +++ b/android/demos/memory-leaks/build.gradle @@ -30,7 +30,6 @@ dependencies { implementation(project(":libraries:rib-android")) kapt(project(":libraries:rib-compiler-app")) kapt(project(":libraries:rib-compiler-test")) - kapt(libs.autodispose.errorprone) kapt(libs.dagger.compiler) implementation(libs.dagger.library) implementation(libs.rxbinding) diff --git a/android/demos/memory-leaks/src/main/java/com/uber/rib/SampleApplication.java b/android/demos/memory-leaks/src/main/java/com/uber/rib/SampleApplication.java index 712589905..ecc3bc790 100644 --- a/android/demos/memory-leaks/src/main/java/com/uber/rib/SampleApplication.java +++ b/android/demos/memory-leaks/src/main/java/com/uber/rib/SampleApplication.java @@ -16,12 +16,10 @@ package com.uber.rib; import android.app.Application; -import com.squareup.leakcanary.LeakCanary; -import com.squareup.leakcanary.RefWatcher; +// import com.squareup.leakcanary.LeakCanary; +// import com.squareup.leakcanary.ObjectWatcher; import com.uber.rib.core.ActivityDelegate; import com.uber.rib.core.HasActivityDelegate; -import com.uber.rib.core.RibRefWatcher; -import java.util.concurrent.TimeUnit; public class SampleApplication extends Application implements HasActivityDelegate { @@ -31,32 +29,33 @@ public class SampleApplication extends Application implements HasActivityDelegat public void onCreate() { activityDelegate = new SampleActivityDelegate(); super.onCreate(); - if (!LeakCanary.isInAnalyzerProcess(this)) { - // This process is dedicated to LeakCanary for heap analysis. You should not init your app in - // this process. - installLeakCanary(); - } + // if (!LeakCanary.isInAnalyzerProcess(this)) { + // // This process is dedicated to LeakCanary for heap analysis. You should not init your + // app in + // // this process. + // installLeakCanary(); + // } } /** Install leak canary for both activities and RIBs. */ private void installLeakCanary() { - final RefWatcher refWatcher = - LeakCanary.refWatcher(this).watchDelay(2, TimeUnit.SECONDS).buildAndInstall(); - LeakCanary.install(this); - RibRefWatcher.getInstance() - .setReferenceWatcher( - new RibRefWatcher.ReferenceWatcher() { - @Override - public void watch(Object object) { - refWatcher.watch(object); - } - - @Override - public void logBreadcrumb(String eventType, String data, String parent) { - // Ignore for now. Useful for collecting production analytics. - } - }); - RibRefWatcher.getInstance().enableLeakCanary(); + // final RefWatcher refWatcher = + // LeakCanary.refWatcher(this).watchDelay(2, TimeUnit.SECONDS).buildAndInstall(); + // LeakCanary.install(this); + // RibRefWatcher.getInstance() + // .setReferenceWatcher( + // new RibRefWatcher.ReferenceWatcher() { + // @Override + // public void watch(Object object) { + // refWatcher.watch(object); + // } + // + // @Override + // public void logBreadcrumb(String eventType, String data, String parent) { + // // Ignore for now. Useful for collecting production analytics. + // } + // }); + // RibRefWatcher.getInstance().enableLeakCanary(); } @Override diff --git a/android/demos/rib-workers/build.gradle b/android/demos/rib-workers/build.gradle index 46eefe2cc..a9c18779e 100644 --- a/android/demos/rib-workers/build.gradle +++ b/android/demos/rib-workers/build.gradle @@ -1,5 +1,7 @@ plugins { id("ribs.kotlin-android-application-errorprone-conventions") + alias(libs.plugins.compose.compiler) + alias(libs.plugins.kotlin.symbol.processor) } android { @@ -11,13 +13,14 @@ android { buildFeatures { compose true } - composeOptions { - kotlinCompilerExtensionVersion libs.versions.compose.compiler.get() - } } dependencies { - kapt(libs.motif.compiler) + def composeBom = platform(libs.compose.bom) + implementation(composeBom) + androidTestImplementation(composeBom) + + ksp(libs.motif.compiler) implementation(project(":libraries:rib-android")) implementation(project(":libraries:rib-android-compose")) implementation(project(":libraries:rib-coroutines")) @@ -40,9 +43,9 @@ dependencies { implementation(libs.autodispose.coroutines) implementation(libs.motif.library) - debugImplementation 'com.facebook.flipper:flipper:0.93.0' - debugImplementation 'com.facebook.soloader:soloader:0.10.1' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.93.0' + debugImplementation(libs.flipper) + debugImplementation(libs.soloader) + releaseImplementation(libs.flipper.noop) implementation(project(":tooling:rib-flipper-plugin")) } diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootActivity.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootActivity.kt index 2d9b08e8e..a3c07a005 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootActivity.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootActivity.kt @@ -26,11 +26,10 @@ import motif.ScopeFactory class RootActivity : RibActivity() { - override fun createRouter(parentViewGroup: ViewGroup): ViewRouter<*, *> { - return ScopeFactory.create(Parent::class.java) + override fun createRouter(parentViewGroup: ViewGroup): ViewRouter<*, *> = + ScopeFactory.create(Parent::class.java) .rootScope(application, this, findViewById(android.R.id.content)) .router() - } @motif.Scope interface Parent : Creatable { diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootInteractor.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootInteractor.kt index a5d310f58..2d032d39a 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootInteractor.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootInteractor.kt @@ -18,6 +18,5 @@ package com.uber.rib.workers.root import com.uber.rib.core.BasicInteractor import com.uber.rib.core.EmptyPresenter -class RootInteractor( - presenter: EmptyPresenter, -) : BasicInteractor(presenter) +class RootInteractor(presenter: EmptyPresenter) : + BasicInteractor(presenter) diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootRouter.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootRouter.kt index ecf3ac1fb..a1676242b 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootRouter.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootRouter.kt @@ -18,11 +18,8 @@ package com.uber.rib.workers.root import com.uber.rib.core.BasicViewRouter import com.uber.rib.workers.root.main.MainRouter -class RootRouter( - view: RootView, - interactor: RootInteractor, - private val scope: RootScope, -) : BasicViewRouter(view, interactor) { +class RootRouter(view: RootView, interactor: RootInteractor, private val scope: RootScope) : + BasicViewRouter(view, interactor) { private var mainRouter: MainRouter? = null diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootScope.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootScope.kt index e7228f698..e4118ee46 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootScope.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootScope.kt @@ -33,8 +33,6 @@ interface RootScope { abstract fun presenter(): EmptyPresenter - fun view(parentViewGroup: ViewGroup): RootView { - return RootView(parentViewGroup.context) - } + fun view(parentViewGroup: ViewGroup): RootView = RootView(parentViewGroup.context) } } diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootView.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootView.kt index 85a594596..5ac77199e 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootView.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/RootView.kt @@ -21,8 +21,5 @@ import android.widget.FrameLayout class RootView @JvmOverloads -constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0, -) : FrameLayout(context, attrs, defStyle) +constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : + FrameLayout(context, attrs, defStyle) diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/MainScope.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/MainScope.kt index 08b05822b..6f072e7aa 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/MainScope.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/MainScope.kt @@ -34,17 +34,12 @@ interface MainScope { abstract fun interactor(): MainInteractor - fun presenter( - childContent: MainRouter.ChildContent, - ): ComposePresenter { - return object : ComposePresenter() { + fun presenter(childContent: MainRouter.ChildContent): ComposePresenter = + object : ComposePresenter() { override val composable = @Composable { MainView(childContent) } } - } - fun view(parentViewGroup: ViewGroup): ComposeView { - return ComposeView(parentViewGroup.context) - } + fun view(parentViewGroup: ViewGroup): ComposeView = ComposeView(parentViewGroup.context) abstract fun childContent(): MainRouter.ChildContent } diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/MainView.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/MainView.kt index b1ceaad6d..d3cb9d89a 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/MainView.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/MainView.kt @@ -36,9 +36,7 @@ fun MainView(childContent: MainRouter.ChildContent) { verticalArrangement = Arrangement.Top, modifier = Modifier.fillMaxSize().padding(all = 4.dp).padding(top = 14.dp), ) { - Box( - modifier = Modifier.fillMaxWidth().weight(1.0f).padding(4.dp).background(Color.White), - ) { + Box(modifier = Modifier.fillMaxWidth().weight(1.0f).padding(4.dp).background(Color.White)) { childContent.fullScreenSlot.value.invoke() } } diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionInteractor.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionInteractor.kt index 4a94dfa08..281bc0e30 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionInteractor.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionInteractor.kt @@ -93,14 +93,7 @@ class RibWorkerSelectionInteractor( } private fun updateViewModel(workerBound: String?) { - with(stateStream) { - dispatch( - current() - .copy( - workerInfo = workerBound + WORKER_BOUND_MESSAGE, - ), - ) - } + with(stateStream) { dispatch(current().copy(workerInfo = workerBound + WORKER_BOUND_MESSAGE)) } } private companion object { diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionScope.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionScope.kt index 2ea258f14..2edfc1fda 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionScope.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionScope.kt @@ -40,8 +40,8 @@ interface RibWorkerSelectionScope { fun presenter( stateStream: StateStream, eventStream: EventStream, - ): ComposePresenter { - return object : ComposePresenter() { + ): ComposePresenter = + object : ComposePresenter() { override val composable = @Composable { RibWorkerSelectionView( @@ -50,7 +50,6 @@ interface RibWorkerSelectionScope { ) } } - } fun eventStream() = EventStream() diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionView.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionView.kt index a1b55db5e..4a1f9f846 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionView.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionView.kt @@ -85,10 +85,7 @@ fun RibWorkerSelectionView( "RibCoroutineWorker <> Worker", ) - Text( - viewModel.value.workerInfo, - modifier = Modifier.fillMaxSize(), - ) + Text(viewModel.value.workerInfo, modifier = Modifier.fillMaxSize()) } } @@ -99,11 +96,7 @@ fun AddButton( buttonText: String, ) { Button( - colors = - ButtonDefaults.buttonColors( - backgroundColor = Color.Black, - contentColor = Color.White, - ), + colors = ButtonDefaults.buttonColors(backgroundColor = Color.Black, contentColor = Color.White), onClick = { eventStream.notify(ribWorkerBindTypeClickType) }, modifier = Modifier.fillMaxWidth(), ) { diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionViewModel.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionViewModel.kt index bd63a9ff9..008a064c5 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionViewModel.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/ribworkerselection/RibWorkerSelectionViewModel.kt @@ -15,6 +15,4 @@ */ package com.uber.rib.workers.root.main.ribworkerselection -data class RibWorkerSelectionViewModel( - val workerInfo: String = "", -) +data class RibWorkerSelectionViewModel(val workerInfo: String = "") diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/workers/BackgroundWorker.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/workers/BackgroundWorker.kt index 5a53d0c57..e89eaab96 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/workers/BackgroundWorker.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/workers/BackgroundWorker.kt @@ -21,7 +21,7 @@ import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.asCoroutineDispatcher /** A Rib Worker to be guaranteed on a background thread with a limited pool size of 1 */ -class BackgroundWorker() : Worker { +class BackgroundWorker : Worker { override val coroutineContext: CoroutineContext = Executors.newFixedThreadPool(1).asCoroutineDispatcher() diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/workers/UiWorker.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/workers/UiWorker.kt index cbaee3408..ee3d653b4 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/workers/UiWorker.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/root/main/workers/UiWorker.kt @@ -31,11 +31,6 @@ class UiWorker(private val activityContext: Application) : Worker { override val coroutineContext: CoroutineContext = RibDispatchers.Main override fun onStart(lifecycle: WorkerScopeProvider) { - Toast.makeText( - activityContext, - "Ui Worker (onStart) call", - Toast.LENGTH_LONG, - ) - .show() + Toast.makeText(activityContext, "Ui Worker (onStart) call", Toast.LENGTH_LONG).show() } } diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/util/EventStream.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/util/EventStream.kt index 0e7d6496f..98a7916c0 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/util/EventStream.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/util/EventStream.kt @@ -19,10 +19,10 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow class EventStream { - private val _sharedFlow = MutableSharedFlow(extraBufferCapacity = 1) - private val sharedFlow = _sharedFlow.asSharedFlow() + private val mutableEventFlow = MutableSharedFlow(extraBufferCapacity = 1) + private val eventFlow = mutableEventFlow.asSharedFlow() - fun notify(event: T) = _sharedFlow.tryEmit(event) + fun notify(event: T) = mutableEventFlow.tryEmit(event) - fun observe() = sharedFlow + fun observe() = eventFlow } diff --git a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/util/StateStream.kt b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/util/StateStream.kt index 627efbcbc..bae32027a 100644 --- a/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/util/StateStream.kt +++ b/android/demos/rib-workers/src/main/kotlin/com/uber/rib/workers/util/StateStream.kt @@ -20,10 +20,10 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update class StateStream(default: T) { - private val _stateFlow = MutableStateFlow(default) - private val stateFlow = _stateFlow.asStateFlow() + private val mutableStateFlow = MutableStateFlow(default) + private val stateFlow = mutableStateFlow.asStateFlow() - fun dispatch(viewModel: T) = _stateFlow.update { viewModel } + fun dispatch(viewModel: T) = mutableStateFlow.update { viewModel } fun observe() = stateFlow diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index 3004d9c4e..700b5d3b4 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -1,54 +1,50 @@ [versions] android-api = "4.1.1.4" -androidx-activity = "1.7.0" -androidx-annotations = "1.1.0" -androidx-appcompat = "1.3.0" -androidx-lifecycle = "2.6.1" -autocommon = "0.8" +androidx-activity = "1.9.2" +androidx-annotations = "1.8.2" +androidx-appcompat = "1.7.0" +androidx-lifecycle = "2.8.3" +autocommon = "0.10" autodispose = "1.4.0" autoservice = "1.0-rc4" -autovalue = "1.7" -checkerqual = "2.5.1" -compile-testing = "0.17" -compose-compiler = "1.4.6" -compose-libraries = "1.4.0" -compose-navigation = "2.4.0-alpha03" -coroutines = "1.7.3" -dagger = "2.43.2" -errorprone = "2.3.3" +autoservice-ksp = "1.2.0" +autovalue = "1.8.1" +checkerqual = "3.42.0" +compose-bom = "2024.09.00" +compose-navigation = "2.8.2" +coroutines = "1.8.0" +dagger = "2.48" +errorprone = "2.23.0" errorprone-javac = "9+181-r4173-1" flipper = "0.93.0" -gjf = "1.16.0" -gradle-android-plugin = "7.4.2" -gradle-errorprone-plugin = "1.3.0" -gradle-intellij-plugin = "1.15.0" -gradle-maven-publish-plugin = "0.25.2" -gradle-nullaway-plugin = "1.0.2" -gradle-spotless-plugin = "6.18.0" -gson = "2.8.7" -guava-android = "27.1-android" -guava-jre = "27.1-jre" +google-java-format = "1.24.0" +gradle-android-plugin = "8.7.0" +gradle-errorprone-plugin = "4.0.1" +gradle-intellij-plugin = "1.17.4" +gradle-maven-publish-plugin = "0.29.0" +gradle-nullaway-plugin = "1.3.0" +gradle-spotless-plugin = "6.25.0" +gson = "2.10.1" +guava-android = "31.0.1-android" +guava-jre = "31.0.1-jre" intellij = "2023.2" -javapoet = "1.11.1" +javapoet = "1.13.0" jsr250 = "1.0" -junit = "4.12" -kotlin = "1.8.20" -kotlinx-coroutines = "1.7.3" -ktfmt = "0.43" -ktlint = "0.48.2" -leakcanary = "1.5.4" -mockito = "4.6.1" -mockito-kotlin = "4.0.0" -motif = "0.3.4" +kotlin = "2.0.0" +ksp = "2.0.0-1.0.24" +ktfmt = "0.52" +ktlint = "1.3.1" +leakcanary = "2.14" +motif = "0.4.0-alpha05" percent = "1.0.0" -reactivestreams = "1.0.0" +reactivestreams = "1.0.3" rxandroid2 = "2.1.1" rxbinding = "2.0.0" rxjava2 = "2.2.8" rxkotlin = "2.2.0" rxrelay2 = "2.1.0" -savedstate = "1.2.0" -truth = "0.43" +savedstate = "1.2.1" +soloader = "0.10.1" uber-nullaway = "0.9.0" [libraries] @@ -62,18 +58,20 @@ autodispose-errorprone = { group = "com.uber.autodispose", name = "autodispose-e autodispose-library = { group = "com.uber.autodispose", name = "autodispose", version.ref = "autodispose" } autodispose-lifecycle = { group = "com.uber.autodispose", name = "autodispose-lifecycle", version.ref = "autodispose" } autoservice = { group = "com.google.auto.service", name = "auto-service", version.ref = "autoservice" } +autoservice-ksp = { group = "dev.zacsweers.autoservice", name = "auto-service-ksp", version.ref = "autoservice-ksp" } autovalue-annotations = { group = "com.google.auto.value", name = "auto-value-annotations", version.ref = "autovalue" } autovalue-library = { group = "com.google.auto.value", name = "auto-value", version.ref = "autovalue" } checkerqual = { group = "org.checkerframework", name = "checker-qual", version.ref = "checkerqual" } -compose-animation = { group = "androidx.compose.animation", name = "animation", version.ref = "compose-libraries" } -compose-compiler = { group = "androidx.compose.compiler", name = "compiler", version.ref = "compose-libraries" } -compose-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "compose-libraries" } -compose-material = { group = "androidx.compose.material", name = "material", version.ref = "compose-libraries" } +compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } +compose-animation = { group = "androidx.compose.animation", name = "animation" } +compose-compiler = { group = "androidx.compose.compiler", name = "compiler" } +compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } +compose-material = { group = "androidx.compose.material", name = "material" } +compose-runtime-rx2 = { group = "androidx.compose.runtime", name = "runtime-rxjava2" } +compose-ui = { group = "androidx.compose.ui", name = "ui" } +compose-uitooling = { group = "androidx.compose.ui", name = "ui-tooling" } +compose-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose" } compose-navigation = { group = "androidx.navigation", name = "navigation-compose", version.ref = "compose-navigation" } -compose-runtime-rx2 = { group = "androidx.compose.runtime", name = "runtime-rxjava2", version.ref = "compose-libraries" } -compose-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "compose-libraries" } -compose-uitooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "compose-libraries" } -compose-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "compose-libraries" } coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" } coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "coroutines" } coroutines-rx2 = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-rx2", version.ref = "coroutines" } @@ -82,6 +80,7 @@ dagger-library = { group = "com.google.dagger", name = "dagger", version.ref = " errorprone-core = { group = "com.google.errorprone", name = "error_prone_core", version.ref = "errorprone" } errorprone-javac = { group = "com.google.errorprone", name = "javac", version.ref = "errorprone-javac" } flipper = { group = "com.facebook.flipper", name = "flipper", version.ref = "flipper" } +flipper-noop = { module = "com.facebook.flipper:flipper-noop", version.ref = "flipper" } gradle-android-plugin = { module = "com.android.tools.build:gradle", version.ref = "gradle-android-plugin" } gradle-errorprone-plugin = { module = "net.ltgt.gradle:gradle-errorprone-plugin", version.ref = "gradle-errorprone-plugin" } gradle-kotlin-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } @@ -93,7 +92,6 @@ guava-jre = { group = "com.google.guava", name = "guava", version.ref = "guava-j javapoet = { group = "com.squareup", name = "javapoet", version.ref = "javapoet" } javax-inject = { group = "javax.inject", name = "javax.inject", version = "1" } jsr250 = { group = "javax.annotation", name = "jsr250-api", version.ref = "jsr250" } -kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" } leakcanary = { group = "com.squareup.leakcanary", name = "leakcanary-android", version.ref = "leakcanary" } lifecycle-runtime = { group = "androidx.lifecycle", name = "lifecycle-runtime", version.ref = "androidx-lifecycle" } motif-compiler = { group = "com.uber.motif", name = "motif-compiler", version.ref = "motif" } @@ -106,6 +104,7 @@ rxjava2 = { group = "io.reactivex.rxjava2", name = "rxjava", version.ref = "rxja rxkotlin = { group = "io.reactivex.rxjava2", name = "rxkotlin", version.ref = "rxkotlin" } rxrelay2 = { group = "com.jakewharton.rxrelay2", name = "rxrelay", version.ref = "rxrelay2" } savedstate = { group = "androidx.savedstate", name = "savedstate", version.ref = "savedstate" } +soloader = { module = "com.facebook.soloader:soloader", version.ref = "soloader" } uber-nullaway = { group = "com.uber.nullaway", name = "nullaway", version.ref = "uber-nullaway" } [plugins] @@ -113,8 +112,10 @@ androidApplication = { id = "com.android.application", version.ref = "gradle-and androidLibrary = { id = "com.android.library", version.ref = "gradle-android-plugin" } errorprone = { id = "net.ltgt.errorprone", version.ref = "gradle-errorprone-plugin" } intellij = { id = "org.jetbrains.intellij", version.ref = "gradle-intellij-plugin" } -kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-symbol-processor = { id = "com.google.devtools.ksp", version.ref = "ksp" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlinKapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } -mavenPublish = { id = "com.vanniktech.maven.publish", version.ref = "gradle-maven-publish-plugin" } +maven-publish = { id = "com.vanniktech.maven.publish", version.ref = "gradle-maven-publish-plugin" } nullaway = { id = "net.ltgt.nullaway", version.ref = "gradle-nullaway-plugin" } spotless = { id = "com.diffplug.spotless", version.ref = "gradle-spotless-plugin" } diff --git a/android/gradle/test-libs.versions.toml b/android/gradle/test-libs.versions.toml index 0c3d1754c..5e1ba7484 100644 --- a/android/gradle/test-libs.versions.toml +++ b/android/gradle/test-libs.versions.toml @@ -1,17 +1,15 @@ [versions] -compile-testing = "0.17" -coroutines = "1.7.3" -junit = "4.12" -mockito = "4.6.1" +compile-testing = "0.21.0" +coroutines = "1.8.0" +junit = "4.13.2" mockito-kotlin = "4.0.0" -robolectric = "4.4" -truth = "0.43" +robolectric = "4.13" +truth = "1.4.4" [libraries] -compileTesting = { group = "com.google.testing.compile", name = "compile-testing", version.ref = "compile-testing" } +compile-testing = { group = "com.google.testing.compile", name = "compile-testing", version.ref = "compile-testing" } coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutines" } junit = { group = "junit", name = "junit", version.ref = "junit" } -mockito = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } -mockitoKotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockito-kotlin" } +mockito-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockito-kotlin" } robolectric = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" } truth = { group = "com.google.truth", name = "truth", version.ref = "truth" } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 2b6241765..975ee1319 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip diff --git a/android/libraries/rib-android-compose/build.gradle b/android/libraries/rib-android-compose/build.gradle index c923b5c1d..d59b56e08 100644 --- a/android/libraries/rib-android-compose/build.gradle +++ b/android/libraries/rib-android-compose/build.gradle @@ -15,7 +15,8 @@ */ plugins { id("ribs.kotlin-android-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) + alias(libs.plugins.compose.compiler) } android { @@ -24,17 +25,17 @@ android { buildFeatures { compose true } - - composeOptions { - kotlinCompilerExtensionVersion libs.versions.compose.compiler.get() - } } dependencies { + def composeBom = platform(libs.compose.bom) + implementation(composeBom) + androidTestImplementation(composeBom) + api(project(":libraries:rib-android")) implementation(libs.compose.foundation) implementation(libs.compose.ui) testImplementation(testLibs.robolectric) - testImplementation(testLibs.mockitoKotlin) + testImplementation(testLibs.mockito.kotlin) testImplementation(project(":libraries:rib-test")) } diff --git a/android/libraries/rib-android-compose/src/main/kotlin/com/uber/rib/core/BasicComposeRouter.kt b/android/libraries/rib-android-compose/src/main/kotlin/com/uber/rib/core/BasicComposeRouter.kt index 2574963e4..e8d50d818 100644 --- a/android/libraries/rib-android-compose/src/main/kotlin/com/uber/rib/core/BasicComposeRouter.kt +++ b/android/libraries/rib-android-compose/src/main/kotlin/com/uber/rib/core/BasicComposeRouter.kt @@ -18,10 +18,10 @@ package com.uber.rib.core import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState -open class BasicComposeRouter>( - val presenter: ComposePresenter, +public open class BasicComposeRouter>( + public val presenter: ComposePresenter, interactor: I, - val slot: MutableState<(@Composable () -> Unit)>, + public val slot: MutableState<(@Composable () -> Unit)>, ) : BasicRouter(interactor) { override fun willAttach() { slot.value = presenter.composable diff --git a/android/libraries/rib-android-compose/src/main/kotlin/com/uber/rib/core/ComposePresenter.kt b/android/libraries/rib-android-compose/src/main/kotlin/com/uber/rib/core/ComposePresenter.kt index 10654e17a..e3e71afe8 100644 --- a/android/libraries/rib-android-compose/src/main/kotlin/com/uber/rib/core/ComposePresenter.kt +++ b/android/libraries/rib-android-compose/src/main/kotlin/com/uber/rib/core/ComposePresenter.kt @@ -17,6 +17,6 @@ package com.uber.rib.core import androidx.compose.runtime.Composable -abstract class ComposePresenter : Presenter() { - abstract val composable: @Composable () -> Unit +public abstract class ComposePresenter : Presenter() { + public abstract val composable: @Composable () -> Unit } diff --git a/android/libraries/rib-android-core/build.gradle b/android/libraries/rib-android-core/build.gradle index 2e4cabff9..d9058ff0e 100644 --- a/android/libraries/rib-android-core/build.gradle +++ b/android/libraries/rib-android-core/build.gradle @@ -16,7 +16,7 @@ plugins { id("ribs.kotlin-android-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } android { @@ -27,6 +27,7 @@ dependencies { implementation(libs.javax.inject) implementation(libs.annotation) implementation(libs.appcompat) + implementation(libs.lifecycle.runtime) testImplementation(libs.appcompat) testImplementation(testLibs.robolectric) } diff --git a/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/ActivityDelegate.kt b/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/ActivityDelegate.kt index c2b391621..ccc6d173f 100644 --- a/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/ActivityDelegate.kt +++ b/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/ActivityDelegate.kt @@ -25,27 +25,27 @@ import androidx.annotation.IntRange * functionality. This allows [RibActivity] and any other type of [Activity] that you need to * support to share [CoreAppCompatActivity] as a common parent. */ -interface ActivityDelegate { +public interface ActivityDelegate { /** @see [Activity.onCreate] */ - fun onCreate(savedInstanceState: Bundle?) {} + public fun onCreate(savedInstanceState: Bundle?) {} /** @see [Activity.onStart] */ - fun onStart() {} + public fun onStart() {} /** @see [Activity.onResume] */ - fun onResume() {} + public fun onResume() {} /** @see [Activity.onPause] */ - fun onPause() {} + public fun onPause() {} /** @see [Activity.onStop] */ - fun onStop() {} + public fun onStop() {} /** @see [Activity.onDestroy] */ - fun onDestroy() {} + public fun onDestroy() {} /** @see [Activity.onActivityResult] */ - fun onActivityResult( + public fun onActivityResult( activity: Activity, requestCode: Int, resultCode: Int, @@ -53,7 +53,7 @@ interface ActivityDelegate { ) {} /** @see [Activity.onRequestPermissionsResult] */ - fun onRequestPermissionsResult( + public fun onRequestPermissionsResult( activity: Activity, @IntRange(from = 0, to = 255) requestCode: Int, permissions: Array, diff --git a/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/CoreAppCompatActivity.kt b/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/CoreAppCompatActivity.kt index 2b6156706..88bacab73 100644 --- a/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/CoreAppCompatActivity.kt +++ b/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/CoreAppCompatActivity.kt @@ -20,12 +20,12 @@ import android.os.Bundle import androidx.annotation.CallSuper import androidx.annotation.IntRange import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewTreeLifecycleOwner -import androidx.lifecycle.ViewTreeViewModelStoreOwner -import androidx.savedstate.ViewTreeSavedStateRegistryOwner +import androidx.lifecycle.setViewTreeLifecycleOwner +import androidx.lifecycle.setViewTreeViewModelStoreOwner +import androidx.savedstate.setViewTreeSavedStateRegistryOwner /** Core Support v7 AppCompat Activity. */ -abstract class CoreAppCompatActivity : AppCompatActivity() { +public abstract class CoreAppCompatActivity : AppCompatActivity() { private var activityDelegate: ActivityDelegate? = null @@ -93,8 +93,8 @@ abstract class CoreAppCompatActivity : AppCompatActivity() { private fun initViewTreeOwners() { // Set the view tree owners before setting the content view so that the inflation process // and attach listeners will see them already present - ViewTreeLifecycleOwner.set(window.decorView, this) - ViewTreeViewModelStoreOwner.set(window.decorView, this) - ViewTreeSavedStateRegistryOwner.set(window.decorView, this) + window.decorView.setViewTreeLifecycleOwner(this) + window.decorView.setViewTreeViewModelStoreOwner(this) + window.decorView.setViewTreeSavedStateRegistryOwner(this) } } diff --git a/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/HasActivityDelegate.kt b/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/HasActivityDelegate.kt index 55f42bdec..2db9d7c75 100644 --- a/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/HasActivityDelegate.kt +++ b/android/libraries/rib-android-core/src/main/kotlin/com/uber/rib/core/HasActivityDelegate.kt @@ -16,11 +16,11 @@ package com.uber.rib.core /** Interface to indicate an object has an [ActivityDelegate]. */ -interface HasActivityDelegate { +public interface HasActivityDelegate { /** * Get the delegate. * * @return The delegate. */ - fun activityDelegate(): ActivityDelegate + public fun activityDelegate(): ActivityDelegate } diff --git a/android/libraries/rib-android/build.gradle.kts b/android/libraries/rib-android/build.gradle.kts index 547fc1231..f81bbfbc7 100644 --- a/android/libraries/rib-android/build.gradle.kts +++ b/android/libraries/rib-android/build.gradle.kts @@ -15,7 +15,7 @@ */ plugins { id("ribs.kotlin-android-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } android { @@ -48,6 +48,6 @@ dependencies { testImplementation(testLibs.robolectric) testImplementation(libs.lifecycle.runtime) testImplementation(libs.appcompat) - testImplementation(testLibs.mockitoKotlin) + testImplementation(testLibs.mockito.kotlin) testImplementation(project(":libraries:rib-test")) } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ActivityContext.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ActivityContext.kt index 8da53a9db..84cdcde12 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ActivityContext.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ActivityContext.kt @@ -15,9 +15,7 @@ */ package com.uber.rib.core -import java.lang.annotation.Retention -import java.lang.annotation.RetentionPolicy.RUNTIME import javax.inject.Qualifier /** Injection qualifier for an Activity Context. */ -@Qualifier @Retention(RUNTIME) annotation class ActivityContext +@Qualifier @Retention public annotation class ActivityContext diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ActivityStarter.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ActivityStarter.kt index 9d0caf019..55d44982d 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ActivityStarter.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ActivityStarter.kt @@ -21,13 +21,13 @@ import android.content.Intent * Start activities. A much cleaner dependency than an entire activity or context, and easier to * inject and mock in tests. */ -interface ActivityStarter { +public interface ActivityStarter { /** * Start an activity with the given intent. * * @param intent The intent to open a new activity. */ - fun startActivity(intent: Intent) + public fun startActivity(intent: Intent) /** * Start an activity with the given intent, to be notified when that activity finishes. @@ -37,5 +37,5 @@ interface ActivityStarter { * from this request. */ @Deprecated("""use plain Activity instead""") - fun startActivityForResult(intent: Intent, requestCode: Int) + public fun startActivityForResult(intent: Intent, requestCode: Int) } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/BasicViewRouter.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/BasicViewRouter.kt index bfd1ec88a..968fcc3a2 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/BasicViewRouter.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/BasicViewRouter.kt @@ -22,7 +22,5 @@ import android.view.View * * @param type of interactor. */ -abstract class BasicViewRouter>( - view: V, - interactor: I, -) : ViewRouter(view, interactor) +public abstract class BasicViewRouter>(view: V, interactor: I) : + ViewRouter(view, interactor) diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentCreator.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentCreator.kt index 045747a67..071ef7a8e 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentCreator.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentCreator.kt @@ -18,7 +18,7 @@ package com.uber.rib.core import android.content.Intent /** Creates intent objects. */ -interface IntentCreator { +public interface IntentCreator { /** * Create an explicit intent targeted at a particular class, which is guaranteed to be limited to * your app's package. @@ -26,7 +26,7 @@ interface IntentCreator { * @param cls The class that you intend to receive this intent. * @return The intent. */ - fun create(cls: Class<*>): Intent + public fun create(cls: Class<*>): Intent /** * Create an implicit intent targeted at an action, which may end up resolving to your app or to @@ -37,5 +37,5 @@ interface IntentCreator { * @param action The intent action, which any app may register to receive. * @return The intent. */ - fun create(action: String): Intent + public fun create(action: String): Intent } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentCreatorImpl.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentCreatorImpl.kt index 10831fb91..501ecd2f0 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentCreatorImpl.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentCreatorImpl.kt @@ -19,8 +19,8 @@ import android.content.Context import android.content.Intent /** A default implementation of [IntentCreator]. */ -open class IntentCreatorImpl(private val context: Context) : IntentCreator { - override fun create(cls: Class<*>) = Intent(context, cls) +public open class IntentCreatorImpl(private val context: Context) : IntentCreator { + override fun create(cls: Class<*>): Intent = Intent(context, cls) - override fun create(action: String) = Intent(action) + override fun create(action: String): Intent = Intent(action) } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentFactory.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentFactory.kt index 4d94dc33a..7692f1246 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentFactory.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/IntentFactory.kt @@ -18,12 +18,12 @@ package com.uber.rib.core import android.content.Intent /** Factory for an [Intent] that opens an activity. */ -interface IntentFactory { +public interface IntentFactory { /** * Create a view router to be displayed for an [Intent]. * * @param intentCreator to create the [Intent]. * @return the activity [Intent]. */ - fun create(intentCreator: IntentCreator): Intent + public fun create(intentCreator: IntentCreator): Intent } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RibActivity.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RibActivity.kt index cdec97e19..acb27a99c 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RibActivity.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RibActivity.kt @@ -15,6 +15,7 @@ */ package com.uber.rib.core +import android.annotation.SuppressLint import android.content.Intent import android.content.res.Configuration import android.os.Build @@ -43,6 +44,7 @@ import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.rx2.asObservable /** Base implementation for all VIP [android.app.Activity]s. */ +@Suppress("PropertyName") public abstract class RibActivity : CoreAppCompatActivity(), ActivityStarter, @@ -50,24 +52,24 @@ public abstract class RibActivity : RxActivityEvents { private var router: ViewRouter<*, *>? = null - private val _lifecycleFlow = + private val mutableLifecycleFlow = MutableSharedFlow(1, 0, BufferOverflow.DROP_OLDEST) public open val lifecycleFlow: SharedFlow - get() = _lifecycleFlow + get() = mutableLifecycleFlow - @Volatile private var _lifecycleObservable: Observable? = null + @Volatile private var mutableLifecycleObservable: Observable? = null private val lifecycleObservable - get() = ::_lifecycleObservable.setIfNullAndGet { lifecycleFlow.asObservable() } + get() = ::mutableLifecycleObservable.setIfNullAndGet { lifecycleFlow.asObservable() } - private val _callbacksFlow = + private val mutableCallbacksFlow = MutableSharedFlow(0, 1, BufferOverflow.DROP_OLDEST) public open val callbacksFlow: SharedFlow - get() = _callbacksFlow + get() = mutableCallbacksFlow - @Volatile private var _callbacksObservable: Observable? = null + @Volatile private var mutableCallbacksObservable: Observable? = null private val callbacksObservable - get() = ::_callbacksObservable.setIfNullAndGet { callbacksFlow.asObservable() } + get() = ::mutableCallbacksObservable.setIfNullAndGet { callbacksFlow.asObservable() } /** @return an observable of this activity's lifecycle events. */ final override fun lifecycle(): Observable = lifecycleObservable @@ -89,7 +91,7 @@ public abstract class RibActivity : override fun onCreate(savedInstanceState: android.os.Bundle?) { super.onCreate(savedInstanceState) val rootViewGroup = findViewById(android.R.id.content) - _lifecycleFlow.tryEmit(createOnCreateEvent(savedInstanceState)) + mutableLifecycleFlow.tryEmit(createOnCreateEvent(savedInstanceState)) val wrappedBundle: Bundle? = if (savedInstanceState != null) Bundle(savedInstanceState) else null router = createRouter(rootViewGroup) @@ -103,7 +105,7 @@ public abstract class RibActivity : @CallSuper override fun onSaveInstanceState(outState: android.os.Bundle) { super.onSaveInstanceState(outState) - _callbacksFlow.tryEmit(createOnSaveInstanceStateEvent(outState)) + mutableCallbacksFlow.tryEmit(createOnSaveInstanceStateEvent(outState)) router?.saveInstanceStateInternal(Bundle(outState)) ?: throw NullPointerException("Router should not be null") } @@ -111,42 +113,42 @@ public abstract class RibActivity : @CallSuper override fun onStart() { super.onStart() - _lifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.START)) + mutableLifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.START)) } @CallSuper override fun onResume() { super.onResume() - _lifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.RESUME)) + mutableLifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.RESUME)) } @CallSuper override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) - _callbacksFlow.tryEmit(createNewIntent(intent)) + mutableCallbacksFlow.tryEmit(createNewIntent(intent)) } @CallSuper override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - _callbacksFlow.tryEmit(createOnActivityResultEvent(requestCode, resultCode, data)) + mutableCallbacksFlow.tryEmit(createOnActivityResultEvent(requestCode, resultCode, data)) } @CallSuper override fun onPause() { - _lifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.PAUSE)) + mutableLifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.PAUSE)) super.onPause() } @CallSuper override fun onStop() { - _lifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.STOP)) + mutableLifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.STOP)) super.onStop() } @CallSuper override fun onDestroy() { - _lifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.DESTROY)) + mutableLifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.DESTROY)) router?.let { it.dispatchDetach() RibEvents.emitRouterEvent(RibEventType.DETACHED, it, null) @@ -158,22 +160,21 @@ public abstract class RibActivity : @CallSuper override fun onLowMemory() { super.onLowMemory() - _callbacksFlow.tryEmit(create(ActivityCallbackEvent.Type.LOW_MEMORY)) + mutableCallbacksFlow.tryEmit(create(ActivityCallbackEvent.Type.LOW_MEMORY)) } @CallSuper override fun onTrimMemory(level: Int) { super.onTrimMemory(level) - _callbacksFlow.tryEmit(createTrimMemoryEvent(level)) + mutableCallbacksFlow.tryEmit(createTrimMemoryEvent(level)) } + @SuppressLint("MissingSuperCall") override fun onPictureInPictureModeChanged( isInPictureInPictureMode: Boolean, newConfig: Configuration, ) { - _callbacksFlow.tryEmit( - createPictureInPictureMode(isInPictureInPictureMode), - ) + mutableCallbacksFlow.tryEmit(createPictureInPictureMode(isInPictureInPictureMode)) } override fun onBackPressed() { @@ -194,13 +195,13 @@ public abstract class RibActivity : } override fun onUserLeaveHint() { - _lifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.USER_LEAVING)) + mutableLifecycleFlow.tryEmit(create(ActivityLifecycleEvent.Type.USER_LEAVING)) super.onUserLeaveHint() } override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) - _callbacksFlow.tryEmit(createWindowFocusEvent(hasFocus)) + mutableCallbacksFlow.tryEmit(createWindowFocusEvent(hasFocus)) } /** @@ -219,7 +220,7 @@ public abstract class RibActivity : router?.interactor as Interactor<*, *> } else { throw IllegalStateException( - "Attempting to get a router when activity is not created or has been destroyed.", + "Attempting to get a router when activity is not created or has been destroyed." ) } @@ -244,9 +245,7 @@ public abstract class RibActivity : ActivityLifecycleEvent.Type.PAUSE -> create(ActivityLifecycleEvent.Type.STOP) ActivityLifecycleEvent.Type.STOP -> create(ActivityLifecycleEvent.Type.DESTROY) ActivityLifecycleEvent.Type.DESTROY -> - throw LifecycleEndedException( - "Cannot bind to Activity lifecycle when outside of it.", - ) + throw LifecycleEndedException("Cannot bind to Activity lifecycle when outside of it.") } } } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RibDebugOverlay.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RibDebugOverlay.kt index ac7788a61..a4ac059a7 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RibDebugOverlay.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RibDebugOverlay.kt @@ -22,10 +22,10 @@ import android.graphics.Paint import android.graphics.PixelFormat import android.graphics.drawable.Drawable -open class RibDebugOverlay : Drawable() { +public open class RibDebugOverlay : Drawable() { private var enabled = true - open fun setEnabled(enabled: Boolean) { + public open fun setEnabled(enabled: Boolean) { this.enabled = enabled } @@ -43,9 +43,9 @@ open class RibDebugOverlay : Drawable() { override fun setColorFilter(colorFilter: ColorFilter?) {} - override fun getOpacity() = PixelFormat.TRANSLUCENT + @Deprecated("Deprecated in upstream.") override fun getOpacity(): Int = PixelFormat.TRANSLUCENT - companion object { + private companion object { private const val OVERLAY_COLOR = Color.RED private const val OVERLAY_ALPHA = 35 } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RxActivityEvents.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RxActivityEvents.kt index 1e83cdfd3..95b7c9bb9 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RxActivityEvents.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/RxActivityEvents.kt @@ -20,32 +20,30 @@ import com.uber.rib.core.lifecycle.ActivityLifecycleEvent import io.reactivex.Observable /** Interface for reactive activities. */ -interface RxActivityEvents { +public interface RxActivityEvents { /** @return an observable of this activity's lifecycle events. */ - fun lifecycle(): Observable + public fun lifecycle(): Observable /** @return an observable of this activity's lifecycle events. */ - fun callbacks(): Observable + public fun callbacks(): Observable /** * @param The type of [ActivityLifecycleEvent] subclass you want. * @param clazz The [ActivityLifecycleEvent] subclass you want. * @return an observable of this activity's lifecycle events. */ - fun lifecycle(clazz: Class): Observable { - return lifecycle() + public fun lifecycle(clazz: Class): Observable = + lifecycle() .filter { activityEvent -> clazz.isAssignableFrom(activityEvent.javaClass) } .cast(clazz) - } /** * @param The type of [ActivityCallbackEvent] subclass you want. * @param clazz The [ActivityCallbackEvent] subclass you want. * @return an observable of this activity's callbacks events. */ - fun callbacks(clazz: Class): Observable { - return callbacks() + public fun callbacks(clazz: Class): Observable = + callbacks() .filter { activityEvent -> clazz.isAssignableFrom(activityEvent.javaClass) } .cast(clazz) - } } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewBuilder.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewBuilder.kt index 6c236599e..45915dd81 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewBuilder.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewBuilder.kt @@ -27,8 +27,8 @@ import android.view.ViewGroup * @param type of router built by this builder. * @param dependency required to create this router. */ -abstract class ViewBuilder, DependencyT>( - dependency: DependencyT, +public abstract class ViewBuilder, DependencyT>( + dependency: DependencyT ) : Builder(dependency) { /** * Utility method to create the view for this router. @@ -36,7 +36,7 @@ abstract class ViewBuilder, DependencyT>( * @param parentViewGroup to inflate view with. * @return the view for a new router. */ - fun createView(parentViewGroup: ViewGroup): ViewType { + public fun createView(parentViewGroup: ViewGroup): ViewType { val context = parentViewGroup.context return inflateView(LayoutInflater.from(onThemeContext(context)), parentViewGroup) } @@ -59,7 +59,5 @@ abstract class ViewBuilder, DependencyT>( * overridden. * @return the possibly themed context. */ - protected open fun onThemeContext(parentContext: Context): Context { - return parentContext - } + protected open fun onThemeContext(parentContext: Context): Context = parentContext } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewPresenter.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewPresenter.kt index 8fd9d4f92..4cf2db711 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewPresenter.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewPresenter.kt @@ -22,7 +22,7 @@ import android.view.View * * @param the view type. */ -abstract class ViewPresenter( +public abstract class ViewPresenter( /** @return the view fronted by the page. */ - val view: V, + public val view: V ) : Presenter() diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt index ec0f74657..036e679cc 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt @@ -23,11 +23,11 @@ import android.view.View * @param type of view owned by the router. * @param type of interactor owned by the router. */ -abstract class ViewRouter> : Router { +public abstract class ViewRouter> : Router { /** @return the router's view. */ - open val view: V + public val view: V - constructor( + public constructor( view: V, interactor: I, component: InteractorBaseComponent<*>, diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt index 3e545702e..efc7a38a7 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt @@ -25,9 +25,10 @@ import android.view.Gravity import android.view.View /** Utility class that shows riblets name in its background. */ -class XRay private constructor() { +public class XRay private constructor() { private var isEnabled = false private var textPaint: Paint? = null + private fun writeOnBitmap(bitmap: Bitmap, text: String) { val canvas = Canvas(bitmap) val textPaint = getTextPaint() @@ -47,7 +48,7 @@ class XRay private constructor() { return textPaint!! } - companion object { + public companion object { private val INSTANCE = XRay() private const val FRAME_WIDTH = 500 private const val FRAME_HEIGHT = 150 @@ -57,15 +58,12 @@ class XRay private constructor() { /** Toggles state of XRay. */ @JvmStatic - fun toggle() { + public fun toggle() { INSTANCE.isEnabled = !INSTANCE.isEnabled } /** @return `true` if XRay is enabled, `false` otherwise. */ - @JvmStatic - fun isEnabled(): Boolean { - return INSTANCE.isEnabled - } + @JvmStatic public fun isEnabled(): Boolean = INSTANCE.isEnabled /** * Puts [ViewBuilder]s riblet name in the background of the [View] @@ -74,7 +72,7 @@ class XRay private constructor() { * @param view a [View] to put the name behind. */ @JvmStatic - fun apply(viewRouter: ViewRouter<*, *>, view: View) { + public fun apply(viewRouter: ViewRouter<*, *>, view: View) { val oldBackground = view.background val bitmap: Bitmap = if (oldBackground != null) { @@ -110,8 +108,7 @@ class XRay private constructor() { return bitmap } - private fun getRibletName(viewRouter: ViewRouter<*, *>): String { - return viewRouter.javaClass.simpleName.replace("Router", "") - } + private fun getRibletName(viewRouter: ViewRouter<*, *>): String = + viewRouter.javaClass.simpleName.replace("Router", "") } } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityCallbackEvent.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityCallbackEvent.kt index f854bc315..5bb78d1d5 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityCallbackEvent.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityCallbackEvent.kt @@ -19,14 +19,14 @@ import android.content.Intent import android.os.Bundle /** Callback events that can be emitted by Activities. */ -open class ActivityCallbackEvent +public open class ActivityCallbackEvent private constructor( /** @return this event's type. */ - override val type: Type, + override val type: Type ) : ActivityEvent { /** Types of activity events that can occur. */ - enum class Type : ActivityEvent.BaseType { + public enum class Type : ActivityEvent.BaseType { LOW_MEMORY, ACTIVITY_RESULT, SAVE_INSTANCE_STATE, @@ -37,36 +37,39 @@ private constructor( } /** An [ActivityCallbackEvent] that represents [Activity.onNewIntent] event */ - open class NewIntent(open val intent: Intent) : ActivityCallbackEvent(Type.NEW_INTENT) - open class PictureInPictureMode(open val isInPictureInPictureMode: Boolean) : + public open class NewIntent(public open val intent: Intent) : + ActivityCallbackEvent(Type.NEW_INTENT) + + public open class PictureInPictureMode(public open val isInPictureInPictureMode: Boolean) : ActivityCallbackEvent(Type.PICTURE_IN_PICTURE_MODE) /** An [ActivityCallbackEvent] that represents [Activity.onWindowFocusChanged] event */ - open class WindowFocus(open val hasFocus: Boolean) : ActivityCallbackEvent(Type.WINDOW_FOCUS) + public open class WindowFocus(public open val hasFocus: Boolean) : + ActivityCallbackEvent(Type.WINDOW_FOCUS) /** An [ActivityCallbackEvent] that represents [Activity.onTrimMemory] event */ - open class TrimMemory internal constructor(open val trimMemoryType: Int) : + public open class TrimMemory internal constructor(public open val trimMemoryType: Int) : ActivityCallbackEvent(Type.TRIM_MEMORY) /** An [ActivityCallbackEvent] that encapsulates information from [Activity.onActivityResult]. */ - open class ActivityResult( + public open class ActivityResult( /** @return this event's activity result data intent. */ - open val data: Intent?, + public open val data: Intent?, /** @return this event's request code. */ - open val requestCode: Int, + public open val requestCode: Int, /** @return this event's result code. */ - open val resultCode: Int, + public open val resultCode: Int, ) : ActivityCallbackEvent(Type.ACTIVITY_RESULT) /** * An [ActivityCallbackEvent] that encapsulates information from [Activity.onSaveInstanceState]. */ - open class SaveInstanceState( + public open class SaveInstanceState( /** @return this event's outState data. */ - open val outState: Bundle?, + public open val outState: Bundle? ) : ActivityCallbackEvent(Type.SAVE_INSTANCE_STATE) - companion object { + public companion object { private val LOW_MEMORY_EVENT = ActivityCallbackEvent(Type.LOW_MEMORY) /** @@ -78,13 +81,11 @@ private constructor( * @return the created ActivityEvent. */ @JvmStatic - fun createOnActivityResultEvent( + public fun createOnActivityResultEvent( requestCode: Int, resultCode: Int, resultData: Intent?, - ): ActivityResult { - return ActivityResult(resultData, requestCode, resultCode) - } + ): ActivityResult = ActivityResult(resultData, requestCode, resultCode) /** * Creates an activity event for a given type. @@ -93,15 +94,14 @@ private constructor( * @return The corresponding ActivityEvent. */ @JvmStatic - fun create(type: Type): ActivityCallbackEvent { - return when (type) { + public fun create(type: Type): ActivityCallbackEvent = + when (type) { Type.LOW_MEMORY -> LOW_MEMORY_EVENT else -> throw IllegalArgumentException( - "Use the createOn${type.name.toLowerCase().capitalize()}Event() method for this type!", + "Use the createOn${type.name.toLowerCase().capitalize()}Event() method for this type!" ) } - } /** * Creates an event for onSaveInstanceState. @@ -110,9 +110,8 @@ private constructor( * @return the created ActivityEvent. */ @JvmStatic - fun createOnSaveInstanceStateEvent(outState: Bundle?): ActivityCallbackEvent { - return SaveInstanceState(outState) - } + public fun createOnSaveInstanceStateEvent(outState: Bundle?): ActivityCallbackEvent = + SaveInstanceState(outState) /** * Creates an event for [Activity.onTrimMemory] @@ -121,14 +120,11 @@ private constructor( * @return the created [TrimMemory] */ @JvmStatic - fun createTrimMemoryEvent(trimMemoryType: Int): TrimMemory { - return TrimMemory(trimMemoryType) - } + public fun createTrimMemoryEvent(trimMemoryType: Int): TrimMemory = TrimMemory(trimMemoryType) @JvmStatic - fun createPictureInPictureMode(isInPictureInPictureMode: Boolean): PictureInPictureMode { - return PictureInPictureMode(isInPictureInPictureMode) - } + public fun createPictureInPictureMode(isInPictureInPictureMode: Boolean): PictureInPictureMode = + PictureInPictureMode(isInPictureInPictureMode) /** * Creates an event for onNewIntent. @@ -136,10 +132,7 @@ private constructor( * @param intent is the new intent received * @return the created [NewIntent]. */ - @JvmStatic - fun createNewIntent(intent: Intent): NewIntent { - return NewIntent(intent) - } + @JvmStatic public fun createNewIntent(intent: Intent): NewIntent = NewIntent(intent) /** * Creates an event for onWindowFocusChanged @@ -148,8 +141,6 @@ private constructor( * @return the newly created [WindowFocus] */ @JvmStatic - fun createWindowFocusEvent(hasFocus: Boolean): WindowFocus { - return WindowFocus(hasFocus) - } + public fun createWindowFocusEvent(hasFocus: Boolean): WindowFocus = WindowFocus(hasFocus) } } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityEvent.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityEvent.kt index 23616c4c0..ecefaf777 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityEvent.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityEvent.kt @@ -19,10 +19,10 @@ package com.uber.rib.core.lifecycle * Base class for Activity events, useful for when you want a stream of both lifecycle and callback * events. */ -interface ActivityEvent { +public interface ActivityEvent { /** @return This activity event type. */ - val type: BaseType + public val type: BaseType /** Base interface of Activity event types. */ - interface BaseType + public interface BaseType } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityLifecycleEvent.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityLifecycleEvent.kt index c1cd2cf38..d8d0132e1 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityLifecycleEvent.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/lifecycle/ActivityLifecycleEvent.kt @@ -45,14 +45,14 @@ import android.os.Bundle * [total order](https://en.wikipedia.org/wiki/Total_order): it is reflexive, transitive, strongly * connected, but **not** antisymmetric. */ -open class ActivityLifecycleEvent +public open class ActivityLifecycleEvent private constructor( /** @return this event's type. */ - override val type: Type, + override val type: Type ) : ActivityEvent, Comparable { /** Types of activity events that can occur. */ - enum class Type : ActivityEvent.BaseType { + public enum class Type : ActivityEvent.BaseType { CREATE, START, RESUME, @@ -68,12 +68,12 @@ private constructor( * An [ActivityLifecycleEvent] that encapsulates information from * [Activity.onCreate][android.app.Activity.onCreate]. */ - open class Create( + public open class Create( /** @return this event's savedInstanceState data. */ - open val savedInstanceState: Bundle?, + public open val savedInstanceState: Bundle? ) : ActivityLifecycleEvent(Type.CREATE) - companion object { + public companion object { private val START_EVENT = ActivityLifecycleEvent(Type.START) private val RESUME_EVENT = ActivityLifecycleEvent(Type.RESUME) private val USER_LEAVING_EVENT = ActivityLifecycleEvent(Type.USER_LEAVING) @@ -87,10 +87,7 @@ private constructor( * @param stateData the instate bundle. * @return the created ActivityEvent. */ - @JvmStatic - fun createOnCreateEvent(stateData: Bundle?): Create { - return Create(stateData) - } + @JvmStatic public fun createOnCreateEvent(stateData: Bundle?): Create = Create(stateData) /** * Creates an activity event for a given type. @@ -99,8 +96,8 @@ private constructor( * @return The corresponding ActivityEvent. */ @JvmStatic - fun create(type: Type): ActivityLifecycleEvent { - return when (type) { + public fun create(type: Type): ActivityLifecycleEvent = + when (type) { Type.START -> START_EVENT Type.RESUME -> RESUME_EVENT Type.USER_LEAVING -> USER_LEAVING_EVENT @@ -109,9 +106,8 @@ private constructor( Type.DESTROY -> DESTROY_EVENT else -> throw IllegalArgumentException( - "Use the createOn${type.name.lowercase().replaceFirstChar(Char::titlecase)}Event() method for this type!", + "Use the createOn${type.name.lowercase().replaceFirstChar(Char::titlecase)}Event() method for this type!" ) } - } } } diff --git a/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/RibActivityTest.kt b/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/RibActivityTest.kt index 87f7ddc2f..9040ac257 100644 --- a/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/RibActivityTest.kt +++ b/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/RibActivityTest.kt @@ -26,7 +26,6 @@ import androidx.savedstate.findViewTreeSavedStateRegistryOwner import com.google.common.truth.Truth.assertThat import com.uber.autodispose.AutoDispose import com.uber.autodispose.lifecycle.LifecycleEndedException -import com.uber.rib.android.R import com.uber.rib.core.lifecycle.ActivityCallbackEvent import com.uber.rib.core.lifecycle.ActivityCallbackEvent.Companion.create import com.uber.rib.core.lifecycle.ActivityCallbackEvent.SaveInstanceState @@ -56,7 +55,7 @@ class RibActivityTest { Robolectric.buildActivity(EmptyActivity::class.java) activityController.create(testBundle) assertThat( - activityController.get().testInteractor.savedInstanceState?.getString(TEST_BUNDLE_KEY), + activityController.get().testInteractor.savedInstanceState?.getString(TEST_BUNDLE_KEY) ) .isEqualTo(TEST_BUNDLE_VALUE) } @@ -131,7 +130,7 @@ class RibActivityTest { .delaySubscription( activity.lifecycle().filter { activityEvent -> activityEvent.type === ActivityLifecycleEvent.Type.RESUME - }, + } ) .subscribe(o) subject.onNext(Any()) @@ -219,7 +218,7 @@ class RibActivityTest { private class EmptyActivity : RibActivity() { override fun onCreate(savedInstanceState: android.os.Bundle?) { - setTheme(R.style.Theme_AppCompat) + setTheme(androidx.appcompat.R.style.Theme_AppCompat) super.onCreate(savedInstanceState) } @@ -246,9 +245,8 @@ class RibActivityTest { component: InteractorComponent, *>, ) : ViewRouter, *>>(view, interactor, component) - private class TestInteractor( - presenter: ViewPresenter<*>, - ) : Interactor, FakeRouter<*>>(presenter) { + private class TestInteractor(presenter: ViewPresenter<*>) : + Interactor, FakeRouter<*>>(presenter) { var savedInstanceState: Bundle? = null private set diff --git a/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/ViewBuilderTest.kt b/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/ViewBuilderTest.kt index ce576d053..de1d04ed2 100644 --- a/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/ViewBuilderTest.kt +++ b/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/ViewBuilderTest.kt @@ -51,7 +51,11 @@ class ViewBuilderTest { @Test fun createView_useCustomContext() { val parentViewGroup: ViewGroup = FrameLayout(RuntimeEnvironment.application) - val customContext = ContextThemeWrapper(RuntimeEnvironment.application, R.style.Theme_AppCompat) + val customContext = + ContextThemeWrapper( + RuntimeEnvironment.application, + androidx.appcompat.R.style.Theme_AppCompat, + ) val holder = Holder() val viewBuilder: ViewBuilder<*, *, *> = object : ViewBuilder, Any>(Any()) { @@ -61,9 +65,7 @@ class ViewBuilderTest { return mock() } - override fun onThemeContext(parentContext: Context): Context { - return customContext - } + override fun onThemeContext(parentContext: Context): Context = customContext } viewBuilder.createView(parentViewGroup) Truth.assertThat(holder.inflaterContext).isEqualTo(customContext) diff --git a/android/libraries/rib-base/build.gradle b/android/libraries/rib-base/build.gradle.kts similarity index 84% rename from android/libraries/rib-base/build.gradle rename to android/libraries/rib-base/build.gradle.kts index fff35d78c..ecad36ad1 100644 --- a/android/libraries/rib-base/build.gradle +++ b/android/libraries/rib-base/build.gradle.kts @@ -15,15 +15,15 @@ */ plugins { id("ribs.kotlin-library-conventions") - alias(libs.plugins.kotlinKapt) - alias(libs.plugins.mavenPublish) + alias(libs.plugins.kotlin.symbol.processor) + alias(libs.plugins.maven.publish) } dependencies { // RIBs themselves don't need to use dagger. But the base library does use dagger // in order to invert a dependency. With a bit of work this could be removed. - kapt(libs.dagger.compiler) - kapt(libs.android.api) + ksp(libs.dagger.compiler) + ksp(libs.android.api) implementation(libs.guava.android) implementation(libs.reactivestreams) @@ -35,7 +35,6 @@ dependencies { implementation(libs.autodispose.coroutines) implementation(libs.coroutines.rx2) - api(libs.kotlin.stdlib) api(libs.coroutines.core) api(project(":libraries:rib-coroutines")) @@ -47,11 +46,9 @@ dependencies { testImplementation(project(":libraries:rib-coroutines-test")) testImplementation(libs.annotation) testImplementation(libs.android.api) - testImplementation(testLibs.junit) - testImplementation(testLibs.mockito) - testImplementation(testLibs.mockitoKotlin) + testImplementation(testLibs.mockito.kotlin) testImplementation(testLibs.truth) testImplementation(project(":libraries:rib-test")) { - transitive = false + isTransitive = false } } diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/BasicInteractor.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/BasicInteractor.kt index 3c082c698..dfa74e8f7 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/BasicInteractor.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/BasicInteractor.kt @@ -22,6 +22,4 @@ package com.uber.rib.core * @param the type of [Router]. */ public abstract class BasicInteractor

> -protected constructor( - @JvmField protected var presenter: P, -) : Interactor(presenter) +protected constructor(@JvmField protected var presenter: P) : Interactor(presenter) diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Bundle.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Bundle.kt index c79b4ef73..988e4a11d 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Bundle.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Bundle.kt @@ -20,9 +20,7 @@ import android.os.Parcelable /** Uber wrapper around Android Bundle to avoid Android and Robolectric dependencies. */ public open class Bundle @JvmOverloads -constructor( - private val androidBundle: android.os.Bundle = android.os.Bundle(), -) { +constructor(private val androidBundle: android.os.Bundle = android.os.Bundle()) { /** * Returns the value associated with the given key, or defaultValue if no mapping of the desired @@ -33,9 +31,8 @@ constructor( * @return the boolean value associated with the given key or null if there is no string value in * the bundle. */ - public open fun getBoolean(key: String, defaultValue: Boolean): Boolean { - return androidBundle.getBoolean(key, defaultValue) - } + public open fun getBoolean(key: String, defaultValue: Boolean): Boolean = + androidBundle.getBoolean(key, defaultValue) /** * Inserts a boolean value into the mapping of this Bundle, replacing any existing value for the @@ -85,9 +82,7 @@ constructor( * @param key to get. * @return the value, or `null`. */ - public open fun getParcelable(key: String): Parcelable? { - return androidBundle.getParcelable(key) - } + public open fun getParcelable(key: String): Parcelable? = androidBundle.getParcelable(key) /** * Inserts a Parcelable value into the mapping of this Bundle, replacing any existing value for @@ -108,9 +103,7 @@ constructor( * @return the String value associated with the given key or null if there is no string value in * the bundle. */ - public open fun getString(key: String): String? { - return androidBundle.getString(key) - } + public open fun getString(key: String): String? = androidBundle.getString(key) /** * Inserts a String value into the mapping of this Bundle, replacing any existing value for the @@ -142,7 +135,6 @@ constructor( * @return the int value associated with the given key or defaultValue if there is no int value in * the bundle. */ - public open fun getInt(key: String, defaultValue: Int): Int { - return androidBundle.getInt(key, defaultValue) - } + public open fun getInt(key: String, defaultValue: Int): Int = + androidBundle.getInt(key, defaultValue) } diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Interactor.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Interactor.kt index 4301bae42..359f25ff0 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Interactor.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Interactor.kt @@ -38,19 +38,21 @@ import kotlinx.coroutines.rx2.asObservable * @param

the type of [Presenter]. * @param the type of [Router]. */ +@Suppress("PropertyName") public abstract class Interactor

>() : InteractorType, RibActionEmitter { @Inject public lateinit var injectedPresenter: P @CoreFriendModuleApi public var actualPresenter: P? = null - private val _lifecycleFlow = MutableSharedFlow(1, 0, BufferOverflow.DROP_OLDEST) + private val mutableLifecycleFlow = + MutableSharedFlow(1, 0, BufferOverflow.DROP_OLDEST) public open val lifecycleFlow: SharedFlow - get() = _lifecycleFlow + get() = mutableLifecycleFlow - @Volatile private var _lifecycleObservable: Observable? = null + @Volatile private var lifecycleObservableField: Observable? = null @OptIn(CoreFriendModuleApi::class) private val lifecycleObservable - get() = ::_lifecycleObservable.setIfNullAndGet { lifecycleFlow.asObservable() } + get() = ::lifecycleObservableField.setIfNullAndGet { lifecycleFlow.asObservable() } private val routerDelegate = InitOnceProperty() @@ -79,7 +81,7 @@ public abstract class Interactor

>() : InteractorType, Rib // ---- InteractorType overrides ---- // override fun isAttached(): Boolean = - _lifecycleFlow.replayCache.lastOrNull() == InteractorEvent.ACTIVE + mutableLifecycleFlow.replayCache.lastOrNull() == InteractorEvent.ACTIVE override fun handleBackPress(): Boolean = false @@ -108,24 +110,16 @@ public abstract class Interactor

>() : InteractorType, Rib protected open fun onSaveInstanceState(outState: Bundle) {} public open fun dispatchAttach(savedInstanceState: Bundle?) { - _lifecycleFlow.tryEmit(InteractorEvent.ACTIVE) + mutableLifecycleFlow.tryEmit(InteractorEvent.ACTIVE) val presenter = (getPresenter() as? Presenter) presenter?.let { - triggerRibActionAndEmitEvents( - it, - RibActionEmitterType.PRESENTER, - RibEventType.ATTACHED, - ) { + triggerRibActionAndEmitEvents(it, RibActionEmitterType.PRESENTER, RibEventType.ATTACHED) { it.dispatchLoad() } } - triggerRibActionAndEmitEvents( - this, - RibActionEmitterType.INTERACTOR, - RibEventType.ATTACHED, - ) { + triggerRibActionAndEmitEvents(this, RibActionEmitterType.INTERACTOR, RibEventType.ATTACHED) { didBecomeActive(savedInstanceState) } } @@ -133,24 +127,16 @@ public abstract class Interactor

>() : InteractorType, Rib public open fun dispatchDetach(): P { val presenter = (getPresenter() as? Presenter) presenter?.let { - triggerRibActionAndEmitEvents( - it, - RibActionEmitterType.PRESENTER, - RibEventType.DETACHED, - ) { + triggerRibActionAndEmitEvents(it, RibActionEmitterType.PRESENTER, RibEventType.DETACHED) { it.dispatchUnload() } } - triggerRibActionAndEmitEvents( - this, - RibActionEmitterType.INTERACTOR, - RibEventType.DETACHED, - ) { + triggerRibActionAndEmitEvents(this, RibActionEmitterType.INTERACTOR, RibEventType.DETACHED) { willResignActive() } - _lifecycleFlow.tryEmit(InteractorEvent.INACTIVE) + mutableLifecycleFlow.tryEmit(InteractorEvent.INACTIVE) return getPresenter() } diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/LazyBackingProperty.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/LazyBackingProperty.kt index 5da67a8f1..141f1c0d0 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/LazyBackingProperty.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/LazyBackingProperty.kt @@ -32,8 +32,7 @@ import kotlin.reflect.KMutableProperty0 * To properly support concurrency, the backing mutable property should be [Volatile]. */ @CoreFriendModuleApi -public inline fun KMutableProperty0.setIfNullAndGet( - initializer: () -> T, -): T = get() ?: synchronized(Lock) { get() ?: initializer().also { set(it) } } +public inline fun KMutableProperty0.setIfNullAndGet(initializer: () -> T): T = + get() ?: synchronized(Lock) { get() ?: initializer().also { set(it) } } @CoreFriendModuleApi public object Lock diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Presenter.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Presenter.kt index da804916f..7c8d64eb1 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Presenter.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Presenter.kt @@ -39,11 +39,11 @@ public abstract class Presenter : ScopeProvider, RibActionEmitter { public open val lifecycleFlow: SharedFlow get() = _lifecycleFlow - @Volatile private var _lifecycleObservable: Observable? = null + @Volatile private var lifecycleObservableField: Observable? = null @OptIn(CoreFriendModuleApi::class) private val lifecycleObservable - get() = ::_lifecycleObservable.setIfNullAndGet { lifecycleFlow.asObservable() } + get() = ::lifecycleObservableField.setIfNullAndGet { lifecycleFlow.asObservable() } /** @return `true` if the presenter is loaded, `false` if not. */ protected var isLoaded: Boolean = false diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Rib.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Rib.kt index d59e03142..42e0c7608 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Rib.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Rib.kt @@ -59,11 +59,11 @@ public open class Rib { /** Default, internal implementation that is used when host app does not set a configuration. */ private class DefaultConfiguration : Configuration { - override fun handleNonFatalError(errorMessage: String, throwable: Throwable?) { + override fun handleNonFatalError(errorMessage: String, throwable: Throwable?): Unit = throw RuntimeException(errorMessage, throwable) - } override fun handleNonFatalWarning(warningMessage: String, throwable: Throwable?) {} + override fun handleDebugMessage(format: String, vararg args: Any?) {} } @@ -85,7 +85,7 @@ public open class Rib { throw IllegalStateException("Attempting to set a configuration after using RIB code.") } else { throw IllegalStateException( - "Attempting to set a configuration after one has previously been set.", + "Attempting to set a configuration after one has previously been set." ) } } diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibCoroutineWorker.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibCoroutineWorker.kt index 55ed2c9cc..785a053bc 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibCoroutineWorker.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibCoroutineWorker.kt @@ -16,20 +16,10 @@ package com.uber.rib.core import com.uber.autodispose.coroutinesinterop.asScopeProvider -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract -import kotlin.coroutines.ContinuationInterceptor import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext -import kotlin.coroutines.coroutineContext -import kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED -import kotlin.coroutines.intrinsics.intercepted -import kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn -import kotlin.coroutines.resume import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CompletableJob -import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Job @@ -54,7 +44,7 @@ public fun interface RibCoroutineWorker : RibActionEmitter { /** A manager or helper class bound to a [CoroutineScope] by using a binder like [bind]. */ public inline fun RibCoroutineWorker( - crossinline onStart: suspend CoroutineScope.() -> Unit, + crossinline onStart: suspend CoroutineScope.() -> Unit ): RibCoroutineWorker { /* * 'RibCoroutineWorker' is already a functional interface; the purpose of this builder is to allow consumers @@ -86,10 +76,8 @@ public sealed interface BindWorkerHandle : Job { public fun unbind(): Job } -private class BindWorkerHandleImpl( - bindJob: Job, - private val unbindJob: Job, -) : BindWorkerHandle, Job by bindJob { +private class BindWorkerHandleImpl(bindJob: Job, private val unbindJob: Job) : + BindWorkerHandle, Job by bindJob { override fun unbind(): Job { unbindJob.cancel("Worker was manually unbound.") return unbindJob @@ -122,10 +110,16 @@ public fun CoroutineScope.bind( worker: RibCoroutineWorker, context: CoroutineContext = RibDispatchers.Default, ): BindWorkerHandle { - val bindJob: CompletableJob // A job that completes once worker's onStart completes + var bindJob: CompletableJob? = null // A job that completes once worker's onStart completes val unbindJob = - launch(context, { bindJob = createBindingJob() }) { bindAndAwaitCancellation(worker, bindJob) } - return BindWorkerHandleImpl(bindJob, unbindJob) + launch(context, CoroutineStart.UNDISPATCHED) { + bindJob = createBindingJob() + // launch again -- this time, we will dispatch if installed dispatcher + // tell us to (CoroutineDispatcher.isDispatchNeeded()). + launch { bindAndAwaitCancellation(worker, bindJob) } + } + // !! is safe here -- outer coroutine was started undispatched. + return BindWorkerHandleImpl(bindJob!!, unbindJob) } /** Binds [workers] in a scope that is a child of the [CoroutineScope] receiver. */ @@ -139,46 +133,6 @@ public fun CoroutineScope.bind( } } -/** - * Guarantees to run synchronous [init] block exactly once in an undispatched manner. - * - * **Exceptions thrown in [init] block will be rethrown at call site.** - */ -@OptIn(ExperimentalContracts::class) -private fun CoroutineScope.launch( - context: CoroutineContext = EmptyCoroutineContext, - init: CoroutineScope.() -> Unit = {}, - block: suspend CoroutineScope.() -> Unit, -): Job { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - callsInPlace(block, InvocationKind.AT_MOST_ONCE) - } - var initError: Throwable? = null - val job = - launch(context, CoroutineStart.UNDISPATCHED) { - runCatching(init).onFailure { initError = it }.getOrThrow() - dispatchIfNeeded() - block() - } - initError?.let { throw it } - return job -} - -private suspend inline fun dispatchIfNeeded() { - suspendCoroutineUninterceptedOrReturn sc@{ cont -> - val context = cont.context - val dispatcher = context[ContinuationInterceptor] as CoroutineDispatcher - if (!dispatcher.isDispatchNeeded(context)) return@sc Unit - // Coroutine was not in the right context -- we'll dispatch. - context.ensureActive() - cont.intercepted().resume(Unit) - COROUTINE_SUSPENDED - } - // Don't continue if coroutine was cancelled after returning from dispatch. - coroutineContext.ensureActive() -} - private fun CoroutineScope.createBindingJob(): CompletableJob = Job(coroutineContext.job).also { // Cancel `unbindJob` if `bindJob` has cancelled. This is important to abort `onStart` if @@ -236,12 +190,11 @@ public fun Worker.asRibCoroutineWorker(): RibCoroutineWorker = */ @JvmOverloads public fun RibCoroutineWorker.asWorker( - coroutineContext: CoroutineContext = RibDispatchers.Default, + coroutineContext: CoroutineContext = RibDispatchers.Default ): Worker = this as? Worker ?: RibCoroutineWorkerToWorkerAdapter(this, coroutineContext) -internal open class WorkerToRibCoroutineWorkerAdapter( - private val worker: Worker, -) : RibCoroutineWorker { +internal open class WorkerToRibCoroutineWorkerAdapter(private val worker: Worker) : + RibCoroutineWorker { override suspend fun onStart(scope: CoroutineScope) { withContext(worker.coroutineContext ?: EmptyCoroutineContext) { worker.onStart(scope.asWorkerScopeProvider()) diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibEvents.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibEvents.kt index 6965b45b4..194e472ec 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibEvents.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibEvents.kt @@ -55,9 +55,7 @@ public object RibEvents { } @JvmStatic - public val routerEvents: Observable by lazy { - mutableRouterEvents.asObservable() - } + public val routerEvents: Observable by lazy { mutableRouterEvents.asObservable() } @JvmStatic public val ribActionEventsFlow: SharedFlow by lazy { diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibRefWatcher.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibRefWatcher.kt index 8ed91004a..2676b065c 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibRefWatcher.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/RibRefWatcher.kt @@ -133,6 +133,7 @@ public open class RibRefWatcher { @JvmStatic public var isLeakCanaryEnabled: Boolean = false private set + private var uLeakEnabled = false private var breadcrumbsEnabled = false } diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt index 948d2441c..807a2e063 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt @@ -44,6 +44,7 @@ protected constructor( @CoreFriendModuleApi public var tag: String? = null private set + private var savedInstanceState: Bundle? = null private var isLoaded = false @@ -51,8 +52,9 @@ protected constructor( interactor: I, component: InteractorBaseComponent<*>?, ) : this(component, interactor, RibRefWatcher.getInstance(), getMainThread()) + protected constructor( - interactor: I, + interactor: I ) : this(null, interactor, RibRefWatcher.getInstance(), getMainThread()) @Suppress("UNCHECKED_CAST") @@ -109,21 +111,13 @@ protected constructor( if (tag == child.tag) { Rib.getConfiguration() .handleNonFatalWarning( - String.format( - Locale.getDefault(), - "There is already a child router with tag: %s", - tag, - ), + String.format(Locale.getDefault(), "There is already a child router with tag: %s", tag), null, ) } } - triggerRibActionAndEmitEvents( - childRouter, - RibActionEmitterType.ROUTER, - RibEventType.ATTACHED, - ) { + triggerRibActionAndEmitEvents(childRouter, RibActionEmitterType.ROUTER, RibEventType.ATTACHED) { children.add(childRouter) } @@ -172,11 +166,7 @@ protected constructor( } } - triggerRibActionAndEmitEvents( - childRouter, - RibActionEmitterType.ROUTER, - RibEventType.DETACHED, - ) { + triggerRibActionAndEmitEvents(childRouter, RibActionEmitterType.ROUTER, RibEventType.DETACHED) { childRouter.dispatchDetach() } @@ -224,10 +214,7 @@ protected constructor( * * @return Children. */ - @CoreFriendModuleApi - public open fun getChildren(): List> { - return children - } + @CoreFriendModuleApi public open fun getChildren(): List> = children @CoreFriendModuleApi public fun saveInstanceStateInternal(outState: Bundle) { @@ -262,13 +249,12 @@ protected constructor( @JvmField @VisibleForTesting public val KEY_INTERACTOR: String = "Router.interactor" @JvmStatic - public fun getMainThread(): Thread { - return try { + public fun getMainThread(): Thread = + try { Looper.getMainLooper().thread } catch (e: Exception) { Thread.currentThread() } - } } init { diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/WorkerBinder.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/WorkerBinder.kt index 7373c3de1..88e21946b 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/WorkerBinder.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/WorkerBinder.kt @@ -63,14 +63,8 @@ public object WorkerBinder { * @return [WorkerUnbinder] to unbind [Worker]'s lifecycle. */ @JvmStatic - public fun bind( - interactor: Interactor<*, *>, - worker: Worker, - ): WorkerUnbinder = - worker.bind( - interactor.lifecycleFlow, - Interactor.lifecycleRange, - ) + public fun bind(interactor: Interactor<*, *>, worker: Worker): WorkerUnbinder = + worker.bind(interactor.lifecycleFlow, Interactor.lifecycleRange) /** * Bind a list of workers (ie. a manager or any other class that needs an interactor's lifecycle) @@ -81,10 +75,7 @@ public object WorkerBinder { * @param workers A list of classes that want to be informed when to start and stop doing work. */ @JvmStatic - public fun bind( - interactor: Interactor<*, *>, - workers: List, - ) { + public fun bind(interactor: Interactor<*, *>, workers: List) { bind(interactor, workers as Iterable) } @@ -97,10 +88,7 @@ public object WorkerBinder { * @param workers A list of classes that want to be informed when to start and stop doing work. */ @JvmStatic - public fun bind( - interactor: Interactor<*, *>, - workers: Iterable, - ) { + public fun bind(interactor: Interactor<*, *>, workers: Iterable) { for (interactorWorker in workers) { bind(interactor, interactorWorker) } @@ -115,14 +103,8 @@ public object WorkerBinder { * @return [WorkerUnbinder] to unbind [Worker]'s lifecycle. */ @JvmStatic - public fun bind( - presenter: Presenter, - worker: Worker, - ): WorkerUnbinder = - worker.bind( - presenter.lifecycleFlow, - Presenter.lifecycleRange, - ) + public fun bind(presenter: Presenter, worker: Worker): WorkerUnbinder = + worker.bind(presenter.lifecycleFlow, Presenter.lifecycleRange) /** * Bind a list of workers (ie. a manager or any other class that needs an presenter's lifecycle) @@ -133,10 +115,7 @@ public object WorkerBinder { * @param workers A list of classes that want to be informed when to start and stop doing work. */ @JvmStatic - public fun bind( - presenter: Presenter, - workers: List, - ) { + public fun bind(presenter: Presenter, workers: List) { bind(presenter, workers as Iterable) } @@ -149,10 +128,7 @@ public object WorkerBinder { * @param workers A list of classes that want to be informed when to start and stop doing work. */ @JvmStatic - public fun bind( - presenter: Presenter, - workers: Iterable, - ) { + public fun bind(presenter: Presenter, workers: Iterable) { for (worker in workers) { bind(presenter, worker) } @@ -181,7 +157,7 @@ public object WorkerBinder { @JvmStatic public fun mapInteractorLifecycleToWorker( - interactorEventObservable: Observable, + interactorEventObservable: Observable ): Observable { return interactorEventObservable.map { interactorEvent: InteractorEvent -> when (interactorEvent) { @@ -193,7 +169,7 @@ public object WorkerBinder { @JvmStatic public fun mapPresenterLifecycleToWorker( - presenterEventObservable: Observable, + presenterEventObservable: Observable ): Observable { return presenterEventObservable.map { presenterEvent: PresenterEvent -> when (presenterEvent) { @@ -213,12 +189,9 @@ public object WorkerBinder { @JvmStatic @Deprecated( """this method uses {@code LifecycleScopeProvider} for purposes other than - AutoDispose. Usage is strongly discouraged as this method may be removed in the future.""", + AutoDispose. Usage is strongly discouraged as this method may be removed in the future.""" ) - public fun bindTo( - lifecycle: LifecycleScopeProvider, - worker: Worker, - ) { + public fun bindTo(lifecycle: LifecycleScopeProvider, worker: Worker) { bind(mapInteractorLifecycleToWorker(lifecycle.lifecycle()), worker) } @@ -238,10 +211,7 @@ public object WorkerBinder { """, replaceWith = ReplaceWith("bind(workerLifecycle, worker)"), ) - public fun bindToWorkerLifecycle( - workerLifecycle: Observable, - worker: Worker, - ) { + public fun bindToWorkerLifecycle(workerLifecycle: Observable, worker: Worker) { workerLifecycle.subscribe { workerEvent: WorkerEvent -> when (workerEvent) { WorkerEvent.START -> worker.onStart(WorkerScopeProvider(workerLifecycle.hide())) @@ -268,11 +238,7 @@ private fun > Worker.bind( lifecycleRange: ClosedRange, ): WorkerUnbinder { val dispatcherAtBinder = RibCoroutinesConfig.deprecatedWorkerDispatcher - val coroutineContext = - getJobCoroutineContext( - dispatcherAtBinder, - worker = this, - ) + val coroutineContext = getJobCoroutineContext(dispatcherAtBinder, worker = this) val coroutineStart = if (coroutineContext == RibDispatchers.Unconfined) { CoroutineStart.UNDISPATCHED @@ -293,10 +259,7 @@ private fun > Worker.bind( */ @OptIn(DelicateCoroutinesApi::class) val job = - GlobalScope.launch( - coroutineContext, - start = coroutineStart, - ) { + GlobalScope.launch(coroutineContext, start = coroutineStart) { lifecycle .takeWhile { it < lifecycleRange.endInclusive } .onCompletion { diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/WorkerUnbinder.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/WorkerUnbinder.kt index dec0a46c7..3defdd3a8 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/WorkerUnbinder.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/WorkerUnbinder.kt @@ -23,7 +23,7 @@ package com.uber.rib.core message = """ com.uber.rib.core.Worker is deprecated in favor of com.uber.rib.core.RibCoroutineWorker - """, + """ ) public fun interface WorkerUnbinder { /** Unbind from bound lifecycle and end worker's lifecycle. */ diff --git a/android/libraries/rib-base/src/test/kotlin/android/os/Bundle.kt b/android/libraries/rib-base/src/test/kotlin/android/os/Bundle.kt index c6e32bcd4..e0e089423 100644 --- a/android/libraries/rib-base/src/test/kotlin/android/os/Bundle.kt +++ b/android/libraries/rib-base/src/test/kotlin/android/os/Bundle.kt @@ -19,13 +19,9 @@ package android.os class Bundle : Parcelable { private val testData: MutableMap = mutableMapOf() - fun getString(key: String): String? { - return testData[key] as String? - } + fun getString(key: String): String? = testData[key] as String? - fun getParcelable(key: String): T? { - return testData[key] as T? - } + fun getParcelable(key: String): T? = testData[key] as T? fun putParcelable(key: String, value: Parcelable) { testData[key] = value diff --git a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/InteractorAndRouterTest.kt b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/InteractorAndRouterTest.kt index a23c365d2..1bc143fbe 100644 --- a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/InteractorAndRouterTest.kt +++ b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/InteractorAndRouterTest.kt @@ -138,9 +138,8 @@ class InteractorAndRouterTest { val component: InteractorComponent = object : InteractorComponent { override fun inject(interactor: TestInteractorA) {} - override fun presenter(): TestPresenter { - return TestPresenter() - } + + override fun presenter(): TestPresenter = TestPresenter() } val router = TestRouterA(parentInteractor, component) val parentObserver = RecordingObserver() @@ -151,9 +150,8 @@ class InteractorAndRouterTest { val childComponent: InteractorComponent = object : InteractorComponent { override fun inject(interactor: TestChildInteractor) {} - override fun presenter(): TestPresenter { - return TestPresenter() - } + + override fun presenter(): TestPresenter = TestPresenter() } val childRouter = TestChildRouter(childA, childComponent) val childObserverA = RecordingObserver() @@ -178,9 +176,8 @@ class InteractorAndRouterTest { val component: InteractorComponent = object : InteractorComponent { override fun inject(interactor: TestInteractorB) {} - override fun presenter(): TestPresenter { - return TestPresenter() - } + + override fun presenter(): TestPresenter = TestPresenter() } val router = TestRouterB(component, rootInteractor, ribRefWatcher) router.dispatchAttach(null) @@ -201,9 +198,8 @@ class InteractorAndRouterTest { val component: InteractorComponent = object : InteractorComponent { override fun inject(interactor: TestInteractorB) {} - override fun presenter(): TestPresenter { - return TestPresenter() - } + + override fun presenter(): TestPresenter = TestPresenter() } val rootRouter = TestRouterB(component, TestInteractorB(), ribRefWatcher) val child = addTwoNestedChildInteractors() @@ -220,9 +216,8 @@ class InteractorAndRouterTest { val component: InteractorComponent = object : InteractorComponent { override fun inject(interactor: TestInteractorB) {} - override fun presenter(): TestPresenter { - return TestPresenter() - } + + override fun presenter(): TestPresenter = TestPresenter() } router.dispatchAttach(null) val childRouter1 = TestRouterB(component, TestInteractorB(), ribRefWatcher) @@ -235,6 +230,7 @@ class InteractorAndRouterTest { private class TestInteractor(private val mChildInteractor: Interactor<*, *>) : Interactor>() { val mockedWorker: Worker = mock() + override fun didBecomeActive(savedInstanceState: Bundle?) { super.didBecomeActive(savedInstanceState) val router: Router<*> = FakeRouter(mChildInteractor, getInstance(), Thread.currentThread()) @@ -264,6 +260,7 @@ class InteractorAndRouterTest { component: InteractorComponent, ) : Router(component, interactor, getInstance(), Thread.currentThread()) { private var savedInstanceState: Bundle? = null + override fun dispatchAttach(savedInstanceState: Bundle?, tag: String) { super.dispatchAttach(savedInstanceState, tag) this.savedInstanceState = savedInstanceState @@ -275,7 +272,9 @@ class InteractorAndRouterTest { } private class TestInteractorA : Interactor>() + private class TestInteractorB : Interactor>() + private class TestRouterB : Router { constructor( interactor: TestInteractorB, @@ -294,6 +293,7 @@ class InteractorAndRouterTest { } private class TestChildInteractor : Interactor>() + private class TestChildRouter( interactor: TestChildInteractor, component: InteractorComponent, diff --git a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/LazyBackingPropertyTest.kt b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/LazyBackingPropertyTest.kt index d0846d365..935b72dcf 100644 --- a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/LazyBackingPropertyTest.kt +++ b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/LazyBackingPropertyTest.kt @@ -18,6 +18,7 @@ package com.uber.rib.core import com.google.common.truth.Truth.assertThat import com.uber.rib.core.internal.CoreFriendModuleApi import io.reactivex.Observable +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.produce import kotlinx.coroutines.channels.toList import kotlinx.coroutines.launch @@ -26,12 +27,13 @@ import org.junit.Test import org.mockito.kotlin.mock class LazyBackingPropertyTest { - @Volatile private var _expensiveObject: ExpensiveObject? = null + @Volatile private var expensiveObjectField: ExpensiveObject? = null @OptIn(CoreFriendModuleApi::class) private val expensiveObject - get() = ::_expensiveObject.setIfNullAndGet { ExpensiveObject() } + get() = ::expensiveObjectField.setIfNullAndGet { ExpensiveObject() } + @OptIn(ExperimentalCoroutinesApi::class) @Test fun `Stress test fetching a LazyBackingProperty from multiple concurrent coroutines`() = runTest { val set = diff --git a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RibCoroutineWorkerTest.kt b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RibCoroutineWorkerTest.kt index 32acd1267..e19828948 100644 --- a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RibCoroutineWorkerTest.kt +++ b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RibCoroutineWorkerTest.kt @@ -208,15 +208,18 @@ class RibCoroutineWorkerTest { val router = mock>() val interactor = object : Interactor>() {} val subject = PublishSubject.create() + var started = false var disposed = false - val ribCoroutineWorker = RibCoroutineWorker { - subject.doOnDispose { disposed = true }.autoDispose(this).subscribe() + val ribCoroutineWorker = RibCoroutineWorker { scope -> + started = true + subject.doOnDispose { disposed = true }.autoDispose(scope).subscribe() } val worker = ribCoroutineWorker.asWorker() InteractorHelper.attach(interactor, Any(), router, null) val unbinder = WorkerBinder.bind(interactor, worker) runCurrent() subject.onNext(Unit) + assertThat(started).isTrue() assertThat(disposed).isFalse() unbinder.unbind() runCurrent() @@ -333,15 +336,15 @@ private class TestWorker : RibCoroutineWorker { var innerCoroutineIdle = false var innerCoroutineCompleted = false - private var _doOnStart: suspend () -> Unit = {} - private var _doOnStop: () -> Unit = {} + private var doOnStartField: suspend () -> Unit = {} + private var doOnStopField: () -> Unit = {} fun doOnStart(block: suspend () -> Unit) { - _doOnStart = block + doOnStartField = block } fun doOnStop(block: () -> Unit) { - _doOnStop = block + doOnStopField = block } override suspend fun onStart(scope: CoroutineScope) { @@ -359,7 +362,7 @@ private class TestWorker : RibCoroutineWorker { } } delay(ON_START_DELAY_DURATION_MILLIS) - _doOnStart() + doOnStartField() } finally { onStartFinished = true } @@ -369,7 +372,7 @@ private class TestWorker : RibCoroutineWorker { onStopThread = Thread.currentThread() onStopCause = cause try { - _doOnStop() + doOnStopField() } finally { onStopRan = true } @@ -390,9 +393,11 @@ private class WorkerAndRibCoroutineWorker( ) : Worker, RibCoroutineWorker { // Worker impl override fun onStart(lifecycle: WorkerScopeProvider) = workerOnStart(lifecycle) + override fun onStop() = workerOnStop() // RibCoroutineWorker impl override suspend fun onStart(scope: CoroutineScope) = ribCoroutineWorkerOnStart(scope) + override fun onStop(cause: Throwable) = ribCoroutineWorkerOnStop(cause) } diff --git a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RibEventsTest.kt b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RibEventsTest.kt index 4f1ec0101..0fccd57c0 100644 --- a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RibEventsTest.kt +++ b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RibEventsTest.kt @@ -17,18 +17,33 @@ package com.uber.rib.core import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.launch import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest +import org.junit.After +import org.junit.Before +import org.junit.Ignore import org.junit.Test import org.mockito.kotlin.mock @OptIn(ExperimentalCoroutinesApi::class) +@Ignore class RibEventsTest { + private val extraBufferCapacity = 16 + + @Before + fun setUp() { + RibEvents.setExtraBufferCapacity(extraBufferCapacity) + } + + @After + fun tearDown() { + RibEvents.setExtraBufferCapacity(Channel.UNLIMITED) + } + @Test fun setExtraBufferCapacityTest() = runTest { - val extraBufferCapacity = 16 - RibEvents.setExtraBufferCapacity(extraBufferCapacity) val results = mutableListOf() backgroundScope.launch { RibEvents.routerEventsFlow.collect(results::add) } runCurrent() diff --git a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RouterTest.kt b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RouterTest.kt index 4a7e650a6..7afd1a274 100644 --- a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RouterTest.kt +++ b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/RouterTest.kt @@ -31,12 +31,7 @@ class RouterTest { val didLoad = AtomicBoolean(false) val router: Router<*> = object : - Router>( - component, - interactor, - ribRefWatcher, - Thread.currentThread(), - ) { + Router>(component, interactor, ribRefWatcher, Thread.currentThread()) { override fun attachToInteractor() { // ignore the Interactor since we're only testing the Router } diff --git a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/WorkerBinderTest.kt b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/WorkerBinderTest.kt index a75f0983c..0968e58df 100644 --- a/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/WorkerBinderTest.kt +++ b/android/libraries/rib-base/src/test/kotlin/com/uber/rib/core/WorkerBinderTest.kt @@ -253,7 +253,7 @@ class WorkerBinderTest(private val adaptFromRibCoroutineWorker: Boolean) { } } -private fun Worker(onStartBlock: (WorkerScopeProvider) -> Unit) = +private fun Worker(onStartBlock: (WorkerScopeProvider) -> Unit): Worker = object : Worker { override fun onStart(lifecycle: WorkerScopeProvider) { onStartBlock(lifecycle) diff --git a/android/libraries/rib-compiler-app/build.gradle b/android/libraries/rib-compiler-app/build.gradle.kts similarity index 76% rename from android/libraries/rib-compiler-app/build.gradle rename to android/libraries/rib-compiler-app/build.gradle.kts index 6da04f79a..eeccdaae2 100644 --- a/android/libraries/rib-compiler-app/build.gradle +++ b/android/libraries/rib-compiler-app/build.gradle.kts @@ -16,7 +16,7 @@ plugins { id("ribs.kotlin-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } dependencies { @@ -30,12 +30,16 @@ dependencies { compileOnly(libs.autoservice) compileOnly(libs.android.api) - testImplementation(testLibs.compileTesting) + testImplementation(testLibs.compile.testing) } // https://code.google.com/p/android/issues/detail?id=64887 -task copyTestResources(type: Copy) { - from "${projectDir}/src/test/resources" - into "${buildDir}/classes/test" +tasks { + register("copyTestResources") { + from("${projectDir}/src/test/resources") + into("${buildDir}/classes/test") + } + processTestResources { + dependsOn("copyTestResources") + } } -processTestResources.dependsOn copyTestResources diff --git a/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/AnnotatedClass.kt b/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/AnnotatedClass.kt index 75e863d2f..279aa8e12 100644 --- a/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/AnnotatedClass.kt +++ b/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/AnnotatedClass.kt @@ -20,7 +20,7 @@ import javax.lang.model.element.TypeElement /** Information to a class. */ public abstract class AnnotatedClass( /** @return the type element that this wraps. */ - public open val typeElement: TypeElement, + public open val typeElement: TypeElement ) { /** diff --git a/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/InteractorAnnotationVerifier.kt b/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/InteractorAnnotationVerifier.kt index 78ef3d961..0451b42a0 100644 --- a/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/InteractorAnnotationVerifier.kt +++ b/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/InteractorAnnotationVerifier.kt @@ -75,14 +75,13 @@ internal open class InteractorAnnotationVerifier( * @param type * @return if given type element is valid. */ - private fun validateInteractorSuffix(type: TypeElement): Boolean { - return if (!type.simpleName.toString().endsWith(Constants.INTERACTOR_SUFFIX)) { + private fun validateInteractorSuffix(type: TypeElement): Boolean = + if (!type.simpleName.toString().endsWith(Constants.INTERACTOR_SUFFIX)) { errorReporter.reportError("$type does not end in Interactor.") false } else { true } - } /** * Validate if current class is a subclass of Interactor. diff --git a/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/RibInteractorProcessorPipeline.kt b/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/RibInteractorProcessorPipeline.kt index cfe5fcb63..8d43e315c 100644 --- a/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/RibInteractorProcessorPipeline.kt +++ b/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/RibInteractorProcessorPipeline.kt @@ -23,9 +23,10 @@ import javax.lang.model.element.TypeElement /** The processor pipeline for [RibInteractor] */ public open class RibInteractorProcessorPipeline( processContext: ProcessContext, - private var interactorGenerator: Generator?, + private val interactorGenerator: Generator?, ) : TypeProcessorPipeline(processContext) { - private val annotationVerifier: AnnotationVerifier + private val annotationVerifier: AnnotationVerifier = + InteractorAnnotationVerifier(errorReporter!!, elementUtils!!, typesUtils!!) private val builderAnnotatedClassesList: MutableList = ArrayList() /** @return the annotation type this processor pipeline deals with. */ @@ -71,15 +72,4 @@ public open class RibInteractorProcessorPipeline( public companion object { @JvmField public val SUPPORT_ANNOTATION_TYPE: Class = RibInteractor::class.java } - - /** - * Constructor. - * - * @param processContext the [ProcessContext]. - * @param interactorGenerator the code generator. - */ - init { - annotationVerifier = InteractorAnnotationVerifier(errorReporter!!, elementUtils!!, typesUtils!!) - this.interactorGenerator = interactorGenerator - } } diff --git a/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/RibProcessor.kt b/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/RibProcessor.kt index 674ff1d17..67b12290d 100644 --- a/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/RibProcessor.kt +++ b/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/RibProcessor.kt @@ -29,8 +29,10 @@ public abstract class RibProcessor : AbstractProcessor(), ProcessContext { override var errorReporter: ErrorReporter? = null protected set + override var elementUtils: Elements? = null protected set + override var typesUtils: Types? = null protected set @@ -45,9 +47,7 @@ public abstract class RibProcessor : AbstractProcessor(), ProcessContext { processorPipelines.addAll(getProcessorPipelines(this)) } - override fun getSupportedSourceVersion(): SourceVersion { - return SourceVersion.latestSupported() - } + override fun getSupportedSourceVersion(): SourceVersion = SourceVersion.latestSupported() override fun process(annotations: Set, roundEnv: RoundEnvironment): Boolean { if (roundEnv.processingOver()) { @@ -58,7 +58,7 @@ public abstract class RibProcessor : AbstractProcessor(), ProcessContext { processorPipeline.process(annotations, roundEnv) } catch (e: Throwable) { errorReporter?.reportError( - "Fatal error running ${processorPipeline.annotationType.simpleName} processor: ${e.message}", + "Fatal error running ${processorPipeline.annotationType.simpleName} processor: ${e.message}" ) } } @@ -72,6 +72,6 @@ public abstract class RibProcessor : AbstractProcessor(), ProcessContext { * @return the list of processor pipelines. */ protected abstract fun getProcessorPipelines( - processContext: ProcessContext, + processContext: ProcessContext ): List } diff --git a/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/TypeProcessorPipeline.kt b/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/TypeProcessorPipeline.kt index 23016cd0c..63491c148 100644 --- a/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/TypeProcessorPipeline.kt +++ b/android/libraries/rib-compiler-app/src/main/kotlin/com/uber/rib/compiler/TypeProcessorPipeline.kt @@ -21,9 +21,8 @@ import javax.lang.model.element.Element import javax.lang.model.element.TypeElement /** Base ProcessorPipeline that parses the annotated elements as type element. */ -public abstract class TypeProcessorPipeline( - processContext: ProcessContext, -) : ProcessorPipeline(processContext) { +public abstract class TypeProcessorPipeline(processContext: ProcessContext) : + ProcessorPipeline(processContext) { /** * Process the annotations. * diff --git a/android/libraries/rib-compiler-app/src/test/kotlin/com/uber/rib/compiler/InteractorAnnotationVerifierTest.kt b/android/libraries/rib-compiler-app/src/test/kotlin/com/uber/rib/compiler/InteractorAnnotationVerifierTest.kt index e82d6a0d4..94f426949 100644 --- a/android/libraries/rib-compiler-app/src/test/kotlin/com/uber/rib/compiler/InteractorAnnotationVerifierTest.kt +++ b/android/libraries/rib-compiler-app/src/test/kotlin/com/uber/rib/compiler/InteractorAnnotationVerifierTest.kt @@ -43,7 +43,7 @@ class InteractorAnnotationVerifierTest : InteractorProcessorTestBase() { fun verify_whenTypeElementIsNotInteractor_shouldWriteErrorMessage() { addResourceToSources("fixtures/AnnotatedNonInteractor.java") assertFailsWithError( - "test.AnnotatedNonInteractor is annotated with @RibInteractor but is not an Interactor subclass", + "test.AnnotatedNonInteractor is annotated with @RibInteractor but is not an Interactor subclass" ) } diff --git a/android/libraries/rib-compiler-app/src/test/kotlin/com/uber/rib/compiler/InteractorProcessorTestBase.kt b/android/libraries/rib-compiler-app/src/test/kotlin/com/uber/rib/compiler/InteractorProcessorTestBase.kt index d3a9967bd..5abc3eca6 100644 --- a/android/libraries/rib-compiler-app/src/test/kotlin/com/uber/rib/compiler/InteractorProcessorTestBase.kt +++ b/android/libraries/rib-compiler-app/src/test/kotlin/com/uber/rib/compiler/InteractorProcessorTestBase.kt @@ -30,18 +30,11 @@ abstract class InteractorProcessorTestBase { ribProcessor = object : RibProcessor() { override fun getProcessorPipelines( - processContext: ProcessContext, - ): List { - return listOf( - RibInteractorProcessorPipeline(processContext, null), - ) - } + processContext: ProcessContext + ): List = listOf(RibInteractorProcessorPipeline(processContext, null)) - override fun getSupportedAnnotationTypes(): Set { - return ImmutableSet.of( - RibInteractorProcessorPipeline.SUPPORT_ANNOTATION_TYPE.canonicalName, - ) - } + override fun getSupportedAnnotationTypes(): Set = + ImmutableSet.of(RibInteractorProcessorPipeline.SUPPORT_ANNOTATION_TYPE.canonicalName) } sources = ArrayList() } diff --git a/android/libraries/rib-compiler-test/build.gradle b/android/libraries/rib-compiler-test/build.gradle deleted file mode 100644 index c9bf2dbd1..000000000 --- a/android/libraries/rib-compiler-test/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -import org.gradle.internal.jvm.Jvm - -/* - * Copyright (C) 2017. Uber Technologies - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("ribs.kotlin-library-conventions") - alias(libs.plugins.kotlinKapt) - alias(libs.plugins.mavenPublish) -} - -dependencies { - api(project(":libraries:rib-compiler-app")) - implementation(libs.javapoet) - - compileOnly(libs.annotation) - compileOnly(libs.autoservice) - compileOnly(libs.android.api) - kapt(libs.autoservice) - - testImplementation(libs.annotation) - testImplementation(testLibs.compileTesting) - testImplementation files("libs/tools.jar") -} - -// https://code.google.com/p/android/issues/detail?id=64887 -task copyTestResources(type: Copy) { - from "${projectDir}/src/test/resources" - into "${buildDir}/classes/test" -} -processTestResources.dependsOn copyTestResources diff --git a/android/libraries/rib-compiler-test/build.gradle.kts b/android/libraries/rib-compiler-test/build.gradle.kts new file mode 100644 index 000000000..1fc6eec69 --- /dev/null +++ b/android/libraries/rib-compiler-test/build.gradle.kts @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2017. Uber Technologies + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id("ribs.kotlin-library-conventions") + alias(libs.plugins.kotlin.symbol.processor) + alias(libs.plugins.maven.publish) +} + +kotlin { + jvmToolchain { + languageVersion = JavaLanguageVersion.of(17) + vendor = JvmVendorSpec.AZUL + } +} + +//tasks.withType().configureEach { +// // Same configuration as above +// javaLauncher = javaToolchains.launcherFor { +// languageVersion = JavaLanguageVersion.of(11) +// vendor = JvmVendorSpec.AZUL +// } +//} + +//tasks.test { +// javaExecutable = launcher.map { it.executablePath } +// +// jvmToolchain(11) +//} + +dependencies { + api(project(":libraries:rib-compiler-app")) + implementation(libs.javapoet) + + compileOnly(libs.annotation) + compileOnly(libs.autoservice) + compileOnly(libs.android.api) + ksp(libs.autoservice.ksp) + + testImplementation(libs.annotation) + testImplementation(testLibs.compile.testing) + testImplementation(files("libs/tools.jar")) +} + +// https://code.google.com/p/android/issues/detail?id=64887 +tasks { + register("copyTestResources") { + from("${projectDir}/src/test/resources") + into("${buildDir}/classes/test") + } + processTestResources { + dependsOn("copyTestResources") + } + test { + // See: https://github.com/google/compile-testing/issues/222 + jvmArgs("--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED") + jvmArgs("--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED") + jvmArgs("--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED") + } +} diff --git a/android/libraries/rib-compiler-test/src/main/kotlin/com/uber/rib/compiler/RibTestProcessor.kt b/android/libraries/rib-compiler-test/src/main/kotlin/com/uber/rib/compiler/RibTestProcessor.kt index e982f7c86..05942e8c0 100644 --- a/android/libraries/rib-compiler-test/src/main/kotlin/com/uber/rib/compiler/RibTestProcessor.kt +++ b/android/libraries/rib-compiler-test/src/main/kotlin/com/uber/rib/compiler/RibTestProcessor.kt @@ -33,13 +33,11 @@ public open class RibTestProcessor : RibProcessor() { super.init(processingEnv) } - override fun getSupportedAnnotationTypes(): Set { - return ImmutableSet.of(RibInteractorProcessorPipeline.SUPPORT_ANNOTATION_TYPE.canonicalName) - } + override fun getSupportedAnnotationTypes(): Set = + ImmutableSet.of(RibInteractorProcessorPipeline.SUPPORT_ANNOTATION_TYPE.canonicalName) - override fun getProcessorPipelines(processContext: ProcessContext): List { - return ImmutableList.of( - RibInteractorProcessorPipeline(processContext, interactorTestGenerator), + override fun getProcessorPipelines(processContext: ProcessContext): List = + ImmutableList.of( + RibInteractorProcessorPipeline(processContext, interactorTestGenerator) ) - } } diff --git a/android/libraries/rib-compiler-test/src/test/kotlin/com/uber/rib/compiler/InteractorTestGeneratorProcessorTestBase.kt b/android/libraries/rib-compiler-test/src/test/kotlin/com/uber/rib/compiler/InteractorTestGeneratorProcessorTestBase.kt index 78ca5f81c..3bb328b69 100644 --- a/android/libraries/rib-compiler-test/src/test/kotlin/com/uber/rib/compiler/InteractorTestGeneratorProcessorTestBase.kt +++ b/android/libraries/rib-compiler-test/src/test/kotlin/com/uber/rib/compiler/InteractorTestGeneratorProcessorTestBase.kt @@ -40,18 +40,12 @@ abstract class InteractorTestGeneratorProcessorTestBase { } override fun getProcessorPipelines( - processContext: ProcessContext, - ): List { - return listOf( - RibInteractorProcessorPipeline(processContext, interactorTestGenerator), - ) - } + processContext: ProcessContext + ): List = + listOf(RibInteractorProcessorPipeline(processContext, interactorTestGenerator)) - override fun getSupportedAnnotationTypes(): Set { - return ImmutableSet.of( - RibInteractorProcessorPipeline.SUPPORT_ANNOTATION_TYPE.canonicalName, - ) - } + override fun getSupportedAnnotationTypes(): Set = + ImmutableSet.of(RibInteractorProcessorPipeline.SUPPORT_ANNOTATION_TYPE.canonicalName) } sources = ArrayList() } @@ -60,7 +54,5 @@ abstract class InteractorTestGeneratorProcessorTestBase { sources.add(getResourceFile(file)) } - protected fun getResourceFile(file: String): JavaFileObject { - return JavaFileObjects.forResource(file) - } + protected fun getResourceFile(file: String): JavaFileObject = JavaFileObjects.forResource(file) } diff --git a/android/libraries/rib-coroutines-test/build.gradle.kts b/android/libraries/rib-coroutines-test/build.gradle.kts index fae9d4842..755d3aa9f 100644 --- a/android/libraries/rib-coroutines-test/build.gradle.kts +++ b/android/libraries/rib-coroutines-test/build.gradle.kts @@ -16,7 +16,7 @@ plugins { id("ribs.kotlin-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } kotlin { @@ -39,8 +39,7 @@ dependencies { testImplementation(project(":libraries:rib-base")) testImplementation(project(":libraries:rib-test")) testImplementation(testLibs.junit) - testImplementation(testLibs.mockito) - testImplementation(testLibs.mockitoKotlin) + testImplementation(testLibs.mockito.kotlin) testImplementation(testLibs.truth) testImplementation(testLibs.coroutines.test) testImplementation(libs.coroutines.android) diff --git a/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/RibCoroutinesRule.kt b/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/RibCoroutinesRule.kt index af0671684..55945223b 100644 --- a/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/RibCoroutinesRule.kt +++ b/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/RibCoroutinesRule.kt @@ -24,10 +24,11 @@ import org.junit.runner.Description * facilitate install and cleanup of Test Dispatchers */ public class RibCoroutinesRule( - public val ribDispatchers: TestRibDispatchers = TestRibDispatchers(), + public val ribDispatchers: TestRibDispatchers = TestRibDispatchers() ) : TestWatcher() { private var originalDeprecatedWorkerDispatcher: CoroutineDispatcher? = null + override fun starting(description: Description) { ribDispatchers.installTestDispatchers() originalDeprecatedWorkerDispatcher = RibCoroutinesConfig.deprecatedWorkerDispatcher diff --git a/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/TestRibCoroutineScopes.kt b/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/TestRibCoroutineScopes.kt index c0b79485b..2af5d2ec6 100644 --- a/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/TestRibCoroutineScopes.kt +++ b/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/TestRibCoroutineScopes.kt @@ -39,7 +39,7 @@ public val ScopeProvider.testScopeOverride: TestScope? * testing. Accessible directly as [TestScope] via [ScopeProvider.TestScopeOverride]. */ public fun ScopeProvider.enableTestScopeOverride( - context: CoroutineContext = SupervisorJob(), + context: CoroutineContext = SupervisorJob() ): Unit = synchronized(LazyCoroutineScope) { LazyCoroutineScope[this] = asTestScope(context) } /** Disables the [ScopeProvider.coroutineScope] override with [TestScope] */ @@ -67,9 +67,8 @@ public fun Application.disableTestScopeOverride(): Unit = synchronized(LazyCoroutineScope) { LazyCoroutineScope[this] = null } /** Returns a new [TestScope] from the [ScopeProvider] */ -public fun ScopeProvider.asTestScope(context: CoroutineContext = SupervisorJob()): TestScope { - return requestScope().asTestScope(context) -} +public fun ScopeProvider.asTestScope(context: CoroutineContext = SupervisorJob()): TestScope = + requestScope().asTestScope(context) /** Returns a new [TestScope] from the [CompletableSource] */ public fun CompletableSource.asTestScope(context: CoroutineContext = SupervisorJob()): TestScope { diff --git a/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/TestRibDispatchers.kt b/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/TestRibDispatchers.kt index 4e52f80b8..02b6fb11f 100644 --- a/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/TestRibDispatchers.kt +++ b/android/libraries/rib-coroutines-test/src/main/kotlin/com/uber/rib/core/TestRibDispatchers.kt @@ -16,6 +16,7 @@ package com.uber.rib.core import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.MainCoroutineDispatcher import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestCoroutineScheduler @@ -24,6 +25,7 @@ import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain +@OptIn(ExperimentalCoroutinesApi::class) public data class TestRibDispatchers( /** * [TestCoroutineScheduler] to be used by all other [TestDispatcher] when using the default diff --git a/android/libraries/rib-coroutines-test/src/test/kotlin/com/uber/rib/core/RibScopesTest.kt b/android/libraries/rib-coroutines-test/src/test/kotlin/com/uber/rib/core/RibScopesTest.kt index 16917843f..6ed9cc1a0 100644 --- a/android/libraries/rib-coroutines-test/src/test/kotlin/com/uber/rib/core/RibScopesTest.kt +++ b/android/libraries/rib-coroutines-test/src/test/kotlin/com/uber/rib/core/RibScopesTest.kt @@ -165,6 +165,7 @@ internal class RibScopesTest { var exceptions = mutableListOf() override val key: CoroutineContext.Key<*> = CoroutineExceptionHandler + override fun handleException(context: CoroutineContext, exception: Throwable) { exceptions.add(exception) } diff --git a/android/libraries/rib-coroutines/build.gradle b/android/libraries/rib-coroutines/build.gradle index a1c457171..8e219c3b3 100644 --- a/android/libraries/rib-coroutines/build.gradle +++ b/android/libraries/rib-coroutines/build.gradle @@ -16,7 +16,7 @@ plugins { id("ribs.kotlin-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } dependencies { @@ -30,8 +30,7 @@ dependencies { testImplementation(project(":libraries:rib-base")) testImplementation(project(":libraries:rib-test")) testImplementation(testLibs.junit) - testImplementation(testLibs.mockito) - testImplementation(testLibs.mockitoKotlin) + testImplementation(testLibs.mockito.kotlin) testImplementation(testLibs.truth) testImplementation(testLibs.coroutines.test) testImplementation(libs.annotation) diff --git a/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibCoroutineScopes.kt b/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibCoroutineScopes.kt index 6d67979d8..4af539b35 100755 --- a/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibCoroutineScopes.kt +++ b/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibCoroutineScopes.kt @@ -73,10 +73,12 @@ public class LazyCoroutineScope(private val initializer: This.() -> // Used to get and set Test overrides from rib-coroutines-test utils public operator fun get(provider: Any): CoroutineScope? = values[provider] + public operator fun set(provider: Any, scope: CoroutineScope?) { values[provider] = scope } } + public operator fun getValue(thisRef: This, property: KProperty<*>): CoroutineScope = synchronized(LazyCoroutineScope) { return values.getOrPut(thisRef) { diff --git a/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibCoroutinesConfig.kt b/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibCoroutinesConfig.kt index 887bcf4ca..665a9f3fe 100644 --- a/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibCoroutinesConfig.kt +++ b/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibCoroutinesConfig.kt @@ -50,7 +50,7 @@ public object RibCoroutinesConfig { """ This dispatcher is only intended to be used within the [com.uber.rib.core.WorkerBinder]. For adding and binding new RIB workers please use [RibCoroutineWorker] - """, + """ ) @JvmStatic public var deprecatedWorkerDispatcher: CoroutineDispatcher = RibDispatchers.Unconfined diff --git a/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibDispatchers.kt b/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibDispatchers.kt index 02ebf1b9d..740c4a7ba 100644 --- a/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibDispatchers.kt +++ b/android/libraries/rib-coroutines/src/main/kotlin/com/uber/rib/core/RibDispatchers.kt @@ -27,10 +27,13 @@ import kotlinx.coroutines.MainScope public object RibDispatchers : RibDispatchersProvider { override val Default: CoroutineDispatcher get() = RibCoroutinesConfig.dispatchers.Default + override val Main: MainCoroutineDispatcher get() = RibCoroutinesConfig.dispatchers.Main + override val IO: CoroutineDispatcher get() = RibCoroutinesConfig.dispatchers.IO + override val Unconfined: CoroutineDispatcher get() = RibCoroutinesConfig.dispatchers.Unconfined } @@ -43,6 +46,7 @@ public data class DefaultRibDispatchers( ) : RibDispatchersProvider /** Allows providing default Dispatchers used for Rib CoroutineScopes */ +@Suppress("PropertyName") public interface RibDispatchersProvider { /** diff --git a/android/libraries/rib-debug-utils/build.gradle.kts b/android/libraries/rib-debug-utils/build.gradle.kts index 1f17e5e49..7d734fb03 100644 --- a/android/libraries/rib-debug-utils/build.gradle.kts +++ b/android/libraries/rib-debug-utils/build.gradle.kts @@ -16,7 +16,7 @@ plugins { id("ribs.kotlin-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } kotlin { @@ -28,7 +28,7 @@ kotlin { } } explicitApi() - jvmToolchain(8) + jvmToolchain(17) } dependencies { diff --git a/android/libraries/rib-router-navigator/build.gradle b/android/libraries/rib-router-navigator/build.gradle index 2f2adca0d..13f5d569c 100644 --- a/android/libraries/rib-router-navigator/build.gradle +++ b/android/libraries/rib-router-navigator/build.gradle @@ -16,7 +16,7 @@ plugins { id("ribs.kotlin-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } dependencies { @@ -29,6 +29,6 @@ dependencies { compileOnly(libs.android.api) testImplementation(testLibs.junit) - testImplementation(testLibs.mockitoKotlin) + testImplementation(testLibs.mockito.kotlin) testImplementation(testLibs.truth) } diff --git a/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterAndState.kt b/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterAndState.kt index 2a009994b..1e678af6d 100644 --- a/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterAndState.kt +++ b/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterAndState.kt @@ -66,18 +66,17 @@ internal class RouterAndState, StateT : RouterNavigatorState>( } private fun wrapDetachTransitionIfNeed( - detachTransition: RouterNavigator.DetachTransition?, - ): RouterNavigator.DetachCallback? { - return (detachTransition as? RouterNavigator.DetachCallback) + detachTransition: RouterNavigator.DetachTransition? + ): RouterNavigator.DetachCallback? = + (detachTransition as? RouterNavigator.DetachCallback) ?: detachTransition?.let { DetachCallbackWrapper(it) } - } /** * Wrapper class to wrap [transitionCallback] calls into the new [RouterNavigator.DetachCallback] * format. */ private inner class DetachCallbackWrapper( - private val transitionCallback: RouterNavigator.DetachTransition, + private val transitionCallback: RouterNavigator.DetachTransition ) : RouterNavigator.DetachCallback() { override fun willDetachFromHost( @@ -112,9 +111,7 @@ internal class RouterAndState, StateT : RouterNavigatorState>( } } - private class SafeRouterAccessor>( - private val routerBuilder: () -> R, - ) { + private class SafeRouterAccessor>(private val routerBuilder: () -> R) { private val lock = ReentrantLock() private var _router: R? = null @@ -137,8 +134,7 @@ internal class RouterAndState, StateT : RouterNavigatorState>( _router?.javaClass?.simpleName?.let { routerName -> log("Destroying router $routerName was destroyed") _router = null - } - ?: run { log("Router of ${state.stateName()} state already destroyed") } + } ?: run { log("Router of ${state.stateName()} state already destroyed") } } } } diff --git a/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorEventType.kt b/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorEventType.kt index 9742e925d..7561f8cc5 100644 --- a/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorEventType.kt +++ b/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorEventType.kt @@ -17,5 +17,5 @@ package com.uber.rib.core /** Enum consisting of event types that occur when [RouterNavigator] is used for transition. */ public enum class RouterNavigatorEventType { - WILL_ATTACH_TO_HOST, + WILL_ATTACH_TO_HOST } diff --git a/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorFactory.kt b/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorFactory.kt index 1503d4007..51df71894 100644 --- a/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorFactory.kt +++ b/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorFactory.kt @@ -32,11 +32,10 @@ public class RouterNavigatorFactory(private val creationStrategy: Strategy?) { * @param [StateT] type for the [RouterNavigator] * @return A new [RouterNavigator] */ - public open fun create( - hostRouter: Router<*>, - ): RouterNavigator { - return creationStrategy?.create(hostRouter) ?: StackRouterNavigator(hostRouter) - } + public fun create( + hostRouter: Router<*> + ): RouterNavigator = + creationStrategy?.create(hostRouter) ?: StackRouterNavigator(hostRouter) /** Strategy to employ when using this factory to generate new [RouterNavigator]s. */ public interface Strategy { @@ -48,7 +47,7 @@ public class RouterNavigatorFactory(private val creationStrategy: Strategy?) { * @return A new [RouterNavigator] */ public fun create( - hostRouter: Router<*>, + hostRouter: Router<*> ): RouterNavigator } } diff --git a/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorState.kt b/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorState.kt index 9dd80a4b8..c93821f13 100644 --- a/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorState.kt +++ b/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/RouterNavigatorState.kt @@ -19,13 +19,12 @@ package com.uber.rib.core public interface RouterNavigatorState { /** @return identifier for a [StackRouterNavigator] state. */ - public fun stateName(): String { - return if (this.javaClass.isEnum) { + public fun stateName(): String = + if (this.javaClass.isEnum) { (this as Enum<*>).name } else { throw java.lang.AssertionError("Must be implemented by enum or override stateName()") } - } /** * @return Boolean flag configure router caching behavior between transactions. diff --git a/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/StackRouterNavigator.kt b/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/StackRouterNavigator.kt index 937a93832..933ad9458 100644 --- a/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/StackRouterNavigator.kt +++ b/android/libraries/rib-router-navigator/src/main/kotlin/com/uber/rib/core/StackRouterNavigator.kt @@ -51,7 +51,7 @@ constructor( Locale.getDefault(), "Preparing to pop existing transient state for router: %s", fromRouterName, - ), + ) ) } else { if (!navigationStack.isEmpty()) { @@ -62,7 +62,7 @@ constructor( Locale.getDefault(), "Preparing to pop existing state for router: %s", fromRouterName, - ), + ) ) } } @@ -184,10 +184,7 @@ constructor( return top.state } - @IntRange(from = 0) - override fun size(): Int { - return navigationStack.size - } + @IntRange(from = 0) override fun size(): Int = navigationStack.size /** * This will pop the current active router and clear the entire stack. @@ -200,7 +197,7 @@ constructor( Locale.getDefault(), "Detaching RouterNavigator from host -> %s", hostRouterName, - ), + ) ) val currentRouterAndState = peekCurrentRouterAndState() detachInternal(currentRouterAndState, null as StateT?, false) @@ -212,14 +209,13 @@ constructor( newState: StateT, attachTransition: RouterNavigator.AttachTransition, detachTransition: RouterNavigator.DetachTransition?, - ): RouterAndState { - return RouterAndState( + ): RouterAndState = + RouterAndState( newState, attachTransition, detachTransition, forceRouterCaching = forceRouterCaching, ) - } /** * Handles the attachment logic for a router. @@ -247,7 +243,7 @@ constructor( "Attaching %s as a child of %s", toRouterName, hostRouterName, - ), + ) ) hostRouter.attachChild(toRouterState.router) } @@ -279,13 +275,12 @@ constructor( fromRouterState.onPostDetachFromHost(toState, isPush) } - private fun peekCurrentRouterAndState(): RouterAndState<*, StateT>? { - return if (currentTransientRouterAndState != null) { + private fun peekCurrentRouterAndState(): RouterAndState<*, StateT>? = + if (currentTransientRouterAndState != null) { currentTransientRouterAndState } else { navigationStack.peek() } - } private fun > clearTop( currentRouterAndState: RouterAndState<*, StateT>?, @@ -413,7 +408,7 @@ constructor( Locale.getDefault(), "Installed new RouterNavigator: Hosting Router -> %s", hostRouterName, - ), + ) ) } } diff --git a/android/libraries/rib-router-navigator/src/test/kotlin/com/uber/rib/core/RouterAndStateTest.kt b/android/libraries/rib-router-navigator/src/test/kotlin/com/uber/rib/core/RouterAndStateTest.kt index e538f0f9a..b0b0246f9 100644 --- a/android/libraries/rib-router-navigator/src/test/kotlin/com/uber/rib/core/RouterAndStateTest.kt +++ b/android/libraries/rib-router-navigator/src/test/kotlin/com/uber/rib/core/RouterAndStateTest.kt @@ -52,7 +52,7 @@ class RouterAndStateTest { routerAndState.onPostDetachFromHost(mock(), false) val router2 = routerAndState.router - assertThat(router1).isNotSameAs(router2) + assertThat(router1).isNotSameInstanceAs(router2) } @Test @@ -66,7 +66,7 @@ class RouterAndStateTest { routerAndState.onPostDetachFromHost(mock(), false) val router2 = routerAndState.router - assertThat(router1).isSameAs(router2) + assertThat(router1).isSameInstanceAs(router2) } @Test @@ -80,7 +80,7 @@ class RouterAndStateTest { routerAndState.onPostDetachFromHost(mock(), false) val router2 = routerAndState.router - assertThat(router1).isSameAs(router2) + assertThat(router1).isSameInstanceAs(router2) } @Test @@ -94,7 +94,7 @@ class RouterAndStateTest { routerAndState.onPostDetachFromHost(mock(), false) val router2 = routerAndState.router - assertThat(router1).isSameAs(router2) + assertThat(router1).isSameInstanceAs(router2) } @Test @@ -159,12 +159,7 @@ class RouterAndStateTest { destroyedRouters.add(it.arguments[0] as Router<*>) } - val routerAndState = - RouterAndState( - state, - attachTransition, - detachCallback, - ) + val routerAndState = RouterAndState(state, attachTransition, detachCallback) val threadsCount = 10 val latch = CountDownLatch(threadsCount) diff --git a/android/libraries/rib-screen-stack-base/build.gradle b/android/libraries/rib-screen-stack-base/build.gradle index 4641140e9..a7429649d 100644 --- a/android/libraries/rib-screen-stack-base/build.gradle +++ b/android/libraries/rib-screen-stack-base/build.gradle @@ -16,7 +16,7 @@ plugins { id("ribs.kotlin-android-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } android { diff --git a/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/ScreenStackBase.kt b/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/ScreenStackBase.kt index 7bb11f8df..1e8a248d5 100644 --- a/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/ScreenStackBase.kt +++ b/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/ScreenStackBase.kt @@ -18,7 +18,7 @@ package com.uber.rib.core.screenstack import androidx.annotation.IntRange /** Implementation of a view based screen stack. */ -interface ScreenStackBase { +public interface ScreenStackBase { /** * Pushes a new screen into the stack. The new screen view will have its type inspected in order * to manipulate the status bar background and icon colors. @@ -27,7 +27,7 @@ interface ScreenStackBase { * * @param viewProvider to create a new view to be displayed. */ - fun pushScreen(viewProvider: ViewProvider) + public fun pushScreen(viewProvider: ViewProvider) /** * Pushes a new screen into the stack. The new screen view will have its type inspected in order @@ -37,10 +37,10 @@ interface ScreenStackBase { * @param shouldAnimate whether the addition of the screen should be animated using the default * transition. */ - fun pushScreen(viewProvider: ViewProvider, shouldAnimate: Boolean) + public fun pushScreen(viewProvider: ViewProvider, shouldAnimate: Boolean) /** Removes the current screen from the stack. This will use animations. */ - fun popScreen() + public fun popScreen() /** * Removes the current screen from the stack. Allows enabling/disabling of the animation used in @@ -48,7 +48,7 @@ interface ScreenStackBase { * * @param shouldAnimate Whether the removal of the screen should be animated. */ - fun popScreen(shouldAnimate: Boolean) + public fun popScreen(shouldAnimate: Boolean) /** * Pops back to the specified index. (Starting at 0). @@ -59,7 +59,7 @@ interface ScreenStackBase { * @param shouldAnimate If true, we should animate to the final entry that we are popping to. If * false, no animations will be used. */ - fun popBackTo(@IntRange(from = -1) index: Int, shouldAnimate: Boolean) + public fun popBackTo(@IntRange(from = -1) index: Int, shouldAnimate: Boolean) /** * Try to handle a back press. Pass the back press to children, if they exist. Or pop the top item @@ -67,7 +67,7 @@ interface ScreenStackBase { * * @return True if the back press is handled. */ - fun handleBackPress(): Boolean + public fun handleBackPress(): Boolean /** * Try to handle a back press. Pass the back press to children, if they exist. Or pop the top item @@ -76,12 +76,12 @@ interface ScreenStackBase { * @param shouldAnimate True if we should use animations. False otherwise. * @return TRUE if the back press is handled. */ - fun handleBackPress(shouldAnimate: Boolean): Boolean + public fun handleBackPress(shouldAnimate: Boolean): Boolean /** * Gets the size of the stack. * * @return Size. */ - @IntRange(from = 0) fun size(): Int + @IntRange(from = 0) public fun size(): Int } diff --git a/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/ViewProvider.kt b/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/ViewProvider.kt index 848bebcf3..ee0741cc4 100644 --- a/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/ViewProvider.kt +++ b/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/ViewProvider.kt @@ -26,12 +26,12 @@ import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.rx2.asObservable /** Interface to provide [View] instances to [ScreenStackBase]. */ -abstract class ViewProvider { +public abstract class ViewProvider { private val _lifecycleFlow = MutableSharedFlow(1, 0, BufferOverflow.DROP_OLDEST) - open val lifecycleFlow: SharedFlow + public open val lifecycleFlow: SharedFlow get() = _lifecycleFlow - open fun buildViewInternal(parentView: ViewGroup): View { + public open fun buildViewInternal(parentView: ViewGroup): View { _lifecycleFlow.tryEmit(ScreenStackEvent.BUILT) return buildView(parentView) } @@ -42,10 +42,10 @@ abstract class ViewProvider { * @param parentView parent [ViewGroup] that the view will be displayed in. * @return the view to be displayed. */ - abstract fun buildView(parentView: ViewGroup): View + public abstract fun buildView(parentView: ViewGroup): View /** @return an observable that emits events for this view provider's lifecycle. */ - fun lifecycle(): Observable = lifecycleFlow.asObservable() + public fun lifecycle(): Observable = lifecycleFlow.asObservable() /** * Callers can implement this in order to complete additional work when a call to @@ -54,7 +54,7 @@ abstract class ViewProvider { protected open fun doOnViewRemoved() {} /** Notifies the view provider that the view has been popped from the stack. */ - fun onViewRemoved() { + public fun onViewRemoved() { _lifecycleFlow.tryEmit(ScreenStackEvent.REMOVED) doOnViewRemoved() } @@ -64,19 +64,17 @@ abstract class ViewProvider { * * @return TRUE if the provider handled the back press. */ - open fun onBackPress(): Boolean { - return false - } + public open fun onBackPress(): Boolean = false /** Notifies the view provider that view is at the top of the stack and visible. */ @CallSuper - open fun onViewAppeared() { + public open fun onViewAppeared() { _lifecycleFlow.tryEmit(ScreenStackEvent.APPEARED) } /** Notifies the view provider that the view is no longer at the top of the stack. */ @CallSuper - open fun onViewHidden() { + public open fun onViewHidden() { _lifecycleFlow.tryEmit(ScreenStackEvent.HIDDEN) } } diff --git a/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/lifecycle/ScreenStackEvent.kt b/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/lifecycle/ScreenStackEvent.kt index d49dc6a3c..95ed6ae22 100644 --- a/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/lifecycle/ScreenStackEvent.kt +++ b/android/libraries/rib-screen-stack-base/src/main/kotlin/com/uber/rib/core/screenstack/lifecycle/ScreenStackEvent.kt @@ -18,7 +18,7 @@ package com.uber.rib.core.screenstack.lifecycle import com.uber.rib.core.screenstack.ScreenStackBase /** Lifecycle events that can be emitted by [ScreenStackBase] view providers. */ -enum class ScreenStackEvent { +public enum class ScreenStackEvent { BUILT, APPEARED, HIDDEN, diff --git a/android/libraries/rib-test/build.gradle.kts b/android/libraries/rib-test/build.gradle.kts index cec95a5ee..e01b84f21 100644 --- a/android/libraries/rib-test/build.gradle.kts +++ b/android/libraries/rib-test/build.gradle.kts @@ -16,7 +16,7 @@ plugins { id("ribs.kotlin-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } kotlin { @@ -32,10 +32,8 @@ kotlin { dependencies { api(project(":libraries:rib-base")) implementation(libs.rxjava2) - implementation(libs.kotlin.stdlib) api(testLibs.junit) api(testLibs.truth) - api(testLibs.mockito) + api(testLibs.mockito.kotlin) api(testLibs.coroutines.test) - implementation(testLibs.mockitoKotlin) } diff --git a/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/FakeComponent.kt b/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/FakeComponent.kt index 5a99c0ffe..ce28be232 100644 --- a/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/FakeComponent.kt +++ b/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/FakeComponent.kt @@ -16,22 +16,16 @@ package com.uber.rib.core public class FakeComponent

> -private constructor( - private val presenter: P, -) : InteractorComponent { +private constructor(private val presenter: P) : InteractorComponent { override fun inject(interactor: T) {} - override fun presenter(): P { - return presenter - } + override fun presenter(): P = presenter public companion object { @JvmStatic public fun > withFakePresenterFor( - interactorClass: Class, - ): FakeComponent { - return FakeComponent(FakePresenter()) - } + interactorClass: Class + ): FakeComponent = FakeComponent(FakePresenter()) } } diff --git a/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/FakeRouter.kt b/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/FakeRouter.kt index eae9c50d7..8c41c9f37 100644 --- a/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/FakeRouter.kt +++ b/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/FakeRouter.kt @@ -22,6 +22,7 @@ package com.uber.rib.core */ public class FakeRouter> : Router { public constructor(interactor: I) : super(interactor) + public constructor( interactor: I, ribRefWatcher: RibRefWatcher, diff --git a/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/WorkerHelper.kt b/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/WorkerHelper.kt index 5c54ea98a..7457cc097 100644 --- a/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/WorkerHelper.kt +++ b/android/libraries/rib-test/src/main/kotlin/com/uber/rib/core/WorkerHelper.kt @@ -27,7 +27,6 @@ public object WorkerHelper { * @return a [WorkerScopeProvider]. */ @JvmStatic - public fun createScopeProvider(lifecycle: Observable): WorkerScopeProvider { - return WorkerScopeProvider(lifecycle) - } + public fun createScopeProvider(lifecycle: Observable): WorkerScopeProvider = + WorkerScopeProvider(lifecycle) } diff --git a/android/libraries/rib-workflow-test/build.gradle.kts b/android/libraries/rib-workflow-test/build.gradle.kts index 312d5de7c..a2992d790 100644 --- a/android/libraries/rib-workflow-test/build.gradle.kts +++ b/android/libraries/rib-workflow-test/build.gradle.kts @@ -15,7 +15,7 @@ */ plugins { id("ribs.kotlin-android-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } android { diff --git a/android/libraries/rib-workflow-test/src/main/kotlin/com/uber/rib/workflow/core/StepTester.kt b/android/libraries/rib-workflow-test/src/main/kotlin/com/uber/rib/workflow/core/StepTester.kt index 20f4f138c..09c2487d2 100644 --- a/android/libraries/rib-workflow-test/src/main/kotlin/com/uber/rib/workflow/core/StepTester.kt +++ b/android/libraries/rib-workflow-test/src/main/kotlin/com/uber/rib/workflow/core/StepTester.kt @@ -31,11 +31,9 @@ public object StepTester { * @return a [Observable] that runs the steps action. */ @JvmStatic - public fun exposeObservable( - step: Step, - ): Observable>> { - return step.asObservable() - } + public fun exposeObservable( + step: Step + ): Observable>> = step.asObservable() /** * Exposes the [com.uber.rib.workflow.core.Step.Data] of a [Step] @@ -46,9 +44,8 @@ public object StepTester { * @return the data of the step */ @JvmStatic - public fun exposeStepData(step: Step.Data): T? { - return step.getValue() - } + public fun exposeStepData(step: Step.Data): T? = + step.getValue() /** * Asserts that no [Step] has been emitted from the [TestObserver] @@ -58,8 +55,8 @@ public object StepTester { * @param type of next actionable item for a step. */ @JvmStatic - public fun assertStepNotYetEmitted( - testSubscriber: TestObserver>>, + public fun assertStepNotYetEmitted( + testSubscriber: TestObserver>> ) { testSubscriber.run { assertNoValues() @@ -76,8 +73,8 @@ public object StepTester { * @param type of next actionable item for a step. */ @JvmStatic - public fun assertStepEmitted( - testSubscriber: TestObserver>>, + public fun assertStepEmitted( + testSubscriber: TestObserver>> ) { testSubscriber.assertValueCount(1) val stepData: Optional> = testSubscriber.values()[0] diff --git a/android/libraries/rib-workflow/build.gradle b/android/libraries/rib-workflow/build.gradle index e0b5910c2..12020f04d 100644 --- a/android/libraries/rib-workflow/build.gradle +++ b/android/libraries/rib-workflow/build.gradle @@ -16,7 +16,7 @@ plugins { id("ribs.kotlin-android-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } android { @@ -32,5 +32,5 @@ dependencies { api(project(":libraries:rib-android")) testImplementation(testLibs.junit) testImplementation(testLibs.truth) - testImplementation(testLibs.mockito) + testImplementation(testLibs.mockito.kotlin) } diff --git a/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/ActionableItem.kt b/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/ActionableItem.kt index f7c2634d4..615528660 100644 --- a/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/ActionableItem.kt +++ b/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/ActionableItem.kt @@ -19,10 +19,10 @@ import com.uber.rib.core.lifecycle.InteractorEvent import io.reactivex.Observable /** Represents an item that [Step] operations can be performed on. */ -fun interface ActionableItem { +public fun interface ActionableItem { /** * @return a lifecycle observable that can be observed so a workflow knows when to start a step * for this actionable item. */ - fun lifecycle(): Observable + public fun lifecycle(): Observable } diff --git a/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/Step.kt b/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/Step.kt index e3a460969..868e9ef0f 100644 --- a/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/Step.kt +++ b/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/Step.kt @@ -29,10 +29,8 @@ import io.reactivex.functions.BiFunction * @param type of return value (if any) for this step. * @param type of [ActionableItem] this step returns when finished. */ -open class Step -private constructor( - private val stepDataSingle: Single>>, -) { +public open class Step +private constructor(private val stepDataSingle: Single>>) { /** * Chains another step to be performed after this step completes. If the previous step results in @@ -47,10 +45,10 @@ private constructor( */ @OptIn(WorkflowFriendModuleApi::class) @SuppressWarnings("RxJavaToSingle") // Replace singleOrError() with firstOrError() - public open fun onStep( - func: BiFunction>, - ): Step { - return Step( + public open fun onStep( + func: BiFunction> + ): Step = + Step( asObservable() .flatMap { data: Optional> -> if (data.isPresent) { @@ -59,14 +57,12 @@ private constructor( Observable.just(Optional.absent()) } } - .singleOrError(), + .singleOrError() ) - } @OptIn(WorkflowFriendModuleApi::class) - internal open fun asResultObservable(): Observable> { - return asObservable().map { data -> Optional.fromNullable(data.orNull()?.getValue()) } - } + internal open fun asResultObservable(): Observable> = + asObservable().map { data -> Optional.fromNullable(data.orNull()?.getValue()) } @WorkflowFriendModuleApi public open fun asObservable(): Observable>> { @@ -94,14 +90,14 @@ private constructor( * @param value for this instance. * @param actionableItem for this instance. */ - public open class Data( + public open class Data( private val value: T, internal val actionableItem: A, ) { - @WorkflowFriendModuleApi public open fun getValue() = value + @WorkflowFriendModuleApi public open fun getValue(): T = value - companion object { + public companion object { /** * Convenience function to create a [Step.Data] instance that does not have a return value * type. @@ -111,21 +107,20 @@ private constructor( * @return a new [Step.Data] instance. */ @JvmStatic - public fun toActionableItem(actionableItem: A): Data { - return Data(NoValueHolder.INSTANCE, actionableItem) - } + public fun toActionableItem(actionableItem: A): Data = + Data(NoValueHolder.INSTANCE, actionableItem) } } /** Used to indicate that a step has no return value. */ - open class NoValue + public open class NoValue /** Initialization On Demand Singleton for [NoValue]. */ private object NoValueHolder { val INSTANCE = NoValue() } - companion object { + public companion object { /** * Create a new step with a single that always returns a value. * @@ -135,9 +130,8 @@ private constructor( * @return a new [Step]. */ @JvmStatic - fun from(stepDataSingle: Single>): Step { - return Step(stepDataSingle.map { Optional.of(it) }) - } + public fun from(stepDataSingle: Single>): Step = + Step(stepDataSingle.map { Optional.of(it) }) /** * Create a new step with a single that can emit an absent result. @@ -151,8 +145,8 @@ private constructor( * @return a new [Step]. */ @JvmStatic - fun fromOptional( - stepDataSingle: Single>>, + public fun fromOptional( + stepDataSingle: Single>> ): Step = Step(stepDataSingle) } } diff --git a/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/Workflow.kt b/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/Workflow.kt index 862fdc121..84437c82a 100644 --- a/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/Workflow.kt +++ b/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/Workflow.kt @@ -25,7 +25,7 @@ import io.reactivex.Single * @param initial [ActionableItem] type for this workflow. * */ -abstract class Workflow { +public abstract class Workflow { /** * Creates a single to execute a workflow. * @@ -33,15 +33,16 @@ abstract class Workflow { * @return an Rx [Single] that will return the workflow when subscribed to. */ @SuppressWarnings("RxJavaToSingle") // Replace singleOrError() with firstOrError() - open fun createSingle(rootActionableItem: TRootActionableItem): Single> { - return getSteps(rootActionableItem).asResultObservable().singleOrError() - } + public open fun createSingle( + rootActionableItem: TRootActionableItem + ): Single> = + getSteps(rootActionableItem).asResultObservable().singleOrError() /** * @param rootActionableItem to create steps from. * @return steps to be performed for this workflow. */ protected abstract fun getSteps( - rootActionableItem: TRootActionableItem, + rootActionableItem: TRootActionableItem ): Step } diff --git a/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/internal/WorkflowFriendModuleApi.kt b/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/internal/WorkflowFriendModuleApi.kt index 4d55f66a0..b51c2b836 100644 --- a/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/internal/WorkflowFriendModuleApi.kt +++ b/android/libraries/rib-workflow/src/main/kotlin/com/uber/rib/workflow/core/internal/WorkflowFriendModuleApi.kt @@ -20,4 +20,6 @@ package com.uber.rib.workflow.core.internal * * Anything marked with this annotation is not intended for public use. */ -@RequiresOptIn(level = RequiresOptIn.Level.ERROR) internal annotation class WorkflowFriendModuleApi +@Suppress("ExperimentalAnnotationRetention") +@RequiresOptIn(level = RequiresOptIn.Level.ERROR) +internal annotation class WorkflowFriendModuleApi diff --git a/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/AndroidSchedulersRule.kt b/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/AndroidSchedulersRule.kt index 4244d3c75..def3dd761 100644 --- a/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/AndroidSchedulersRule.kt +++ b/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/AndroidSchedulersRule.kt @@ -28,11 +28,9 @@ import org.junit.runner.Description * @param restoreHandlers if true, the rule will save off the original schedulers and restore them * after. Almost always want this to be false and is so by default. */ -class AndroidSchedulersRule +public class AndroidSchedulersRule @JvmOverloads -constructor( - private val restoreHandlers: Boolean = false, -) : TestWatcher() { +constructor(private val restoreHandlers: Boolean = false) : TestWatcher() { private val delegatingMainThreadScheduler = DelegatingScheduler.forType(DelegatingScheduler.SchedulerType.MAIN_THREAD) @@ -67,7 +65,7 @@ constructor( * @param scheduler to replace the main thread scheduler with. */ @Synchronized - fun setMainThreadScheduler(scheduler: Scheduler) { + public fun setMainThreadScheduler(scheduler: Scheduler) { delegatingMainThreadScheduler.setActiveScheduler(scheduler) } } diff --git a/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/DelegatingScheduler.kt b/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/DelegatingScheduler.kt index f8ec4031b..570e36a5b 100644 --- a/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/DelegatingScheduler.kt +++ b/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/DelegatingScheduler.kt @@ -21,38 +21,28 @@ import io.reactivex.schedulers.Schedulers import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicReference -class DelegatingScheduler -private constructor( - @get:VisibleForTesting val schedulerType: SchedulerType, -) : Scheduler() { +public class DelegatingScheduler +private constructor(@get:VisibleForTesting val schedulerType: SchedulerType) : Scheduler() { private val activeScheduler = AtomicReference(Schedulers.trampoline()) @VisibleForTesting - enum class SchedulerType { - MAIN_THREAD, + public enum class SchedulerType { + MAIN_THREAD } - override fun createWorker(): Worker { - return activeScheduler().createWorker() - } + override fun createWorker(): Worker = activeScheduler().createWorker() - override fun now(unit: TimeUnit): Long { - return activeScheduler().now(unit) - } + override fun now(unit: TimeUnit): Long = activeScheduler().now(unit) - @VisibleForTesting - @Synchronized - fun activeScheduler(): Scheduler { - return activeScheduler.get() - } + @VisibleForTesting @Synchronized fun activeScheduler(): Scheduler = activeScheduler.get() @Synchronized - fun setActiveScheduler(activeScheduler: Scheduler) { + public fun setActiveScheduler(activeScheduler: Scheduler) { this.activeScheduler.set(activeScheduler) } - companion object { - fun forType(schedulerType: SchedulerType) = DelegatingScheduler(schedulerType) + public companion object { + public fun forType(schedulerType: SchedulerType) = DelegatingScheduler(schedulerType) } } diff --git a/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/StepTest.kt b/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/StepTest.kt index aac739847..35811c0da 100644 --- a/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/StepTest.kt +++ b/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/StepTest.kt @@ -53,7 +53,7 @@ class StepTest { testSubscriber.assertNoErrors() testSubscriber.assertNotComplete() returnValueSubject.onNext( - Optional.of(Data(returnValue, ActionableItem { interactorLifecycleSubject.hide() })), + Optional.of(Data(returnValue, ActionableItem { interactorLifecycleSubject.hide() })) ) returnValueSubject.onComplete() testSubscriber.assertNoValues() @@ -77,7 +77,7 @@ class StepTest { testSubscriber.assertNoErrors() testSubscriber.assertNotComplete() returnValueSubject.onNext( - Optional.of(Data(returnValue, ActionableItem { interactorLifecycleSubject.hide() })), + Optional.of(Data(returnValue, ActionableItem { interactorLifecycleSubject.hide() })) ) returnValueSubject.onComplete() testSubscriber.assertValueCount(1) @@ -95,14 +95,12 @@ class StepTest { interactorLifecycleSubject.onNext(InteractorEvent.ACTIVE) step .onStep { o, actionableItem -> - Step.from( - Observable.just(Data(secondReturnValue, actionableItem)).singleOrError(), - ) + Step.from(Observable.just(Data(secondReturnValue, actionableItem)).singleOrError()) } .asObservable() .subscribe(testSubscriber) returnValueSubject.onNext( - Optional.of(Data(returnValue, ActionableItem { interactorLifecycleSubject.hide() })), + Optional.of(Data(returnValue, ActionableItem { interactorLifecycleSubject.hide() })) ) returnValueSubject.onComplete() testSubscriber.assertValueCount(1) @@ -119,9 +117,7 @@ class StepTest { interactorLifecycleSubject.onNext(InteractorEvent.ACTIVE) step .onStep { _, actionableItem -> - Step.from( - Observable.just(Data(secondReturnValue, actionableItem)).singleOrError(), - ) + Step.from(Observable.just(Data(secondReturnValue, actionableItem)).singleOrError()) } .asObservable() .subscribe(testSubscriber) diff --git a/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/WorkflowTest.kt b/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/WorkflowTest.kt index 0942296b4..4d0e23c39 100644 --- a/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/WorkflowTest.kt +++ b/android/libraries/rib-workflow/src/test/kotlin/com/uber/rib/workflow/core/WorkflowTest.kt @@ -53,9 +53,8 @@ class WorkflowTest { val workflow: Workflow = object : Workflow() { - override fun getSteps(rootActionableItem: ActionableItem): Step { - return from(returnValueSubject.singleOrError()) - } + override fun getSteps(rootActionableItem: ActionableItem): Step = + from(returnValueSubject.singleOrError()) } val testSubscriber = TestObserver>() diff --git a/android/settings.gradle b/android/settings.gradle index 42a33dcc6..9def53541 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -2,12 +2,23 @@ import org.gradle.api.initialization.resolve.RepositoriesMode pluginManagement { repositories { - gradlePluginPortal() - google() + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } mavenCentral() + gradlePluginPortal() } } +plugins { + // Provides repository for downloading JDKs. Used by JVM toolchain gradle config. + id("org.gradle.toolchains.foojay-resolver-convention") version("0.8.0") +} + dependencyResolutionManagement { // rib-intellij-plugin project applies the IntelliJ plugin, which applies custom repositories. // Otherwise, this should be FAIL_ON_PROJECT_REPO. diff --git a/android/tooling/rib-flipper-plugin/build.gradle b/android/tooling/rib-flipper-plugin/build.gradle index 687eee600..5a47998b6 100644 --- a/android/tooling/rib-flipper-plugin/build.gradle +++ b/android/tooling/rib-flipper-plugin/build.gradle @@ -15,7 +15,7 @@ */ plugins { id("ribs.kotlin-android-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } android { diff --git a/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibEventPayload.kt b/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibEventPayload.kt index 80fcbd790..6d9c6c3c7 100644 --- a/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibEventPayload.kt +++ b/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibEventPayload.kt @@ -46,13 +46,12 @@ internal class RibEventPayload( val eventName: String get() = eventType.toString() - fun toFlipperPayload(): FlipperObject { - return FlipperObject.Builder() + fun toFlipperPayload(): FlipperObject = + FlipperObject.Builder() .put(EVENT_PARAMETER_SESSION_ID, sessionId) .put(EVENT_PARAMETER_ROUTER, routerInfo.toFlipperPayload()) .put(EVENT_PARAMETER_PARENT, parentRouterInfo.toFlipperPayload()) .build() - } internal class RouterInfo( val id: String, @@ -86,14 +85,13 @@ internal class RibEventPayload( } } - fun toFlipperPayload(): FlipperObject { - return FlipperObject.Builder() + fun toFlipperPayload(): FlipperObject = + FlipperObject.Builder() .put(EVENT_PARAMETER_ID, id) .put(EVENT_PARAMETER_NAME, name) .put(EVENT_PARAMETER_ROUTER_CLASSNAME, className) .put(EVENT_PARAMETER_HAS_VIEW, hasView) .put(EVENT_PARAMETER_HOST_CLASSNAME, activityClassName) .build() - } } } diff --git a/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibTreeMessageType.kt b/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibTreeMessageType.kt index 2947b2986..79d53f281 100644 --- a/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibTreeMessageType.kt +++ b/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibTreeMessageType.kt @@ -16,7 +16,7 @@ package com.uber.rib.flipper /** Types of messages used by Rib Flipper Plugin. */ -enum class RibTreeMessageType { +public enum class RibTreeMessageType { SHOW_HIGHLIGHT, HIDE_HIGHLIGHT, } diff --git a/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibTreePlugin.kt b/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibTreePlugin.kt index db990105c..51129b0ad 100644 --- a/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibTreePlugin.kt +++ b/android/tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibTreePlugin.kt @@ -34,7 +34,7 @@ import java.util.UUID import java.util.WeakHashMap /** Flipper debug tool plugin to help with RIBs developement. */ -class RibTreePlugin : FlipperPlugin { +public class RibTreePlugin : FlipperPlugin { private var connection: FlipperConnection? = null private var disposable: Disposable? = null private val events: ReplaySubject = ReplaySubject.create(EVENTS_CAPACITY) @@ -43,7 +43,7 @@ class RibTreePlugin : FlipperPlugin { HashMap>() private val routersToId: WeakHashMap, String> = WeakHashMap, String>() - companion object { + private companion object { private val TAG: String = RibTreePlugin::class.java.simpleName private const val EVENTS_CAPACITY = 1000 } @@ -67,9 +67,7 @@ class RibTreePlugin : FlipperPlugin { .subscribe(events) } - override fun getId(): String { - return "ribtree" - } + override fun getId(): String = "ribtree" override fun onConnect(connection: FlipperConnection) { android.util.Log.d("RibTreeFlipperPlugin", "onConnect()") @@ -110,9 +108,7 @@ class RibTreePlugin : FlipperPlugin { connection = null } - override fun runInBackground(): Boolean { - return true - } + override fun runInBackground(): Boolean = true @Synchronized private fun getRouterById(id: String): Router<*>? { diff --git a/android/tooling/rib-intellij-plugin/build.gradle b/android/tooling/rib-intellij-plugin/build.gradle index 4fcd9734a..87466d871 100644 --- a/android/tooling/rib-intellij-plugin/build.gradle +++ b/android/tooling/rib-intellij-plugin/build.gradle @@ -20,12 +20,6 @@ intellij { downloadSources = false } -java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(17)) - } -} - dependencies { testImplementation(project(":libraries:rib-test")) testImplementation(project(":libraries:rib-compiler-test")) @@ -33,26 +27,15 @@ dependencies { testImplementation(libs.javax.inject) testImplementation(libs.dagger.library) testImplementation(testLibs.truth) - testImplementation(testLibs.compileTesting) - testImplementation(testLibs.mockito) + testImplementation(testLibs.compile.testing) + testImplementation(testLibs.mockito.kotlin) testImplementation(libs.annotation) testImplementation(libs.android.api) } -// Determines if the machine has Maven credentials. -def hasMavenCredentials() { - return ext.mavenUser && ext.mavenPassword -} - -// Determines if it is a release build. -def isReleaseBuild() { - return System.env.ENABLE_RELEASE_BUILD.equals("true") -} - ext.pluginXml = new XmlSlurper().parse(file("src/main/resources/META-INF/plugin.xml")) version = pluginXml.version - task sourcesJar(type: Jar, dependsOn: classes) { archiveClassifier = "sources" from sourceSets.main.allSource diff --git a/android/tooling/rib-intellij-plugin/native/intellij-broadcast-rib/build.gradle b/android/tooling/rib-intellij-plugin/native/intellij-broadcast-rib/build.gradle.kts similarity index 90% rename from android/tooling/rib-intellij-plugin/native/intellij-broadcast-rib/build.gradle rename to android/tooling/rib-intellij-plugin/native/intellij-broadcast-rib/build.gradle.kts index 84034ec23..5bc327397 100644 --- a/android/tooling/rib-intellij-plugin/native/intellij-broadcast-rib/build.gradle +++ b/android/tooling/rib-intellij-plugin/native/intellij-broadcast-rib/build.gradle.kts @@ -15,11 +15,15 @@ */ plugins { id("ribs.kotlin-android-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } android { - namespace "com.uber.debug.broadcast.rib" + namespace = "com.uber.debug.broadcast.rib" +} + +kotlin { + jvmToolchain(11) } dependencies { diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/CommandLineUtils.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/CommandLineUtils.kt index 49f9d79ff..8b1a976fa 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/CommandLineUtils.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/CommandLineUtils.kt @@ -38,9 +38,8 @@ public object CommandLineUtils { * @throws ExecutionException * @throws IOException */ - public fun which(project: Project, command: String): String { - return executeWithLineOutput(project, "which", command).output()[0] - } + public fun which(project: Project, command: String): String = + executeWithLineOutput(project, "which", command).output()[0] /** * Executes the given `command` appending the given `params` and returns the output. @@ -96,13 +95,9 @@ public object CommandLineUtils { public class ProcessOutput(private val output: List, private val error: List) { /** Returns the process std output */ - public fun output(): List { - return output - } + public fun output(): List = output /** Returns the process error output */ - public fun error(): List { - return error - } + public fun error(): List = error } } diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibHierarchyBrowser.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibHierarchyBrowser.kt index e402dcc84..dbe9ef0c7 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibHierarchyBrowser.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibHierarchyBrowser.kt @@ -108,21 +108,14 @@ public class RibHierarchyBrowser( private var refreshComplete: Boolean = false - private fun isUpdating(): Boolean { - return status == Status.INITIALIZING || status == Status.REFRESHING - } + private fun isUpdating(): Boolean = status == Status.INITIALIZING || status == Status.REFRESHING - override fun isApplicableElement(element: PsiElement): Boolean { - return element is PsiClass - } + override fun isApplicableElement(element: PsiElement): Boolean = element is PsiClass - override fun getActionPlace(): String { - return ActionPlaces.METHOD_HIERARCHY_VIEW_TOOLBAR - } + override fun getActionPlace(): String = ActionPlaces.METHOD_HIERARCHY_VIEW_TOOLBAR - override fun getComparator(): Comparator> { - return JavaHierarchyUtil.getComparator(myProject) - } + override fun getComparator(): Comparator> = + JavaHierarchyUtil.getComparator(myProject) override fun getElementFromDescriptor(descriptor: HierarchyNodeDescriptor): PsiElement? { if (isRootElement(descriptor.psiElement)) { @@ -131,17 +124,12 @@ public class RibHierarchyBrowser( return descriptor.psiElement } - override fun getPrevOccurenceActionNameImpl(): String { - return LABEL_GO_PREVIOUS_RIB - } + override fun getPrevOccurenceActionNameImpl(): String = LABEL_GO_PREVIOUS_RIB - override fun createLegendPanel(): JPanel? { - return null - } + override fun createLegendPanel(): JPanel? = null + + override fun getNextOccurenceActionNameImpl(): String = LABEL_GO_NEXT_RIB - override fun getNextOccurenceActionNameImpl(): String { - return LABEL_GO_NEXT_RIB - } override fun createTrees(trees: MutableMap) { trees[TYPE_HIERARCHY_TYPE] = createTree(true) } @@ -277,7 +265,7 @@ public class RibHierarchyBrowser( } } - private inner class HelpAction internal constructor() : + private inner class HelpAction : AnAction( IdeBundle.message("action.help"), IdeBundle.message("action.help"), @@ -286,7 +274,7 @@ public class RibHierarchyBrowser( override fun actionPerformed(e: AnActionEvent) { BrowserUtil.open( - "https://github.com/uber/RIBs/wiki/Android-Tooling#ribs-intellij-plugin-for-android", + "https://github.com/uber/RIBs/wiki/Android-Tooling#ribs-intellij-plugin-for-android" ) } diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibHierarchyUtils.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibHierarchyUtils.kt index 70640aaca..0e4e26f14 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibHierarchyUtils.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibHierarchyUtils.kt @@ -88,9 +88,8 @@ public class RibHierarchyUtils { } /** Check if the element supplied is a root element. */ - public fun isRootElement(element: PsiElement?): Boolean { - return element is PsiClass && element.qualifiedName == Object::class.java.name - } + public fun isRootElement(element: PsiElement?): Boolean = + element is PsiClass && element.qualifiedName == Object::class.java.name /** Format fully qualified class name. */ public fun formatQualifiedName(qualifiedName: String): String { @@ -158,11 +157,10 @@ public class RibHierarchyUtils { } /** Returns whether virtual file belongs to project and appears to be a layout file */ - public fun isProjectLayoutFile(project: Project, file: VirtualFile): Boolean { - return ProjectRootManager.getInstance(project).fileIndex.isInContent(file) && + public fun isProjectLayoutFile(project: Project, file: VirtualFile): Boolean = + ProjectRootManager.getInstance(project).fileIndex.isInContent(file) && file.fileType is XmlFileType && file.path.contains("/$LAYOUT_FOLDER_NAME/") - } /** Display popup balloon. */ public fun displayPopup( diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibProjectService.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibProjectService.kt index 08e0d3b7c..c7c374723 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibProjectService.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibProjectService.kt @@ -114,7 +114,7 @@ public class RibProjectService(public val project: Project) : ) } } - }, + } ) } } @@ -129,9 +129,7 @@ public class RibProjectService(public val project: Project) : LogcatRequestProcessor().execute(RibHighlightRequest(device, id)) } - public fun isLocating(): Boolean { - return isLocating - } + public fun isLocating(): Boolean = isLocating public fun enableLocateMode() { if (isLocating) { @@ -172,7 +170,7 @@ public class RibProjectService(public val project: Project) : ) } } - }, + } ) } @@ -190,9 +188,7 @@ public class RibProjectService(public val project: Project) : refreshRibHierarchy() } - public fun hasSelectedDevice(): Boolean { - return selectedDevice != null - } + public fun hasSelectedDevice(): Boolean = selectedDevice != null override fun onAvailableDevicesChanged(devices: List) { this.devices = devices diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibViewBrowser.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibViewBrowser.kt index b9d728d05..004487bea 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibViewBrowser.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/RibViewBrowser.kt @@ -82,17 +82,12 @@ public class RibViewBrowser( private var hasFocus: Boolean = false - override fun isApplicableElement(element: PsiElement): Boolean { - return element is PsiClass - } + override fun isApplicableElement(element: PsiElement): Boolean = element is PsiClass - override fun getActionPlace(): String { - return ActionPlaces.METHOD_HIERARCHY_VIEW_TOOLBAR - } + override fun getActionPlace(): String = ActionPlaces.METHOD_HIERARCHY_VIEW_TOOLBAR - override fun getComparator(): Comparator> { - return JavaHierarchyUtil.getComparator(myProject) - } + override fun getComparator(): Comparator> = + JavaHierarchyUtil.getComparator(myProject) override fun getElementFromDescriptor(descriptor: HierarchyNodeDescriptor): PsiElement? { if (isRootElement(descriptor.psiElement)) { @@ -101,21 +96,15 @@ public class RibViewBrowser( return descriptor.psiElement } - override fun getPrevOccurenceActionNameImpl(): String { - return LABEL_GO_PREVIOUS_RIB - } + override fun getPrevOccurenceActionNameImpl(): String = LABEL_GO_PREVIOUS_RIB - override fun createLegendPanel(): JPanel? { - return null - } + override fun createLegendPanel(): JPanel? = null override fun createTrees(trees: MutableMap) { trees[TYPE_HIERARCHY_TYPE] = createTree(true) } - override fun getNextOccurenceActionNameImpl(): String { - return LABEL_GO_NEXT_RIB - } + override fun getNextOccurenceActionNameImpl(): String = LABEL_GO_NEXT_RIB override fun getContentDisplayName(typeName: String, element: PsiElement): String? { if (element !is PsiClass) { @@ -150,7 +139,7 @@ public class RibViewBrowser( hasFocus = true notifySelectedViewChanged() } - }, + } ) tree.addTreeSelectionListener { notifySelectedViewChanged() } @@ -163,8 +152,7 @@ public class RibViewBrowser( RibHierarchyUtils.findRibViewRecursive( this.model.rootRib.view, UUID.fromString(model.selectedViewId), - ) - ?: return@invokeLater + ) ?: return@invokeLater selectionListener?.onSelectedViewChanged(ribView) ApplicationManager.getApplication().invokeLater { selectById(model.selectedViewId) } diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/io/LogcatMessageDecoder.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/io/LogcatMessageDecoder.kt index b95662fea..8fa1fcfb6 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/io/LogcatMessageDecoder.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/io/LogcatMessageDecoder.kt @@ -34,13 +34,9 @@ public class LogcatMessageDecoder { part = message.substring(spaceIndex + 1) } - override fun compareTo(other: MessagePart): Int { - return partNumber.compareTo(other.partNumber) - } + override fun compareTo(other: MessagePart): Int = partNumber.compareTo(other.partNumber) - override fun toString(): String { - return part - } + override fun toString(): String = part } private var partCount: Int = 0 diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/io/LogcatRequestProcessor.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/io/LogcatRequestProcessor.kt index c6f48f8f6..8543b5a83 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/io/LogcatRequestProcessor.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/io/LogcatRequestProcessor.kt @@ -51,8 +51,8 @@ public class LogcatRequestProcessor : RequestProcessor { private var result: Any? = null private var error: String? = null - override fun execute(request: Request): ListenableFuture { - return service.submit( + override fun execute(request: Request): ListenableFuture = + service.submit( Callable { val sequence: Int = counter.getAndIncrement() % MAX_SEQUENCE @@ -97,9 +97,8 @@ public class LogcatRequestProcessor : RequestProcessor { error("Command failed: ${response.errorDescription}") } result as T - }, + } ) - } private inner class LogCatOutputReceiver( private val device: IDevice, @@ -113,9 +112,7 @@ public class LogcatRequestProcessor : RequestProcessor { setTrimLine(false) } - override fun isCancelled(): Boolean { - return false - } + override fun isCancelled(): Boolean = false @SuppressWarnings("TooGenericExceptionCaught") override fun processNewLines(lines: Array) { @@ -147,8 +144,6 @@ public class LogcatRequestProcessor : RequestProcessor { } } - override fun isCancelled(): Boolean { - return false - } + override fun isCancelled(): Boolean = false } } diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/HierarchyBrowserBase.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/HierarchyBrowserBase.kt index c0e5fe76b..bf207cf27 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/HierarchyBrowserBase.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/HierarchyBrowserBase.kt @@ -57,9 +57,8 @@ public abstract class HierarchyBrowserBase( TreeSpeedSearch(tree, { path -> path.lastPathComponent.toString() }, true) TreeUtil.installActions(tree) object : AutoScrollToSourceHandler() { - override fun isAutoScrollMode(): Boolean { - return HierarchyBrowserManager.getSettings(myProject).IS_AUTOSCROLL_TO_SOURCE - } + override fun isAutoScrollMode(): Boolean = + HierarchyBrowserManager.getSettings(myProject).IS_AUTOSCROLL_TO_SOURCE override fun setAutoScrollMode(state: Boolean) { HierarchyBrowserManager.getSettings(myProject).IS_AUTOSCROLL_TO_SOURCE = state diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyActivityDescriptor.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyActivityDescriptor.kt index 1f612891d..4208a4372 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyActivityDescriptor.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyActivityDescriptor.kt @@ -39,7 +39,5 @@ public class RibHierarchyActivityDescriptor( text.ending.addText(" (${formatQualifiedName(ribActivity.name)})", getPackageNameAttributes()) } - override fun getIcon(element: PsiElement): Icon? { - return AllIcons.Actions.Execute - } + override fun getIcon(element: PsiElement): Icon? = AllIcons.Actions.Execute } diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyApplicationDescriptor.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyApplicationDescriptor.kt index 9f7e92329..e34c1b49f 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyApplicationDescriptor.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyApplicationDescriptor.kt @@ -36,7 +36,5 @@ public class RibHierarchyApplicationDescriptor( text.ending.addText(ribApplication.name, getDefaultTextAttributes()) } - override fun getIcon(element: PsiElement): Icon? { - return AllIcons.Nodes.Parameter - } + override fun getIcon(element: PsiElement): Icon? = AllIcons.Nodes.Parameter } diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyDescriptor.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyDescriptor.kt index 7dd283c61..6d2388f24 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyDescriptor.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyDescriptor.kt @@ -38,9 +38,7 @@ public open class RibHierarchyDescriptor( public open fun updateText(text: CompositeAppearance) {} /** Method used to get the unique id of descriptor. Used for programmatic selection. */ - public open fun getUniqueId(): String? { - return null - } + public open fun getUniqueId(): String? = null override fun update(): Boolean { val changes = super.update() @@ -67,12 +65,9 @@ public open class RibHierarchyDescriptor( } /** Return icon to display. */ - override fun getIcon(element: PsiElement): Icon? { - return null - } + override fun getIcon(element: PsiElement): Icon? = null /** Compare 2 instances of text appearance. */ - public fun CompositeAppearance.compareTo(another: CompositeAppearance): Boolean { - return Comparing.equal(this, another) - } + public fun CompositeAppearance.compareTo(another: CompositeAppearance): Boolean = + Comparing.equal(this, another) } diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyNodeDescriptor.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyNodeDescriptor.kt index 9af94f0ef..a881af431 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyNodeDescriptor.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyNodeDescriptor.kt @@ -37,11 +37,7 @@ public class RibHierarchyNodeDescriptor( } /** Method used to get the unique id of descriptor. Used for programmatic selection. */ - override fun getUniqueId(): String? { - return ribNode.id - } + override fun getUniqueId(): String? = ribNode.id - override fun toString(): String { - return ribNode.name - } + override fun toString(): String = ribNode.name } diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyTreeStructure.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyTreeStructure.kt index fd5e30e0c..7fdb68b0c 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyTreeStructure.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibHierarchyTreeStructure.kt @@ -41,7 +41,7 @@ public class RibHierarchyTreeStructure( descriptor, RibHierarchyUtils.getPsiClass(project, descriptor.ribHost.name), it, - ), + ) ) } } @@ -53,7 +53,7 @@ public class RibHierarchyTreeStructure( descriptor, RibHierarchyUtils.getPsiClass(project, activity.name), activity, - ), + ) ) } } @@ -64,7 +64,7 @@ public class RibHierarchyTreeStructure( descriptor, RibHierarchyUtils.getPsiClass(project, descriptor.ribActivity.name), descriptor.ribActivity.rootRib, - ), + ) ) } is RibHierarchyNodeDescriptor -> { @@ -75,7 +75,7 @@ public class RibHierarchyTreeStructure( descriptor, RibHierarchyUtils.getPsiClass(project, childRibNode.name), childRibNode, - ), + ) ) } } @@ -87,7 +87,7 @@ public class RibHierarchyTreeStructure( RibHierarchyUtils.getPsiClass(project, view.id), descriptor.ribNode, view, - ), + ) ) } } @@ -99,7 +99,7 @@ public class RibHierarchyTreeStructure( RibHierarchyUtils.getPsiClass(project, view.id), descriptor.ribNode, view, - ), + ) ) } } diff --git a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibViewNodeDescriptor.kt b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibViewNodeDescriptor.kt index ca999c083..4c1305dde 100644 --- a/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibViewNodeDescriptor.kt +++ b/android/tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/RibViewNodeDescriptor.kt @@ -63,13 +63,9 @@ public open class RibViewNodeDescriptor( } /** Method used to get the unique id of descriptor. Used for programmatic selection. */ - override fun getUniqueId(): String? { - return ribView?.id ?: null - } + override fun getUniqueId(): String? = ribView?.id ?: null - override fun toString(): String { - return ribView?.viewId ?: "" - } + override fun toString(): String = ribView?.viewId ?: "" @SuppressWarnings("ReturnCount") override fun getIcon(element: PsiElement): Icon? { @@ -87,7 +83,5 @@ public open class RibViewNodeDescriptor( return AllIcons.General.InspectionsEye } - private fun hasLayoutId(): Boolean { - return ribView != null && ribView.layoutId.isNotEmpty() - } + private fun hasLayoutId(): Boolean = ribView != null && ribView.layoutId.isNotEmpty() } diff --git a/android/tooling/rib-intellij-plugin/src/main/resources/META-INF/plugin.xml b/android/tooling/rib-intellij-plugin/src/main/resources/META-INF/plugin.xml index dbb21199d..c8d21488b 100755 --- a/android/tooling/rib-intellij-plugin/src/main/resources/META-INF/plugin.xml +++ b/android/tooling/rib-intellij-plugin/src/main/resources/META-INF/plugin.xml @@ -1,4 +1,4 @@ - + com.uber.rib.intellij-plugin RIBs 0.1.5 diff --git a/android/tooling/rib-intellij-plugin/src/test/java/com/uber/presidio/intellij_plugin/action/rib/RibGeneratorsTest.java b/android/tooling/rib-intellij-plugin/src/test/java/com/uber/presidio/intellij_plugin/action/rib/RibGeneratorsTest.java index c450a2c08..38e282290 100644 --- a/android/tooling/rib-intellij-plugin/src/test/java/com/uber/presidio/intellij_plugin/action/rib/RibGeneratorsTest.java +++ b/android/tooling/rib-intellij-plugin/src/test/java/com/uber/presidio/intellij_plugin/action/rib/RibGeneratorsTest.java @@ -38,6 +38,8 @@ public class RibGeneratorsTest { @Test @Ignore("https://github.com/JetBrains/gradle-intellij-plugin/issues/1452") public void ribGenerators_shouldGenerateClassesThatCompiler() { + System.out.println(System.getProperty("java.version")); + System.out.println(System.getProperty("java.vendor")); testWithGenerators( Generators.getGeneratorsForRibWithoutPresenterAndView( TEST_PACKAGE_NAME, TEST_RIBLET_NAME, false)); diff --git a/android/tooling/utils/intellij-broadcast-core/build.gradle b/android/tooling/utils/intellij-broadcast-core/build.gradle index ddb95555d..34965eb0f 100644 --- a/android/tooling/utils/intellij-broadcast-core/build.gradle +++ b/android/tooling/utils/intellij-broadcast-core/build.gradle @@ -16,7 +16,7 @@ plugins { id("ribs.kotlin-android-library-conventions") - alias(libs.plugins.mavenPublish) + alias(libs.plugins.maven.publish) } android { diff --git a/android/tooling/utils/intellij-broadcast-core/src/main/java/com/uber/debug/broadcast/core/DebugBroadcastRequest.java b/android/tooling/utils/intellij-broadcast-core/src/main/java/com/uber/debug/broadcast/core/DebugBroadcastRequest.java index ea9f5d36b..444963f55 100644 --- a/android/tooling/utils/intellij-broadcast-core/src/main/java/com/uber/debug/broadcast/core/DebugBroadcastRequest.java +++ b/android/tooling/utils/intellij-broadcast-core/src/main/java/com/uber/debug/broadcast/core/DebugBroadcastRequest.java @@ -22,6 +22,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.Locale; +import java.util.Objects; /** Class representing incoming request to debug broadcast receiver. */ public class DebugBroadcastRequest { @@ -33,17 +34,13 @@ public class DebugBroadcastRequest { private static final String TAG_TEMPLATE = DebugBroadcastReceiver.class.getSimpleName(); private static final Gson GSON = new GsonBuilder().create(); - private int sequence; - private String command; - private @Nullable Bundle extras; + private final int sequence; + private final String command; + private final @Nullable Bundle extras; protected DebugBroadcastRequest(int sequence, @Nullable String command, @Nullable Bundle extras) { this.sequence = sequence; - if (command != null) { - this.command = command; - } else { - this.command = ""; - } + this.command = Objects.requireNonNullElse(command, ""); this.extras = extras; }