diff --git a/documentation/index.md b/documentation/index.md index 424991209..ff9442fa5 100644 --- a/documentation/index.md +++ b/documentation/index.md @@ -66,6 +66,5 @@ ## Experimental features - [Portals](experimental/portals.md) -- RecyclerView hosting - [Jetpack Compose compatibility](experimental/jetpack-compose.md) diff --git a/documentation/setup/deps.md b/documentation/setup/deps.md index f5fa2a4cc..0e3c53e47 100644 --- a/documentation/setup/deps.md +++ b/documentation/setup/deps.md @@ -63,10 +63,3 @@ Rx (optional): ```groovy implementation 'com.github.badoo.RIBs:rib-portal-rx:{latest-version}' ``` - -### Recyclerview integration (experimental) -```groovy -implementation 'com.github.badoo.RIBs:rib-recyclerview:{latest-version}' -``` - - diff --git a/libraries/rib-recyclerview/.gitignore b/libraries/rib-recyclerview/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/libraries/rib-recyclerview/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/libraries/rib-recyclerview/build.gradle b/libraries/rib-recyclerview/build.gradle deleted file mode 100644 index a3cf176d3..000000000 --- a/libraries/rib-recyclerview/build.gradle +++ /dev/null @@ -1,38 +0,0 @@ -configureAndroidLibrary(project) - -android { - namespace 'com.badoo.ribs.android.recyclerview' -} - -dependencies { - api deps.android.appCompat - - implementation deps.apt.javaxInject - - implementation deps.android.recyclerView - compileOnly deps.android.annotations - implementation deps.external.mviCore - implementation deps.external.mviCoreAndroid - implementation deps.external.mviCoreBinder - implementation deps.external.rxrelay2 - implementation deps.external.rxjava2 - implementation project(":libraries:rib-base") - implementation project(':libraries:rib-rx2') - - junitTestImplementation(project) - testImplementation deps.android.annotations - testImplementation deps.test.assertj - testImplementation deps.external.roboelectricBase - testImplementation deps.test.mockitoKotlin - - junitAndroidTestImplementation(project) - androidTestImplementation deps.test.assertj - androidTestImplementation deps.androidTest.espresso - androidTestImplementation deps.androidTest.espressoIntents - androidTestImplementation deps.androidTest.runner - androidTestImplementation deps.androidTest.rules - androidTestImplementation project(":libraries:rib-base-test") - androidTestImplementation project(':libraries:rib-base-test-activity') -} - -apply from: rootProject.file('gradle/gradle-mvn-push.gradle') diff --git a/libraries/rib-recyclerview/consumer-rules.pro b/libraries/rib-recyclerview/consumer-rules.pro deleted file mode 100644 index e69de29bb..000000000 diff --git a/libraries/rib-recyclerview/detekt-baseline.xml b/libraries/rib-recyclerview/detekt-baseline.xml deleted file mode 100644 index ba0129eac..000000000 --- a/libraries/rib-recyclerview/detekt-baseline.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - LongParameterList:Adapter.kt$Adapter$( private val hostingStrategy: RecyclerViewHost.HostingStrategy, initialEntries: List<Entry<T>>? = null, private val routingSource: Pool<T>, private val feature: RecyclerViewHostFeature<T>, private val viewHolderLayoutParams: FrameLayout.LayoutParams ) - LongParameterList:RecyclerViewHostNode.kt$RecyclerViewHostNode$( buildParams: BuildParams<Nothing?>, plugins: List<Plugin>, private val viewDeps: RecyclerViewHostView.Dependency, private val timeCapsule: AndroidTimeCapsule, private val adapter: Adapter<T>, private val connector: NodeConnector<Input<T>, Nothing> = NodeConnector() ) - UnusedImports:RecyclerViewHostView.kt$import android.view.ViewGroup - - diff --git a/libraries/rib-recyclerview/gradle.properties b/libraries/rib-recyclerview/gradle.properties deleted file mode 100644 index 766e26477..000000000 --- a/libraries/rib-recyclerview/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -POM_NAME=RIBs (RecyclerView) -POM_ARTIFACT_ID=rib-recyclerview -POM_PACKAGING=android diff --git a/libraries/rib-recyclerview/proguard-rules.pro b/libraries/rib-recyclerview/proguard-rules.pro deleted file mode 100644 index f1b424510..000000000 --- a/libraries/rib-recyclerview/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/Adapter.kt b/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/Adapter.kt deleted file mode 100644 index 1101b4ea6..000000000 --- a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/Adapter.kt +++ /dev/null @@ -1,130 +0,0 @@ -package com.badoo.ribs.android.recyclerview - -import android.os.Parcelable -import android.view.View -import android.view.ViewGroup -import android.widget.FrameLayout -import androidx.recyclerview.widget.RecyclerView -import com.badoo.ribs.android.AndroidRibViewHost -import com.badoo.ribs.android.recyclerview.RecyclerViewHost.HostingStrategy.EAGER -import com.badoo.ribs.android.recyclerview.RecyclerViewHost.HostingStrategy.LAZY -import com.badoo.ribs.android.recyclerview.RecyclerViewHost.Input -import com.badoo.ribs.android.recyclerview.RecyclerViewHostFeature.State.Entry -import com.badoo.ribs.annotation.ExperimentalApi -import com.badoo.ribs.core.Node -import com.badoo.ribs.core.view.RibView -import com.badoo.ribs.routing.Routing -import com.badoo.ribs.routing.activator.ChildActivator -import com.badoo.ribs.routing.source.impl.Pool -import com.badoo.ribs.routing.source.impl.Pool.Item -import com.badoo.ribs.util.RIBs.errorHandler -import io.reactivex.functions.Consumer -import java.lang.ref.WeakReference - -@ExperimentalApi -internal class Adapter( - private val hostingStrategy: RecyclerViewHost.HostingStrategy, - initialEntries: List>? = null, - private val routingSource: Pool, - private val feature: RecyclerViewHostFeature, - private val viewHolderLayoutParams: FrameLayout.LayoutParams -) : RecyclerView.Adapter(), - Consumer>, - ChildActivator { - - private val holders: MutableMap> = hashMapOf() - - class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var identifier: Routing.Identifier? = null - var host: RibView = AndroidRibViewHost(itemView as FrameLayout) - } - - private var items: List> = initialEntries ?: emptyList() - - override fun getItemCount(): Int = - items.size - - override fun accept(state: RecyclerViewHostFeature.State) { - items = state.items - - when (state.lastCommand) { - null -> { /* No-op when restored from TimeCapsule or genuinely empty state */ } - is Input.Add -> { - addIfEager(state.items.last()) - notifyItemInserted(state.items.lastIndex) - } - } - } - - private fun addIfEager(entry: Entry) { - if (hostingStrategy == EAGER) { - routingSource.add( - Item( - configuration = entry.element, - identifier = entry.identifier, - isActive = false - ) - ) - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = - ViewHolder( - FrameLayout(parent.context).apply { - layoutParams = viewHolderLayoutParams - } - ) - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val entry = items[position] - holder.identifier = entry.identifier - } - - override fun onViewAttachedToWindow(holder: ViewHolder) { - super.onViewAttachedToWindow(holder) - val identifier = holder.identifier!! // at this point it should be bound - holders[identifier] = WeakReference(holder) - - if (hostingStrategy == LAZY) { - val entry = feature.state.items.find { it.identifier == identifier }!! - routingSource.add( - Item( - configuration = entry.element, - identifier = entry.identifier, - isActive = false - ) - ) - } - - routingSource.activate(identifier) - } - - override fun activate(routing: Routing, child: Node<*>) { - viewForRouting(routing)?.attachChild(child) - ?: errorHandler.handleNonFatalError("Holder is gone! Routing: $routing, child: $child") - } - - override fun onViewRecycled(holder: ViewHolder) { - super.onViewRecycled(holder) - holder.identifier?.let { identifier -> - routingSource.deactivate(identifier) - if (hostingStrategy == LAZY) { - routingSource.remove(identifier) - } - } ?: errorHandler.handleNonFatalError("Holder is not bound! holder: $holder") - } - - internal fun onDestroy() { - items.forEach { - routingSource.deactivate(it.identifier) - } - } - - override fun deactivate(routing: Routing, child: Node<*>) { - child.saveViewState() - viewForRouting(routing)?.detachChild(child) - } - - private fun viewForRouting(routing: Routing): RibView? = - holders[routing.identifier]?.get()?.host -} diff --git a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHost.kt b/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHost.kt deleted file mode 100644 index a7174e28e..000000000 --- a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHost.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.badoo.ribs.android.recyclerview - -import android.content.Context -import android.os.Parcelable -import android.widget.FrameLayout -import androidx.recyclerview.widget.RecyclerView -import com.badoo.ribs.android.recyclerview.RecyclerViewHost.Input -import com.badoo.ribs.rx2.clienthelper.connector.Connectable -import com.badoo.ribs.annotation.ExperimentalApi -import com.badoo.ribs.core.Rib -import com.badoo.ribs.routing.resolver.RoutingResolver -import kotlinx.parcelize.Parcelize - -@ExperimentalApi -interface RecyclerViewHost: Rib, Connectable, Nothing> { - - @ExperimentalApi - interface Dependency { - val hostingStrategy: HostingStrategy - val initialElements: List - val resolver: RoutingResolver - val recyclerViewFactory: RecyclerViewFactory - val layoutManagerFactory: LayoutManagerFactory - val viewHolderLayoutParams: FrameLayout.LayoutParams - } - - @ExperimentalApi - enum class HostingStrategy { - /** - * Child RIBs get created immediately and are only destroyed along with host - */ - EAGER, - - /** - * Child RIBs get created when their associated ViewHolders are attached, and get destroyed - * along with them - */ - LAZY - } - - @ExperimentalApi - sealed class Input : Parcelable { - @Parcelize - data class Add(val element: T): Input() - } -} - -typealias RecyclerViewFactory = (Context) -> RecyclerView - -typealias LayoutManagerFactory = (Context) -> RecyclerView.LayoutManager diff --git a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostBuilder.kt b/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostBuilder.kt deleted file mode 100644 index 9cf90d5de..000000000 --- a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostBuilder.kt +++ /dev/null @@ -1,70 +0,0 @@ -package com.badoo.ribs.android.recyclerview - -import android.os.Parcelable -import com.badoo.mvicore.android.AndroidTimeCapsule -import com.badoo.ribs.annotation.ExperimentalApi -import com.badoo.ribs.builder.SimpleBuilder -import com.badoo.ribs.core.modality.BuildParams -import com.badoo.ribs.routing.router.RouterByDelegate -import com.badoo.ribs.routing.source.impl.Pool -import com.badoo.ribs.rx2.disposables - -@ExperimentalApi -class RecyclerViewHostBuilder( - private val dependency: RecyclerViewHost.Dependency -) : SimpleBuilder>() { - - @SuppressWarnings("LongMethod") - override fun build(buildParams: BuildParams): RecyclerViewHost { - val timeCapsule = AndroidTimeCapsule(buildParams.savedInstanceState) - - val routingSource = Pool( - allowRepeatingConfigurations = true, - buildParams = buildParams - ) - - val feature = RecyclerViewHostFeature( - timeCapsule = timeCapsule, - initialElements = dependency.initialElements - ) - - val adapter = Adapter( - hostingStrategy = dependency.hostingStrategy, - initialEntries = feature.state.items, - routingSource = routingSource, - feature = feature, - viewHolderLayoutParams = dependency.viewHolderLayoutParams - ) - - val router = RouterByDelegate( - buildParams = buildParams, - routingSource = routingSource, - resolver = dependency.resolver, - clientChildActivator = adapter - ) - - val interactor = RecyclerViewHostInteractor( - buildParams = buildParams, - feature = feature, - adapter = adapter - ) - - val viewDeps = object : RecyclerViewHostView.Dependency { - override fun adapter(): Adapter<*> = adapter - override fun recyclerViewFactory(): RecyclerViewFactory = dependency.recyclerViewFactory - override fun layoutManagerFactory(): LayoutManagerFactory = dependency.layoutManagerFactory - } - - return RecyclerViewHostNode( - buildParams = buildParams, - plugins = listOf( - router, - interactor, - disposables(feature) - ), - viewDeps = viewDeps, - timeCapsule = timeCapsule, - adapter = adapter - ) - } -} diff --git a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostFeature.kt b/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostFeature.kt deleted file mode 100644 index 4d274ab12..000000000 --- a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostFeature.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.badoo.ribs.android.recyclerview - -import android.os.Parcelable -import com.badoo.mvicore.element.Bootstrapper -import com.badoo.mvicore.element.Reducer -import com.badoo.mvicore.element.TimeCapsule -import com.badoo.mvicore.feature.ReducerFeature -import com.badoo.ribs.android.recyclerview.RecyclerViewHost.Input -import com.badoo.ribs.android.recyclerview.RecyclerViewHostFeature.State -import com.badoo.ribs.routing.Routing -import io.reactivex.Observable -import kotlinx.parcelize.Parcelize -import java.util.* - -private val timeCapsuleKey = "RecyclerViewHostFeature" -private fun TimeCapsule>.initialState(): State = - (get(timeCapsuleKey) ?: State()) - - -internal class RecyclerViewHostFeature( - timeCapsule: TimeCapsule>, - initialElements: List -) : ReducerFeature, State, Nothing>( - initialState = timeCapsule.initialState(), - bootstrapper = BootstrapperImpl(timeCapsule.initialState(), initialElements), - reducer = ReducerImpl() -) { - init { - timeCapsule.register(timeCapsuleKey) { - state.copy( - lastCommand = null - ) - } - } - - @Parcelize - data class State( - val items: List> = emptyList(), - val lastCommand: Input? = null - ) : Parcelable { - - @Parcelize - data class Entry( - val element: T, - val identifier: Routing.Identifier - ) : Parcelable - } - - class BootstrapperImpl( - private val initialState: State, - private val initialElements: List - ) : Bootstrapper> { - override fun invoke(): Observable> = - Observable - .fromIterable(if (initialState.items.isEmpty()) initialElements else emptyList()) - .map { - Input.Add(it) - } - } - - class ReducerImpl : Reducer, Input> { - override fun invoke(state: State, input: Input): State = when (input) { - is Input.Add -> { - val uuid = UUID.randomUUID() - state.copy( - lastCommand = input, - items = state.items + State.Entry( - element = input.element, - identifier = Routing.Identifier(uuid) - ) - ) - } - } - } -} diff --git a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostInteractor.kt b/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostInteractor.kt deleted file mode 100644 index c1ff9c5c4..000000000 --- a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostInteractor.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.badoo.ribs.android.recyclerview - -import android.os.Parcelable -import androidx.lifecycle.Lifecycle -import com.badoo.mvicore.android.lifecycle.createDestroy -import com.badoo.ribs.clienthelper.interactor.Interactor -import com.badoo.ribs.core.modality.BuildParams -import com.badoo.ribs.core.view.RibView - -internal class RecyclerViewHostInteractor( - buildParams: BuildParams<*>, - private val feature: RecyclerViewHostFeature, - private val adapter: Adapter -) : Interactor, RibView>( - buildParams = buildParams -) { - - override fun onCreate(nodeLifecycle: Lifecycle) { - nodeLifecycle.createDestroy { - bind(feature to adapter) // TODO consider viewLifecycle - bind(rib.input to feature) - } - } -} diff --git a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostNode.kt b/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostNode.kt deleted file mode 100644 index 2ad04d39d..000000000 --- a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostNode.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.badoo.ribs.android.recyclerview - -import android.os.Bundle -import android.os.Parcelable -import com.badoo.mvicore.android.AndroidTimeCapsule -import com.badoo.ribs.android.recyclerview.RecyclerViewHost.Input -import com.badoo.ribs.rx2.clienthelper.connector.Connectable -import com.badoo.ribs.rx2.clienthelper.connector.NodeConnector -import com.badoo.ribs.core.Node -import com.badoo.ribs.core.modality.BuildParams -import com.badoo.ribs.core.plugin.Plugin -import com.badoo.ribs.core.view.RibView - -internal class RecyclerViewHostNode( - buildParams: BuildParams, - plugins: List, - private val viewDeps: RecyclerViewHostView.Dependency, - private val timeCapsule: AndroidTimeCapsule, - private val adapter: Adapter, - private val connector: NodeConnector, Nothing> = NodeConnector() -) : Node( - buildParams = buildParams, - viewFactory = { RecyclerViewHostViewImpl.Factory().invoke(viewDeps).invoke(it) }, - plugins = plugins -), RecyclerViewHost, Connectable, Nothing> by connector { - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - timeCapsule.saveState(outState) - } - - override fun onDestroy(isRecreating: Boolean) { - adapter.onDestroy() - super.onDestroy(isRecreating) - } -} diff --git a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostView.kt b/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostView.kt deleted file mode 100644 index cb3581026..000000000 --- a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/RecyclerViewHostView.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.badoo.ribs.android.recyclerview - -import androidx.recyclerview.widget.RecyclerView -import com.badoo.ribs.android.recyclerview.RecyclerViewHostView.Dependency -import com.badoo.ribs.core.view.AndroidRibView -import com.badoo.ribs.core.view.RibView -import com.badoo.ribs.core.view.ViewFactory -import com.badoo.ribs.core.view.ViewFactoryBuilder - - -internal interface RecyclerViewHostView : RibView { - - interface Factory : ViewFactoryBuilder - - interface Dependency { - fun adapter(): Adapter<*> - fun recyclerViewFactory(): RecyclerViewFactory - fun layoutManagerFactory(): LayoutManagerFactory - } -} - -internal class RecyclerViewHostViewImpl private constructor( - override val androidView: RecyclerView -) : AndroidRibView(), - RecyclerViewHostView { - - class Factory : RecyclerViewHostView.Factory { - override fun invoke(deps: Dependency): ViewFactory = ViewFactory { - RecyclerViewHostViewImpl( - androidView = deps - .recyclerViewFactory() - .invoke(it.parent.androidView.context) - .apply { - adapter = deps.adapter() - layoutManager = - deps - .layoutManagerFactory() - .invoke(it.parent.androidView.context) - } - ) - } - } -} diff --git a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/routing/resolution/RecyclerViewItemResolution.kt b/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/routing/resolution/RecyclerViewItemResolution.kt deleted file mode 100644 index 5d72294ac..000000000 --- a/libraries/rib-recyclerview/src/main/java/com/badoo/ribs/android/recyclerview/routing/resolution/RecyclerViewItemResolution.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.badoo.ribs.android.recyclerview.routing.resolution - -import com.badoo.ribs.core.Rib -import com.badoo.ribs.core.modality.ActivationMode -import com.badoo.ribs.core.modality.BuildContext -import com.badoo.ribs.routing.resolution.RibFactory -import com.badoo.ribs.routing.resolution.Resolution - -open class RecyclerViewItemResolution( - private val ribFactory: RibFactory -) : Resolution { - - override val numberOfNodes: Int = 1 - - override fun buildNodes(buildContexts: List): List = - listOf( - ribFactory.invoke( - buildContexts.first().copy( - activationMode = ActivationMode.CLIENT - ) - ) - ) - - companion object { - fun recyclerView(ribFactory: RibFactory): Resolution = - RecyclerViewItemResolution( - ribFactory - ) - } -} diff --git a/sandbox/build.gradle b/sandbox/build.gradle index d484cbe29..f411216ff 100644 --- a/sandbox/build.gradle +++ b/sandbox/build.gradle @@ -76,7 +76,6 @@ dependencies { implementation project(":libraries:rib-debug-utils") implementation project(":libraries:rib-mvicore") implementation project(':libraries:rib-portal-rx2') - implementation project(":libraries:rib-recyclerview") implementation project(':libraries:rib-rx2') junitTestImplementation(project) diff --git a/sandbox/src/main/java/com/badoo/ribs/sandbox/app/RecyclerViewTestActivity.kt b/sandbox/src/main/java/com/badoo/ribs/sandbox/app/RecyclerViewTestActivity.kt deleted file mode 100644 index 8cbcfb2a3..000000000 --- a/sandbox/src/main/java/com/badoo/ribs/sandbox/app/RecyclerViewTestActivity.kt +++ /dev/null @@ -1,120 +0,0 @@ -package com.badoo.ribs.sandbox.app - -import android.os.Bundle -import android.os.Parcelable -import android.view.ViewGroup -import android.widget.FrameLayout -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.badoo.ribs.android.RibActivity -import com.badoo.ribs.android.activitystarter.ActivityStarter -import com.badoo.ribs.android.dialog.DialogLauncher -import com.badoo.ribs.android.permissionrequester.PermissionRequester -import com.badoo.ribs.android.recyclerview.LayoutManagerFactory -import com.badoo.ribs.android.recyclerview.RecyclerViewFactory -import com.badoo.ribs.android.recyclerview.RecyclerViewHost -import com.badoo.ribs.android.recyclerview.RecyclerViewHost.HostingStrategy.EAGER -import com.badoo.ribs.android.recyclerview.RecyclerViewHost.Input.Add -import com.badoo.ribs.android.recyclerview.RecyclerViewHostBuilder -import com.badoo.ribs.android.recyclerview.routing.resolution.RecyclerViewItemResolution.Companion.recyclerView -import com.badoo.ribs.core.Node -import com.badoo.ribs.core.Rib -import com.badoo.ribs.core.modality.BuildContext.Companion.root -import com.badoo.ribs.routing.Routing -import com.badoo.ribs.routing.resolution.Resolution -import com.badoo.ribs.routing.resolver.RoutingResolver -import com.badoo.ribs.sandbox.R -import com.badoo.ribs.sandbox.rib.foo_bar.FooBar -import com.badoo.ribs.sandbox.rib.foo_bar.FooBarBuilder -import com.badoo.ribs.sandbox.rib.lorem_ipsum.LoremIpsum -import com.badoo.ribs.sandbox.rib.lorem_ipsum.LoremIpsumBuilder -import com.badoo.ribs.sandbox.rib.switcher.Switcher -import com.badoo.ribs.sandbox.rib.switcher.SwitcherBuilder -import com.badoo.ribs.sandbox.util.CoffeeMachine -import com.badoo.ribs.sandbox.util.StupidCoffeeMachine -import kotlinx.parcelize.Parcelize - -/** The sample app's single activity */ -class RecyclerViewTestActivity : RibActivity() { - - // We'll put these into the RecyclerView by resolving them to builders (see below) - sealed class Item : Parcelable { - @Parcelize object LoremIpsumItem : Item() - @Parcelize object FooBarItem : Item() - @Parcelize object Switcher : Item() - } - - override fun onCreate(savedInstanceState: Bundle?) { - setContentView(R.layout.activity_root) - super.onCreate(savedInstanceState) - } - - override val rootViewGroup: ViewGroup - get() = findViewById(R.id.root) - - private val fooBarBuilder = FooBarBuilder(object : FooBar.Dependency { - override val permissionRequester: PermissionRequester = integrationPoint.permissionRequester - }) - - private val loremIpsumBuilder = LoremIpsumBuilder(object : LoremIpsum.Dependency {}) - - private val noopPortal = object : com.badoo.ribs.portal.Portal.OtherSide { - override fun showContent(remoteNode: Node<*>, remoteConfiguration: Parcelable) { - // Sorry, no-op - } - - override fun showOverlay(remoteNode: Node<*>, remoteConfiguration: Parcelable) { - // Sorry, no-op - } - } - - private val switcherBuilder = - SwitcherBuilder( - object : Switcher.Dependency { - override val activityStarter: ActivityStarter = integrationPoint.activityStarter - override val permissionRequester: PermissionRequester = - integrationPoint.permissionRequester - override val dialogLauncher: DialogLauncher = integrationPoint.dialogLauncher - override val coffeeMachine: CoffeeMachine = StupidCoffeeMachine() - override val portal: com.badoo.ribs.portal.Portal.OtherSide = noopPortal - } - ) - - private val resolver = object : RoutingResolver { - override fun resolve(routing: Routing): Resolution = - when (routing.configuration) { - Item.LoremIpsumItem -> recyclerView { loremIpsumBuilder.build(it) } - Item.FooBarItem -> recyclerView { fooBarBuilder.build(it) } - Item.Switcher-> recyclerView { switcherBuilder.build(it) } - } - } - - private val initialElements = listOf( - Item.FooBarItem - ) - - private lateinit var recyclerViewHost: RecyclerViewHost - - override fun createRib(savedInstanceState: Bundle?): Rib = - RecyclerViewHostBuilder( - object : RecyclerViewHost.Dependency { - override val hostingStrategy: RecyclerViewHost.HostingStrategy = EAGER - override val initialElements: List = this@RecyclerViewTestActivity.initialElements - override val resolver: RoutingResolver = this@RecyclerViewTestActivity.resolver - override val recyclerViewFactory: RecyclerViewFactory = ::RecyclerView - override val layoutManagerFactory: LayoutManagerFactory = ::LinearLayoutManager - override val viewHolderLayoutParams: FrameLayout.LayoutParams = - FrameLayout.LayoutParams( - FrameLayout.LayoutParams.MATCH_PARENT, - FrameLayout.LayoutParams.WRAP_CONTENT - ) - } - ).build(root(savedInstanceState)).also { - recyclerViewHost = it - } - - override fun onResume() { - super.onResume() - recyclerViewHost.input.accept(Add(Item.LoremIpsumItem)) - } -} diff --git a/settings.gradle b/settings.gradle index 7d2fc8565..4b6dc5dc8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,6 @@ include ':libraries:rib-debug-utils' include ':libraries:rib-mvicore' include ':libraries:rib-portal' include ':libraries:rib-portal-rx2' -include ':libraries:rib-recyclerview' include ':libraries:rib-rx2' include ':samples:app:hello-world'