Thank you for your interest in contributing to OmniCOT! This document provides guidelines and instructions for contributing to the project.
-
ATAK-CIV SDK
- Download ATAK-CIV SDK 5.4.0 or later from TAK.gov
- Extract the SDK to a known location
-
Development Tools
- Android Studio (latest stable version recommended)
- Java Development Kit (JDK) 17
- Git
-
Android SDK
- Android SDK 21+ (Android 5.0)
- Target SDK 34
- Build tools compatible with Gradle 8.13
-
Clone the repository:
git clone https://github.com/engindearing-projects/omni-COT.git cd omni-COT -
Create
local.propertiesin the project root:sdk.dir=/path/to/Android/Sdk takdev.plugin=/path/to/ATAK-CIV-SDK/atak-gradle-takdev.jar
Replace paths with your actual SDK locations.
-
Open the project in Android Studio:
- File → Open → Select the
omnicotfolder - Wait for Gradle sync to complete
- File → Open → Select the
For development and testing:
./gradlew assembleCivDebugOutput: app/build/outputs/apk/civ/debug/ATAK-Plugin-omnicot-0.1--5.4.0-civ-debug.apk
For production:
./gradlew assembleCivReleaseOutput: app/build/outputs/apk/civ/release/ATAK-Plugin-omnicot-0.1--5.4.0-civ-release.apk
adb install -r app/build/outputs/apk/civ/debug/ATAK-Plugin-omnicot-*.apk- Follow standard Java naming conventions
- Use meaningful variable and method names
- Keep methods focused and concise
- Add Javadoc comments for public APIs
/**
* Updates the dashboard statistics display.
* Refreshes AOI count, alert count, and COT modification count.
*/
public void updateStats() {
int aoiCount = getAOICount();
txtActiveAOIs.setText(String.valueOf(aoiCount));
// ...
}- Use 4-space indentation
- Keep attributes on separate lines for readability
- Use descriptive IDs:
@+id/btnRefreshAoinot@+id/button1
app/src/main/java/com/engindearing/omnicot/
├── PluginTemplate.java # Plugin lifecycle
├── OmniCOTTool.java # Toolbar integration
├── OmniCOTMapComponent.java # Map component lifecycle
├── OmniCOTDropDownReceiver.java # UI controller
├── DashboardActivity.java # Dashboard management
├── AlertConfigDialog.java # Alert configuration
├── AOIAdapter.java # RecyclerView adapter
└── AOIItem.java # Data model
-
Fork the repository and create a feature branch:
git checkout -b feature/your-feature-name
-
Make your changes following the code style guidelines
-
Test thoroughly:
- Build succeeds without errors
- Plugin loads in ATAK
- Features work as expected
- No regressions in existing functionality
-
Commit with clear messages:
git commit -m "Add geofence entry/exit notifications - Implement GeofenceMonitor service - Add notification preferences - Update AlertConfigDialog UI - Add tests for geofence detection"
-
Push to your fork:
git push origin feature/your-feature-name
-
Create a Pull Request:
- Provide clear description of changes
- Reference any related issues
- Include screenshots for UI changes
- List testing performed
- Use present tense: "Add feature" not "Added feature"
- First line summary (50 chars or less)
- Blank line, then detailed description
- Reference issues: "Fixes #123" or "Relates to #456"
Before submitting, verify:
-
Plugin Installation
- Plugin installs without errors
- Icon appears in ATAK toolbar
-
Dashboard
- Dashboard opens when button clicked
- Statistics display correctly
- Quick action cards respond
-
CoT Management
- Map selection works
- Affiliation changes apply
- Changes federate to other devices
-
AOI Detection
- Shapes detected from map
- Count updates correctly
- List displays properly
- Builds successfully (debug and release)
- No compilation warnings
- Plugin loads in ATAK
- UI renders correctly on different screen sizes
- No crashes during normal operation
- Features work as documented
- Changes don't break existing features
Include:
- Environment: ATAK version, Android version, device model
- Steps to reproduce: Detailed, numbered steps
- Expected behavior: What should happen
- Actual behavior: What actually happened
- Logs: Relevant logcat output (use
adb logcat) - Screenshots: If applicable
Include:
- Use case: Why this feature is needed
- Proposed solution: How it could work
- Alternatives: Other approaches considered
- Additional context: Any relevant information
**Environment**
- ATAK-CIV 5.4.0
- Android 12
- Samsung Galaxy S21
**Steps to Reproduce**
1. Open OmniCOT dashboard
2. Tap "COT Management"
3. Select a marker on the map
4. Change affiliation to "Hostile"
**Expected**: Marker affiliation changes and federates
**Actual**: App crashes with NullPointerException
**Logs**10-20 16:47:46.479 E/OmniCOT: NullPointerException at line 123 ...
- Check existing Issues
- Review Documentation
- Contact: j@engindearing.soy
By contributing, you agree that your contributions will be licensed under the MIT License.