A copy-pasteable reference for every public SDK surface exposed to external ComBat 4 Dismounted Soldier (C4DS) tools — 27 runnable samples across 14 categories, launched from an in-app Sample Gallery hub.
- Every tool component —
Overlay,Status/ExpandableStatus,Window,MapWindow,Underlay, andEndBar— each with a runnable, minimal sample. - Domain interactors (
CommonMapInteractor,CommonModelInteractor,CommonSessionStorageInteractor,CommonLocaleSettingsInteractor) used the way a real tool would. - Tool lifecycle & management —
AbstractToolService,ToolManager,PanelManager, and session-scoped storage (files,SharedPreferences, Room). - Remote data — a tool-owned Ktor
HttpClient(all classes host-provided, nothing bundled) fetching JSON and mapping it to a domain model behind a repository. - UI building blocks — the promoted public SDK Compose component catalog plus all four
ToolDialogvariants. - Plugin isolation — per-APK
ClassLoader, resource resolution, Material 2 composition fallback, native.soloading, and cross-APK tool activation. - A single hub pattern — one launcher-visible tool activates the other (hidden) tools via
ToolManager; copy it for multi-tool APKs.
| Item | Requirement |
|---|---|
| Host app | ComBat 4 DS |
| Maven access | support@combat.vision → Nexus SDK |
| SDK | c4ds-sdk 0.5.1 (see gradle/libs.versions.toml) |
| Kotlin | 2.4.0 — must match host for binary compatibility |
| Compose | TBD — not pinned in this repo; use the Kotlin K2 Compose compiler shipped with kotlin = "2.4.0" |
| NDK + CMake | Only for :isolation |
Add Nexus credentials to ~/.gradle/gradle.properties:
c4ds_sdk_username=<your-username>
c4ds_sdk_password=<your-password>Build and install:
./gradlew :gallery:assembleRelease :isolation:assembleRelease
adb install -r gallery/build/outputs/apk/release/gallery-release.apk
adb install -r isolation/build/outputs/apk/release/isolation-release.apkNeither APK declares an Activity. Install both, launch ComBat 4, then open Sample Gallery from the Tools list. Full setup: Getting started.
The host divides the screen into tool components your tool declares:
| Component | Region | Use |
|---|---|---|
| Overlay | Red — over the main map | Heads-up content, cursor readouts |
| Status | Blue — bottom info strip | Non-critical info; ExpandableStatus variant available |
| Window | Green — side/bottom panel | Full screens with optional nested navigation |
| MapWindow | Variant of Window | Embedded secondary map inside the panel |
| Underlay | Full layer under the main map | AR and background layers |
| End bar | Yellow — map's right edge | Custom action/toggle/menu buttons |
Details: Getting started → Tool screen layout
All 28 samples — with screenshots, SDK APIs, source paths, and verification steps — live in the
Samples guidebook, one collapsible section per category in on-screen
order. Registry source of truth:
CatalogEntry.kt.
- Map View — map taps, WorldWind renderables, and the
CommonMapInteractorAPI · 3 samples - Map Overlays — overlays, status bars, expandable status, EndBar buttons, and default-overlay replace/restore · 5 samples
- Map Underlay — composables rendered behind the map layer in AR mode · 1 sample
- Panel Windows — single-screen, multi-screen, and secondary-map panel windows · 3 samples
- Panel Management — open, close, and observe panel state via
PanelManager· 1 sample - UI Components Catalog — promoted public SDK components: form fields, buttons, inputs, and more · 1 sample
- Tool Dialogs —
ToolDialogvariants: Confirmation, Destructive, Info, and Custom · 1 sample - Tool Management — activate, deactivate, and inspect tools via
ToolManager· 1 sample - Model Management —
CommonModelInteractorcreate/consume/commit, symbol keys, and selection events · 1 sample - Data Management — isolated file I/O, plugin-scoped
SharedPreferences, Room, and Ktor network requests · 2 samples - Lifecycle & Services — a session
AbstractToolService, unread badge, and live lifecycle log · 1 sample - Host Services — sharing, clipboard, in-app notifications, and opening a file in another app, and the host-provided library surface · 3 samples
- Resources & Isolation — config-qualified resources, M2 widgets,
R.stringcollision, and native/cross-APK · 4 samples - Architecture — a multi-module tool (domain/data/app) launched from the hub via cross-APK activation · 1 sample
| Document | Contents |
|---|---|
| Getting started | Requirements, Gradle/Nexus setup, tool screen layout, integration steps, Android Studio run config |
| Samples guidebook | Every sample: screenshot, description, SDK APIs, source path, verification steps |
| Plugin isolation | Asset/JNI smoke tests, isolation cases (a–e, g, h), cross-APK activation |
Questions or issues: open an issue or email support@combat.vision.
Licensed under the Apache License, Version 2.0 — see LICENSE for the full text.
You may obtain a copy at http://www.apache.org/licenses/LICENSE-2.0.
Copyright © 2026 ComBat Vision.
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
This is an early version and may contain bugs or incomplete features. Feedback and contributions are welcome — if you encounter any issues, please open an issue.