Skip to content

Commit

Permalink
Use Cancellation in NavigationSource and Relay
Browse files Browse the repository at this point in the history
  • Loading branch information
arkivanov committed Jan 22, 2024
1 parent f52ed09 commit a9913f7
Show file tree
Hide file tree
Showing 10 changed files with 23 additions and 46 deletions.
6 changes: 2 additions & 4 deletions decompose/api/android/decompose.api
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,7 @@ public abstract interface class com/arkivanov/decompose/router/children/NavState
}

public abstract interface class com/arkivanov/decompose/router/children/NavigationSource {
public abstract fun subscribe (Lkotlin/jvm/functions/Function1;)V
public abstract fun unsubscribe (Lkotlin/jvm/functions/Function1;)V
public abstract fun subscribe (Lkotlin/jvm/functions/Function1;)Lcom/arkivanov/decompose/Cancellation;
}

public final class com/arkivanov/decompose/router/children/SimpleChildNavState : com/arkivanov/decompose/router/children/ChildNavState {
Expand All @@ -131,8 +130,7 @@ public final class com/arkivanov/decompose/router/children/SimpleChildNavState :
public final class com/arkivanov/decompose/router/children/SimpleNavigation : com/arkivanov/decompose/router/children/NavigationSource {
public fun <init> ()V
public final fun navigate (Ljava/lang/Object;)V
public fun subscribe (Lkotlin/jvm/functions/Function1;)V
public fun unsubscribe (Lkotlin/jvm/functions/Function1;)V
public fun subscribe (Lkotlin/jvm/functions/Function1;)Lcom/arkivanov/decompose/Cancellation;
}

public final class com/arkivanov/decompose/router/pages/ChildPages {
Expand Down
6 changes: 2 additions & 4 deletions decompose/api/jvm/decompose.api
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,7 @@ public abstract interface class com/arkivanov/decompose/router/children/NavState
}

public abstract interface class com/arkivanov/decompose/router/children/NavigationSource {
public abstract fun subscribe (Lkotlin/jvm/functions/Function1;)V
public abstract fun unsubscribe (Lkotlin/jvm/functions/Function1;)V
public abstract fun subscribe (Lkotlin/jvm/functions/Function1;)Lcom/arkivanov/decompose/Cancellation;
}

public final class com/arkivanov/decompose/router/children/SimpleChildNavState : com/arkivanov/decompose/router/children/ChildNavState {
Expand All @@ -115,8 +114,7 @@ public final class com/arkivanov/decompose/router/children/SimpleChildNavState :
public final class com/arkivanov/decompose/router/children/SimpleNavigation : com/arkivanov/decompose/router/children/NavigationSource {
public fun <init> ()V
public final fun navigate (Ljava/lang/Object;)V
public fun subscribe (Lkotlin/jvm/functions/Function1;)V
public fun unsubscribe (Lkotlin/jvm/functions/Function1;)V
public fun subscribe (Lkotlin/jvm/functions/Function1;)Lcom/arkivanov/decompose/Cancellation;
}

public final class com/arkivanov/decompose/router/pages/ChildPages {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,11 @@ internal class Relay<T>(
}
}

fun subscribe(observer: (T) -> Unit) {
fun subscribe(observer: (T) -> Unit): Cancellation {
lock.synchronized { observers += observer }
}

fun unsubscribe(observer: (T) -> Unit) {
lock.synchronized { observers -= observer }
return Cancellation {
lock.synchronized { observers -= observer }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -166,19 +166,17 @@ fun <C : Any, T : Any, E : Any, N : NavState<C>, S : Any> ComponentContext.child

mainBackHandler.register(backCallback)

val eventObserver: (E) -> Unit =
{ event ->
val cancellation =
source.subscribe { event ->
val oldState = navigator.navState
navigator.navigate(navState = navTransformer(navigator.navState, event))
val newState = navigator.navState
onAfterNavigate(newState, oldState)
onEventComplete(event, newState, oldState)
}

source.subscribe(eventObserver)

lifecycle.doOnDestroy {
source.unsubscribe(eventObserver)
cancellation.cancel()
stateKeeper.unregister(key = key)
mainBackHandler.unregister(backCallback)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.arkivanov.decompose.router.children

import com.arkivanov.decompose.Cancellation

/**
* Represents a generic source of navigation events.
*
* @see [children]
*/
interface NavigationSource<out T : Any> {

fun subscribe(observer: (T) -> Unit)

fun unsubscribe(observer: (T) -> Unit)
fun subscribe(observer: (T) -> Unit): Cancellation
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.arkivanov.decompose.router.children

import com.arkivanov.decompose.Cancellation
import com.arkivanov.decompose.Relay

/**
Expand All @@ -10,13 +11,8 @@ class SimpleNavigation<T : Any> : NavigationSource<T> {

private val relay = Relay<T>(isMainThreadCheckEnabled = true)

override fun subscribe(observer: (T) -> Unit) {
override fun subscribe(observer: (T) -> Unit): Cancellation =
relay.subscribe(observer)
}

override fun unsubscribe(observer: (T) -> Unit) {
relay.unsubscribe(observer)
}

/**
* Broadcasts the navigation event to every subscribed observer.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
package com.arkivanov.decompose.router.pages

import com.arkivanov.decompose.Cancellation
import com.arkivanov.decompose.Relay
import com.arkivanov.decompose.router.pages.PagesNavigationSource.Event

internal class DefaultPagesNavigation<C : Any> : PagesNavigation<C> {

private val relay = Relay<Event<C>>()

override fun subscribe(observer: (Event<C>) -> Unit) {
override fun subscribe(observer: (Event<C>) -> Unit): Cancellation =
relay.subscribe(observer)
}

override fun unsubscribe(observer: (Event<C>) -> Unit) {
relay.unsubscribe(observer)
}

override fun navigate(transformer: (Pages<C>) -> Pages<C>, onComplete: (newPages: Pages<C>, oldPages: Pages<C>) -> Unit) {
relay.accept(Event(transformer, onComplete))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.arkivanov.decompose.router.slot

import com.arkivanov.decompose.Cancellation
import com.arkivanov.decompose.Relay
import com.arkivanov.decompose.router.slot.SlotNavigationSource.Event

Expand All @@ -14,11 +15,6 @@ internal class DefaultSlotNavigation<C : Any> : SlotNavigation<C> {
relay.accept(Event(transformer, onComplete))
}

override fun subscribe(observer: (Event<C>) -> Unit) {
override fun subscribe(observer: (Event<C>) -> Unit): Cancellation =
relay.subscribe(observer)
}

override fun unsubscribe(observer: (Event<C>) -> Unit) {
relay.unsubscribe(observer)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.arkivanov.decompose.router.stack

import com.arkivanov.decompose.Cancellation
import com.arkivanov.decompose.Relay
import com.arkivanov.decompose.router.stack.StackNavigationSource.Event

Expand All @@ -11,11 +12,6 @@ internal class DefaultStackNavigation<C : Any> : StackNavigation<C> {
relay.accept(Event(transformer, onComplete))
}

override fun subscribe(observer: (Event<C>) -> Unit) {
override fun subscribe(observer: (Event<C>) -> Unit): Cancellation =
relay.subscribe(observer)
}

override fun unsubscribe(observer: (Event<C>) -> Unit) {
relay.unsubscribe(observer)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@ class RelayTest {
val relay = Relay<Int>()
var isEmitted = false
val observer: (Int) -> Unit = { isEmitted = true }
relay.subscribe(observer)
relay.unsubscribe(observer)
relay.subscribe(observer).cancel()

relay.accept(1)

Expand Down

0 comments on commit a9913f7

Please sign in to comment.