Thank you for your interest in contributing! This document covers how to set up the project for development and how the CI/CD pipeline works.
- Android Studio Hedgehog (2023.1.1) or newer
- JDK 17
- Android SDK 34
- Git
-
Fork and clone the repository
git clone https://github.com/YOUR_USERNAME/flock-you-android.git cd flock-you-android -
Open in Android Studio
- File → Open → Select the project folder
- Wait for Gradle sync to complete
-
Add Google Maps API Key (optional, for map features)
- Get an API key from Google Cloud Console
- Add to
local.properties:MAPS_API_KEY=your_api_key_here - Or set in
AndroidManifest.xmldirectly for testing
-
Run the app
- Select a device/emulator
- Click Run (
▶️ )
The project uses GitHub Actions for continuous integration and deployment.
| Workflow | Trigger | Purpose |
|---|---|---|
android-ci.yml |
Push, PR, Manual | Build, lint, test, and optionally release |
release-on-tag.yml |
Tag push (v*.*.*) |
Automatic release when a version tag is pushed |
- Go to Actions → Android CI/CD
- Click Run workflow
- Configure options:
- ✅ Create a GitHub Release - Check to create a release
- Release version - e.g.,
1.2.0 - Mark as pre-release - For beta/alpha releases
- Release notes - Custom release notes (optional)
- Click Run workflow
# Create and push a version tag
git tag v1.2.0
git push origin v1.2.0This automatically triggers a release build.
For signed release builds, you need to configure these repository secrets:
| Secret | Description |
|---|---|
KEYSTORE_BASE64 |
Base64-encoded keystore file |
KEYSTORE_PASSWORD |
Password for the keystore |
KEY_ALIAS |
Alias of the signing key |
KEY_PASSWORD |
Password for the key |
# Generate a new keystore
keytool -genkey -v -keystore release-keystore.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias flockyou
# Convert to base64 for GitHub secrets
base64 -i release-keystore.jks | pbcopy # macOS
base64 release-keystore.jks | xclip # Linux-
Go to your repository → Settings → Secrets and variables → Actions
-
Click New repository secret
-
Add each secret:
KEYSTORE_BASE64:
Paste the base64 output from aboveKEYSTORE_PASSWORD:
Your keystore passwordKEY_ALIAS:
flockyou (or whatever alias you used)KEY_PASSWORD:
Your key password
If secrets aren't configured, the CI will build an unsigned release APK. This is fine for testing but shouldn't be distributed to users.
- Follow Kotlin coding conventions
- Use meaningful commit messages
- Keep commits focused and atomic
type(scope): description
[optional body]
Types: feat, fix, docs, style, refactor, test, chore, ci
Examples:
feat(scan): add support for new device type
fix(ble): handle null device names
docs: update README with new features
ci(deps): update gradle to 8.2.2
-
Create a feature branch from
maingit checkout -b feat/your-feature
-
Make your changes and commit
-
Push and create a PR
git push origin feat/your-feature
-
Ensure CI passes (build, lint, tests)
-
Request review
# Unit tests
./gradlew testDebugUnitTest
# Lint
./gradlew lint
# Build debug APK
./gradlew assembleDebugFor testing surveillance device detection without actual devices:
- Create a WiFi hotspot with an SSID like
Flock_Test_Camera - Use a BLE advertising app to broadcast as
Flock-Device - The app should detect these as test devices
app/src/main/java/com/flockyou/
├── data/
│ ├── model/ # Data classes & detection patterns
│ └── repository/ # Database & data access
├── di/ # Dependency injection
├── service/ # Background scanning service
└── ui/
├── components/ # Reusable UI components
├── screens/ # Screen composables & ViewModels
└── theme/ # Material 3 theming
Open an issue for:
- Bug reports
- Feature requests
- Questions about the codebase
Thank you for contributing! 🎉