mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-10 05:02:44 +00:00
refactor(android): centralize invoke command registry
This commit is contained in:
@@ -7,12 +7,6 @@ import ai.openclaw.android.gateway.GatewayClientInfo
|
|||||||
import ai.openclaw.android.gateway.GatewayConnectOptions
|
import ai.openclaw.android.gateway.GatewayConnectOptions
|
||||||
import ai.openclaw.android.gateway.GatewayEndpoint
|
import ai.openclaw.android.gateway.GatewayEndpoint
|
||||||
import ai.openclaw.android.gateway.GatewayTlsParams
|
import ai.openclaw.android.gateway.GatewayTlsParams
|
||||||
import ai.openclaw.android.protocol.OpenClawCanvasA2UICommand
|
|
||||||
import ai.openclaw.android.protocol.OpenClawCanvasCommand
|
|
||||||
import ai.openclaw.android.protocol.OpenClawCameraCommand
|
|
||||||
import ai.openclaw.android.protocol.OpenClawLocationCommand
|
|
||||||
import ai.openclaw.android.protocol.OpenClawScreenCommand
|
|
||||||
import ai.openclaw.android.protocol.OpenClawSmsCommand
|
|
||||||
import ai.openclaw.android.protocol.OpenClawCapability
|
import ai.openclaw.android.protocol.OpenClawCapability
|
||||||
import ai.openclaw.android.LocationMode
|
import ai.openclaw.android.LocationMode
|
||||||
import ai.openclaw.android.VoiceWakeMode
|
import ai.openclaw.android.VoiceWakeMode
|
||||||
@@ -80,32 +74,12 @@ class ConnectionManager(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun buildInvokeCommands(): List<String> =
|
fun buildInvokeCommands(): List<String> =
|
||||||
buildList {
|
InvokeCommandRegistry.advertisedCommands(
|
||||||
add(OpenClawCanvasCommand.Present.rawValue)
|
cameraEnabled = cameraEnabled(),
|
||||||
add(OpenClawCanvasCommand.Hide.rawValue)
|
locationEnabled = locationMode() != LocationMode.Off,
|
||||||
add(OpenClawCanvasCommand.Navigate.rawValue)
|
smsAvailable = smsAvailable(),
|
||||||
add(OpenClawCanvasCommand.Eval.rawValue)
|
debugBuild = BuildConfig.DEBUG,
|
||||||
add(OpenClawCanvasCommand.Snapshot.rawValue)
|
)
|
||||||
add(OpenClawCanvasA2UICommand.Push.rawValue)
|
|
||||||
add(OpenClawCanvasA2UICommand.PushJSONL.rawValue)
|
|
||||||
add(OpenClawCanvasA2UICommand.Reset.rawValue)
|
|
||||||
add(OpenClawScreenCommand.Record.rawValue)
|
|
||||||
if (cameraEnabled()) {
|
|
||||||
add(OpenClawCameraCommand.Snap.rawValue)
|
|
||||||
add(OpenClawCameraCommand.Clip.rawValue)
|
|
||||||
}
|
|
||||||
if (locationMode() != LocationMode.Off) {
|
|
||||||
add(OpenClawLocationCommand.Get.rawValue)
|
|
||||||
}
|
|
||||||
if (smsAvailable()) {
|
|
||||||
add(OpenClawSmsCommand.Send.rawValue)
|
|
||||||
}
|
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
add("debug.logs")
|
|
||||||
add("debug.ed25519")
|
|
||||||
}
|
|
||||||
add("app.update")
|
|
||||||
}
|
|
||||||
|
|
||||||
fun buildCapabilities(): List<String> =
|
fun buildCapabilities(): List<String> =
|
||||||
buildList {
|
buildList {
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
package ai.openclaw.android.node
|
||||||
|
|
||||||
|
import ai.openclaw.android.protocol.OpenClawCanvasA2UICommand
|
||||||
|
import ai.openclaw.android.protocol.OpenClawCanvasCommand
|
||||||
|
import ai.openclaw.android.protocol.OpenClawCameraCommand
|
||||||
|
import ai.openclaw.android.protocol.OpenClawLocationCommand
|
||||||
|
import ai.openclaw.android.protocol.OpenClawScreenCommand
|
||||||
|
import ai.openclaw.android.protocol.OpenClawSmsCommand
|
||||||
|
|
||||||
|
enum class InvokeCommandAvailability {
|
||||||
|
Always,
|
||||||
|
CameraEnabled,
|
||||||
|
LocationEnabled,
|
||||||
|
SmsAvailable,
|
||||||
|
DebugBuild,
|
||||||
|
}
|
||||||
|
|
||||||
|
data class InvokeCommandSpec(
|
||||||
|
val name: String,
|
||||||
|
val requiresForeground: Boolean = false,
|
||||||
|
val availability: InvokeCommandAvailability = InvokeCommandAvailability.Always,
|
||||||
|
)
|
||||||
|
|
||||||
|
object InvokeCommandRegistry {
|
||||||
|
val all: List<InvokeCommandSpec> =
|
||||||
|
listOf(
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawCanvasCommand.Present.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawCanvasCommand.Hide.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawCanvasCommand.Navigate.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawCanvasCommand.Eval.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawCanvasCommand.Snapshot.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawCanvasA2UICommand.Push.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawCanvasA2UICommand.PushJSONL.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawCanvasA2UICommand.Reset.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawScreenCommand.Record.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawCameraCommand.Snap.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
availability = InvokeCommandAvailability.CameraEnabled,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawCameraCommand.Clip.rawValue,
|
||||||
|
requiresForeground = true,
|
||||||
|
availability = InvokeCommandAvailability.CameraEnabled,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawLocationCommand.Get.rawValue,
|
||||||
|
availability = InvokeCommandAvailability.LocationEnabled,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = OpenClawSmsCommand.Send.rawValue,
|
||||||
|
availability = InvokeCommandAvailability.SmsAvailable,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = "debug.logs",
|
||||||
|
availability = InvokeCommandAvailability.DebugBuild,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(
|
||||||
|
name = "debug.ed25519",
|
||||||
|
availability = InvokeCommandAvailability.DebugBuild,
|
||||||
|
),
|
||||||
|
InvokeCommandSpec(name = "app.update"),
|
||||||
|
)
|
||||||
|
|
||||||
|
private val byNameInternal: Map<String, InvokeCommandSpec> = all.associateBy { it.name }
|
||||||
|
|
||||||
|
fun find(command: String): InvokeCommandSpec? = byNameInternal[command]
|
||||||
|
|
||||||
|
fun advertisedCommands(
|
||||||
|
cameraEnabled: Boolean,
|
||||||
|
locationEnabled: Boolean,
|
||||||
|
smsAvailable: Boolean,
|
||||||
|
debugBuild: Boolean,
|
||||||
|
): List<String> {
|
||||||
|
return all
|
||||||
|
.filter { spec ->
|
||||||
|
when (spec.availability) {
|
||||||
|
InvokeCommandAvailability.Always -> true
|
||||||
|
InvokeCommandAvailability.CameraEnabled -> cameraEnabled
|
||||||
|
InvokeCommandAvailability.LocationEnabled -> locationEnabled
|
||||||
|
InvokeCommandAvailability.SmsAvailable -> smsAvailable
|
||||||
|
InvokeCommandAvailability.DebugBuild -> debugBuild
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.map { it.name }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package ai.openclaw.android.node
|
||||||
|
|
||||||
|
import ai.openclaw.android.protocol.OpenClawCameraCommand
|
||||||
|
import ai.openclaw.android.protocol.OpenClawLocationCommand
|
||||||
|
import ai.openclaw.android.protocol.OpenClawSmsCommand
|
||||||
|
import org.junit.Assert.assertFalse
|
||||||
|
import org.junit.Assert.assertTrue
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class InvokeCommandRegistryTest {
|
||||||
|
@Test
|
||||||
|
fun advertisedCommands_respectsFeatureAvailability() {
|
||||||
|
val commands =
|
||||||
|
InvokeCommandRegistry.advertisedCommands(
|
||||||
|
cameraEnabled = false,
|
||||||
|
locationEnabled = false,
|
||||||
|
smsAvailable = false,
|
||||||
|
debugBuild = false,
|
||||||
|
)
|
||||||
|
|
||||||
|
assertFalse(commands.contains(OpenClawCameraCommand.Snap.rawValue))
|
||||||
|
assertFalse(commands.contains(OpenClawCameraCommand.Clip.rawValue))
|
||||||
|
assertFalse(commands.contains(OpenClawLocationCommand.Get.rawValue))
|
||||||
|
assertFalse(commands.contains(OpenClawSmsCommand.Send.rawValue))
|
||||||
|
assertFalse(commands.contains("debug.logs"))
|
||||||
|
assertFalse(commands.contains("debug.ed25519"))
|
||||||
|
assertTrue(commands.contains("app.update"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun advertisedCommands_includesFeatureCommandsWhenEnabled() {
|
||||||
|
val commands =
|
||||||
|
InvokeCommandRegistry.advertisedCommands(
|
||||||
|
cameraEnabled = true,
|
||||||
|
locationEnabled = true,
|
||||||
|
smsAvailable = true,
|
||||||
|
debugBuild = true,
|
||||||
|
)
|
||||||
|
|
||||||
|
assertTrue(commands.contains(OpenClawCameraCommand.Snap.rawValue))
|
||||||
|
assertTrue(commands.contains(OpenClawCameraCommand.Clip.rawValue))
|
||||||
|
assertTrue(commands.contains(OpenClawLocationCommand.Get.rawValue))
|
||||||
|
assertTrue(commands.contains(OpenClawSmsCommand.Send.rawValue))
|
||||||
|
assertTrue(commands.contains("debug.logs"))
|
||||||
|
assertTrue(commands.contains("debug.ed25519"))
|
||||||
|
assertTrue(commands.contains("app.update"))
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user