diff --git a/core/build.gradle b/core/build.gradle
index 756ba92af..efdb6939d 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -42,7 +42,7 @@ android {
}
dependencies {
- api libs.appTreeUtils
+ api project(':customisations')
api libs.kotlin.coroutines.android
api libs.androidx.lifecycle.common
api libs.compose.animation.core
diff --git a/customisations/.gitignore b/customisations/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/customisations/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/customisations/build.gradle b/customisations/build.gradle
new file mode 100644
index 000000000..c21d67733
--- /dev/null
+++ b/customisations/build.gradle
@@ -0,0 +1,25 @@
+plugins {
+ id 'com.android.library'
+ id 'org.jetbrains.kotlin.android'
+}
+
+apply from: '../gradle/publication.gradle'
+
+android {
+ namespace = "com.bumble.appyx.utils"
+ compileSdk 32
+
+ defaultConfig {
+ minSdk 21
+ targetSdk 32
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_1_8
+ }
+}
diff --git a/customisations/src/main/AndroidManifest.xml b/customisations/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..8072ee00d
--- /dev/null
+++ b/customisations/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/customisations/src/main/java/com/bumble/appyx/utils/customisations/MutableNodeCustomisationDirectory.kt b/customisations/src/main/java/com/bumble/appyx/utils/customisations/MutableNodeCustomisationDirectory.kt
new file mode 100644
index 000000000..d6f329565
--- /dev/null
+++ b/customisations/src/main/java/com/bumble/appyx/utils/customisations/MutableNodeCustomisationDirectory.kt
@@ -0,0 +1,10 @@
+package com.bumble.appyx.utils.customisations
+
+import kotlin.reflect.KClass
+
+interface MutableNodeCustomisationDirectory : NodeCustomisationDirectory {
+
+ fun putSubDirectory(key: KClass, value: NodeCustomisationDirectory)
+
+ fun put(key: KClass, value: T)
+}
diff --git a/customisations/src/main/java/com/bumble/appyx/utils/customisations/NodeCustomisation.kt b/customisations/src/main/java/com/bumble/appyx/utils/customisations/NodeCustomisation.kt
new file mode 100644
index 000000000..7e67ba992
--- /dev/null
+++ b/customisations/src/main/java/com/bumble/appyx/utils/customisations/NodeCustomisation.kt
@@ -0,0 +1,3 @@
+package com.bumble.appyx.utils.customisations
+
+interface NodeCustomisation
diff --git a/customisations/src/main/java/com/bumble/appyx/utils/customisations/NodeCustomisationDirectory.kt b/customisations/src/main/java/com/bumble/appyx/utils/customisations/NodeCustomisationDirectory.kt
new file mode 100644
index 000000000..f5d8b6cc3
--- /dev/null
+++ b/customisations/src/main/java/com/bumble/appyx/utils/customisations/NodeCustomisationDirectory.kt
@@ -0,0 +1,19 @@
+package com.bumble.appyx.utils.customisations
+
+import kotlin.reflect.KClass
+
+interface NodeCustomisationDirectory {
+
+ val parent: NodeCustomisationDirectory?
+
+ fun getSubDirectory(key: KClass) : NodeCustomisationDirectory?
+
+ fun getSubDirectoryOrSelf(key: KClass) : NodeCustomisationDirectory
+
+ fun get(key: KClass) : T?
+
+ fun getRecursively(key: KClass) : T?
+
+ fun getRecursivelyOrDefault(default: T) : T =
+ get(default::class) ?: parent?.get(default::class) ?: default
+}
diff --git a/customisations/src/main/java/com/bumble/appyx/utils/customisations/NodeCustomisationDirectoryImpl.kt b/customisations/src/main/java/com/bumble/appyx/utils/customisations/NodeCustomisationDirectoryImpl.kt
new file mode 100644
index 000000000..414edc4b5
--- /dev/null
+++ b/customisations/src/main/java/com/bumble/appyx/utils/customisations/NodeCustomisationDirectoryImpl.kt
@@ -0,0 +1,52 @@
+package com.bumble.appyx.utils.customisations
+
+import kotlin.reflect.KClass
+
+open class NodeCustomisationDirectoryImpl(
+ override val parent: NodeCustomisationDirectory? = null
+) : MutableNodeCustomisationDirectory {
+
+ private val map: MutableMap = hashMapOf()
+
+ override fun put(key: KClass, value: T) {
+ map[key] = value
+ }
+
+ fun put(vararg values: T) {
+ values.forEach {
+ map[it::class] = it
+ }
+ }
+
+ inline operator fun T.unaryPlus() {
+ put(this)
+ }
+
+ override fun get(key: KClass): T? =
+ map[key] as? T
+
+ override fun getRecursively(key: KClass): T? =
+ get(key) ?: parent?.get(key)
+
+ override fun putSubDirectory(key: KClass, value: NodeCustomisationDirectory) {
+ map[key] = value
+ }
+
+ override fun getSubDirectory(key: KClass): NodeCustomisationDirectory?=
+ map[key] as? NodeCustomisationDirectory
+
+ override fun getSubDirectoryOrSelf(key: KClass): NodeCustomisationDirectory {
+ val subDir = map.keys.firstOrNull {
+ it is KClass<*> && it.java.isAssignableFrom(key.java)
+ }
+
+ return map[subDir] as? NodeCustomisationDirectory ?: this
+ }
+
+ operator fun KClass<*>.invoke(block: NodeCustomisationDirectoryImpl.() -> Unit) {
+ if (map.containsKey(this)) {
+ // TODO warning for accidental override?
+ }
+ map[this] = NodeCustomisationDirectoryImpl(this@NodeCustomisationDirectoryImpl).apply(block)
+ }
+}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 62c8844d0..c2fc4158a 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -9,10 +9,8 @@ kotlin = "1.6.21"
rxjava2 = "2.2.21"
rxandroid = "2.1.1"
junit5 = "5.8.2"
-appTreeUtils = "0.1.1"
[libraries]
-appTreeUtils = { module = "com.github.badoo:app-tree-utils", version.ref = "appTreeUtils" }
android-plugin = "com.android.tools.build:gradle:7.1.3"
androidx-activity-compose = "androidx.activity:activity-compose:1.3.1"
androidx-appcompat = "androidx.appcompat:appcompat:1.3.1"
@@ -38,7 +36,7 @@ junit = "junit:junit:4.13.2"
kotlin-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
kotlin-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }
kotlin-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
-mvicore = { module = "com.github.badoo.RIBs:rib-mvicore", version.ref = "ribs" }
+mvicore = { module = "com.github.badoo.RIBs:rib-mvicore", version.ref = "ribs" }
ribs-base = { module = "com.github.badoo.RIBs:rib-base", version.ref = "ribs" }
ribs-compose = { module = "com.github.badoo.RIBs:rib-compose", version.ref = "ribs" }
ribs-rx = { module = "com.github.badoo.RIBs:rib-rx2", version.ref = "ribs" }
diff --git a/settings.gradle b/settings.gradle
index ba6c34841..788601dce 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -14,5 +14,6 @@ include ':app',
':sandbox',
':interop-rx2',
':interop-ribs',
- 'testing-ui',
- ':routing-source-addons'
+ ':testing-ui',
+ ':routing-source-addons',
+ ':customisations'