Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 30 additions & 22 deletions app/src/main/java/com/gomtm/android/swarm/SwarmRuntime.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,21 @@ class SwarmRuntime(
return
}

val booleanType = Boolean::class.javaPrimitiveType ?: Boolean::class.javaObjectType
if (hasMethod(
bridge,
listOf("StartNodeWithOptions", "startNodeWithOptions"),
arrayOf(String::class.java, String::class.java, String::class.java, booleanType),
)
) {
invokeStaticByNames(
bridge = bridge,
methodNames = listOf("StartNodeWithOptions", "startNodeWithOptions"),
args = arrayOf(baseDir, config.bootstrapAddress, config.nodeName, config.autoReconnect),
parameterTypes = arrayOf(String::class.java, String::class.java, String::class.java, booleanType),
)
return
for (booleanType in booleanParameterTypes()) {
if (hasMethod(
bridge,
listOf("StartNodeWithOptions", "startNodeWithOptions"),
arrayOf(String::class.java, String::class.java, String::class.java, booleanType),
)
) {
invokeStaticByNames(
bridge = bridge,
methodNames = listOf("StartNodeWithOptions", "startNodeWithOptions"),
args = arrayOf(baseDir, config.bootstrapAddress, config.nodeName, config.autoReconnect),
parameterTypes = arrayOf(String::class.java, String::class.java, String::class.java, booleanType),
)
return
}
}

throw IllegalStateException("bridge method not found: StartNode/StartNodeWithOptions")
Expand Down Expand Up @@ -160,20 +161,27 @@ class SwarmRuntime(
}

private fun setBooleanProperty(targetClass: Class<*>, target: Any, methodNames: List<String>, value: Boolean) {
val booleanType = Boolean::class.javaPrimitiveType ?: Boolean::class.javaObjectType
var lastMissing: NoSuchMethodException? = null
for (name in methodNames) {
try {
targetClass.getMethod(name, booleanType).invoke(target, value)
return
} catch (error: NoSuchMethodException) {
lastMissing = error
continue
for (booleanType in booleanParameterTypes()) {
for (name in methodNames) {
try {
targetClass.getMethod(name, booleanType).invoke(target, value)
return
} catch (error: NoSuchMethodException) {
lastMissing = error
continue
}
}
}
throw IllegalStateException("config setter not found: ${methodNames.joinToString()}", lastMissing)
}

private fun booleanParameterTypes(): List<Class<*>> {
val primitive = java.lang.Boolean.TYPE
val boxed = java.lang.Boolean::class.java
return if (primitive == boxed) listOf(primitive) else listOf(primitive, boxed)
}

companion object {
internal const val DEFAULT_BRIDGE_CLASS_NAME = "io.nekohasekai.p2pandroid.P2pandroid"
internal const val DEFAULT_CONFIG_CLASS_NAME = "io.nekohasekai.p2pandroid.Config"
Expand Down
Loading