From 5ba929da726cd09ee0147f721c81e2bc91e7ee62 Mon Sep 17 00:00:00 2001 From: nbschultz97 <126931519+nbschultz97@users.noreply.github.com> Date: Fri, 12 Sep 2025 10:46:03 -0600 Subject: [PATCH] Add CoT interoperability core module and settings --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 9 +++ .../example/tacticalapp/CotMarkerReceiver.kt | 14 +++++ .../tacticalapp/InteropSettingsActivity.kt | 31 ++++++++++ .../com/example/tacticalapp/MainActivity.kt | 14 +++++ .../res/layout/activity_interop_settings.xml | 32 +++++++++++ app/src/main/res/layout/activity_main.xml | 14 +++++ core/build.gradle.kts | 26 +++++++++ .../java/com/example/core/interop/CotEvent.kt | 16 ++++++ .../com/example/core/interop/CotSender.kt | 27 +++++++++ .../java/com/example/core/interop/CotXml.kt | 57 +++++++++++++++++++ .../java/com/example/core/interop/Interop.kt | 52 +++++++++++++++++ .../com/example/core/interop/MarkerEntity.kt | 11 ++++ .../example/core/interop/SelfBeaconWorker.kt | 30 ++++++++++ settings.gradle.kts | 2 +- 15 files changed, 335 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/example/tacticalapp/CotMarkerReceiver.kt create mode 100644 app/src/main/java/com/example/tacticalapp/InteropSettingsActivity.kt create mode 100644 app/src/main/res/layout/activity_interop_settings.xml create mode 100644 core/build.gradle.kts create mode 100644 core/src/main/java/com/example/core/interop/CotEvent.kt create mode 100644 core/src/main/java/com/example/core/interop/CotSender.kt create mode 100644 core/src/main/java/com/example/core/interop/CotXml.kt create mode 100644 core/src/main/java/com/example/core/interop/Interop.kt create mode 100644 core/src/main/java/com/example/core/interop/MarkerEntity.kt create mode 100644 core/src/main/java/com/example/core/interop/SelfBeaconWorker.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9c4b80c..8b6a946 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -41,6 +41,7 @@ android { dependencies { implementation(project(":llm")) implementation(project(":tak-plugin")) + implementation(project(":core")) implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.24") implementation("androidx.appcompat:appcompat:1.7.0") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c18b8a..c6d9bb4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,8 @@ + + + + + + + + + diff --git a/app/src/main/java/com/example/tacticalapp/CotMarkerReceiver.kt b/app/src/main/java/com/example/tacticalapp/CotMarkerReceiver.kt new file mode 100644 index 0000000..acd3722 --- /dev/null +++ b/app/src/main/java/com/example/tacticalapp/CotMarkerReceiver.kt @@ -0,0 +1,14 @@ +package com.example.tacticalapp + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.example.core.interop.Interop + +/** Receives external marker intents and publishes them as CoT. */ +class CotMarkerReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val json = intent.getStringExtra("marker") ?: return + Interop.publishMarkerJson(json) + } +} diff --git a/app/src/main/java/com/example/tacticalapp/InteropSettingsActivity.kt b/app/src/main/java/com/example/tacticalapp/InteropSettingsActivity.kt new file mode 100644 index 0000000..3c94abf --- /dev/null +++ b/app/src/main/java/com/example/tacticalapp/InteropSettingsActivity.kt @@ -0,0 +1,31 @@ +package com.example.tacticalapp + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.example.core.interop.Interop +import com.example.tacticalapp.databinding.ActivityInteropSettingsBinding + +class InteropSettingsActivity : AppCompatActivity() { + private lateinit var binding: ActivityInteropSettingsBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityInteropSettingsBinding.inflate(layoutInflater) + setContentView(binding.root) + + // Load current settings + binding.switchEnabled.isChecked = Interop.enabled + binding.editHost.setText(Interop.host) + binding.editPort.setText(Interop.port.toString()) + + binding.btnSave.setOnClickListener { + Interop.enabled = binding.switchEnabled.isChecked + Interop.host = binding.editHost.text.toString() + Interop.port = binding.editPort.text.toString().toIntOrNull() ?: Interop.port + if (Interop.enabled) { + Interop.startSelfBeacon(this) + } + finish() + } + } +} diff --git a/app/src/main/java/com/example/tacticalapp/MainActivity.kt b/app/src/main/java/com/example/tacticalapp/MainActivity.kt index d5dd6c8..0742377 100644 --- a/app/src/main/java/com/example/tacticalapp/MainActivity.kt +++ b/app/src/main/java/com/example/tacticalapp/MainActivity.kt @@ -20,5 +20,19 @@ class MainActivity : AppCompatActivity() { binding.btnTakStatus.setOnClickListener { Toast.makeText(this, "TAK plugin status: OK", Toast.LENGTH_SHORT).show() } + + binding.btnShareCot.setOnClickListener { + val marker = com.example.core.interop.MarkerEntity( + uid = "share-${System.currentTimeMillis()}", + lat = 0.0, + lon = 0.0, + ) + com.example.core.interop.Interop.publishMarker(marker) + Toast.makeText(this, "CoT sent", Toast.LENGTH_SHORT).show() + } + + binding.btnInteropSettings.setOnClickListener { + startActivity(Intent(this, InteropSettingsActivity::class.java)) + } } } diff --git a/app/src/main/res/layout/activity_interop_settings.xml b/app/src/main/res/layout/activity_interop_settings.xml new file mode 100644 index 0000000..51b045a --- /dev/null +++ b/app/src/main/res/layout/activity_interop_settings.xml @@ -0,0 +1,32 @@ + + + + + + + + + +