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'