Skip to content

Instantly share code, notes, and snippets.

View sergei-lapin's full-sized avatar

Sergey Lapin sergei-lapin

  • Vivid Money
  • Berlin, Germany
View GitHub Profile
@sergei-lapin
sergei-lapin / Mediator.kt
Created September 4, 2018 07:29
Mediator interface
interface Mediator {
fun getFlowIntent(context: Context, flow: Flow): Intent
}
@sergei-lapin
sergei-lapin / Flows.kt
Last active October 6, 2018 22:34
Sealed class that represents flows that we have in our app
sealed class Flow {
object MainFlow : Flow
class FeatureFlow(data: SomeDataType) : Flow
}
@sergei-lapin
sergei-lapin / FlowIntentProviders.kt
Last active September 9, 2018 10:58
Interfaces that define methods for flow intent provision
interface MainFlowIntentProvider : SimpleFlowIntentProvider
interface FeatureFlowIntentProvider : DataFlowIntentProvider<SomeDataType>
@sergei-lapin
sergei-lapin / NavigationMediator.kt
Last active September 9, 2018 17:50
Mediator interface implementation placed in `mediator` module
internal class NavigationMediator(
private val mainFlowIntentProvider: MainFlowIntentProvider,
private val featureFlowIntentProvider: FeatureFlowIntentProvider
) : Mediator {
override fun getFlowIntent(context: Context, flow: Flow): Intent = when (flow) {
is MainFlow -> mainFlowIntentProvider.getFlowIntent(context)
is FeatureFlow -> featureFlowIntentProvider.getFlowIntent(context, flow.data)
}
}
interface SimpleFlowIntentProvider {
fun getFlowIntent(context: Context): Intent
}
interface DataFlowIntentProvider<Data> where Data : Any {
fun getFlowIntent(context: Context, data: Data): Intent
}
class StartFlow(val flow: Flow) : Command
class FinishFlow(val transitionData: Any?) : Command
class FlowRouter : Router() {
fun startFlow(flow: Flow) {
executeCommands(StartFlow(flow))
}
fun finishFlow(data: Any? = null) {
abstract class BaseActivity : AppCompatActivity() {
private val navigatorHolder: NavigatorHolder by inject()
protected val mediator: NavigationMediator by inject()
protected abstract val navigator: Navigator
override fun onResumeFragments() {
super.onResumeFragments()
navigatorHolder.setNavigator(navigator)
val coreModule = module(ROOT_SCOPE) {
val cicerone = Cicerone.create(FlowRouter())
single<Router> { cicerone.router }
single<FlowRouter> { cicerone.router }
single<NavigatorHolder> { cicerone.navigatorHolder }
}
val mediatorModule = module(ROOT_SCOPE) {
single<Mediator> { NavigationMediator(get(), get()) }
}
internal class MainFlowIntentProviderImpl : MainFlowIntentProvider {
override fun getFlowIntent(context: Context): Intent = context.getFlowIntentFor<MainActivity>()
}