Skip to content

Commit d2370fc

Browse files
committed
Introduced ability to override AndroidMainThreadFeatureScheduler via plugin
1 parent 0c81cb4 commit d2370fc

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed

mvicore-android/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ android {
3030
}
3131

3232
testOptions {
33+
unitTests.isReturnDefaultValues = true
3334
unitTests.all {
3435
it.useJUnitPlatform()
3536
}

mvicore-android/src/main/java/com/badoo/mvicore/android/AndroidMainThreadFeatureScheduler.kt

+21-3
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,29 @@ import io.reactivex.android.schedulers.AndroidSchedulers
1111
*
1212
* It also uses the 'isOnFeatureThread' field to avoid observing on the main thread if it is already
1313
* the current thread.
14+
*
15+
* To help facilitate testing, you can override the scheduler using
16+
* [MviCoreAndroidPlugins.setMainThreadFeatureScheduler]
1417
*/
15-
object AndroidMainThreadFeatureScheduler: FeatureScheduler {
18+
object AndroidMainThreadFeatureScheduler : FeatureScheduler {
19+
private val featureSchedulerDelegate: FeatureScheduler
20+
get() = MviCoreAndroidPlugins.mainThreadFeatureScheduler
21+
1622
override val scheduler: Scheduler
17-
get() = AndroidSchedulers.mainThread()
23+
get() = featureSchedulerDelegate.scheduler
1824

1925
override val isOnFeatureThread: Boolean
20-
get() = Looper.myLooper() == Looper.getMainLooper()
26+
get() = featureSchedulerDelegate.isOnFeatureThread
27+
28+
/**
29+
* The default implementation of the [AndroidMainThreadFeatureScheduler] which delegates to the
30+
* RxAndroid main thread scheduler
31+
*/
32+
object Default : FeatureScheduler {
33+
override val scheduler: Scheduler
34+
get() = AndroidSchedulers.mainThread()
35+
36+
override val isOnFeatureThread: Boolean
37+
get() = Looper.myLooper() == Looper.getMainLooper()
38+
}
2139
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.badoo.mvicore.android
2+
3+
import com.badoo.mvicore.feature.FeatureScheduler
4+
5+
/**
6+
* Allows customisation of the MVICore Android integration.
7+
*/
8+
object MviCoreAndroidPlugins {
9+
@Volatile
10+
var mainThreadFeatureScheduler: FeatureScheduler = AndroidMainThreadFeatureScheduler.Default
11+
12+
/**
13+
* Overrides the [AndroidMainThreadFeatureScheduler].
14+
*/
15+
fun setMainThreadFeatureScheduler(schedulerProvider: () -> FeatureScheduler) {
16+
mainThreadFeatureScheduler = schedulerProvider()
17+
}
18+
19+
/**
20+
* Resets the plugins back to the original state.
21+
*/
22+
fun reset() {
23+
mainThreadFeatureScheduler = AndroidMainThreadFeatureScheduler.Default
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.badoo.mvicore.android.lifecycle
2+
3+
import com.badoo.mvicore.android.AndroidMainThreadFeatureScheduler
4+
import com.badoo.mvicore.android.MviCoreAndroidPlugins
5+
import com.badoo.mvicore.feature.FeatureSchedulers
6+
import io.reactivex.android.schedulers.AndroidSchedulers
7+
import io.reactivex.schedulers.Schedulers
8+
import org.junit.jupiter.api.AfterEach
9+
import org.junit.jupiter.api.Assertions.assertSame
10+
import org.junit.jupiter.api.Test
11+
12+
class AndroidMainThreadFeatureSchedulerTest {
13+
@AfterEach
14+
fun after() {
15+
MviCoreAndroidPlugins.reset()
16+
}
17+
18+
@Test
19+
fun `GIVEN android main scheduler not overridden WHEN scheduler accessed THEN scheduler is android main thread scheduler`() {
20+
assertSame(AndroidSchedulers.mainThread(), AndroidMainThreadFeatureScheduler.scheduler)
21+
}
22+
23+
@Test
24+
fun `GIVEN android main scheduler overridden with trampoline feature scheduler WHEN scheduler accessed THEN scheduler is trampoline scheduler`() {
25+
MviCoreAndroidPlugins.setMainThreadFeatureScheduler { FeatureSchedulers.TrampolineFeatureScheduler }
26+
27+
assertSame(Schedulers.trampoline(), AndroidMainThreadFeatureScheduler.scheduler)
28+
}
29+
30+
@Test
31+
fun `GIVEN android main scheduler overridden with trampoline feature scheduler AND reset WHEN scheduler accessed THEN scheduler is android main thread scheduler`() {
32+
MviCoreAndroidPlugins.setMainThreadFeatureScheduler { FeatureSchedulers.TrampolineFeatureScheduler }
33+
MviCoreAndroidPlugins.reset()
34+
35+
assertSame(AndroidSchedulers.mainThread(), AndroidMainThreadFeatureScheduler.scheduler)
36+
}
37+
}

0 commit comments

Comments
 (0)