android-motion-specialist
Expert Android developer for the Motion Detector project. Use this skill when working on Camera2 API integration, motion detection algorithms, Android networking (LAN sockets + Supabase Realtime), debugging crashes, or any Android/Kotlin development tasks specific to this sprint timing application.
- Category: discovered
- Tags: github, community
- Version: 1.0.0
- Author: walid
- Downloads: 0
- Updated: 2025-11-22
Download the latest version (v1.0.0) from this page.
SKILL.md
---
name: android-motion-specialist
description: Expert Android developer for the Motion Detector project. Use this skill when working on Camera2 API integration, motion detection algorithms, Android networking (LAN sockets + Supabase Realtime), debugging crashes, or any Android/Kotlin development tasks specific to this sprint timing application.
---
# Android Motion Detection Specialist
## Overview
Specialized agent for developing and debugging the Motion Detector Android application - a sprint timing system using camera-based motion detection with tripwire functionality, multi-device synchronization via LAN sockets and Supabase Realtime.
## When to Use This Skill
Trigger this skill when:
- Working on Camera2 API integration or camera configuration
- Debugging motion detection algorithm or tripwire feature
- Implementing or debugging LAN socket networking
- Troubleshooting Supabase Realtime integration
- Analyzing Android crashes or performance issues
- Modifying lobby/participant management
- Optimizing frame processing or FPS control
- Any Kotlin/Android development on this project
## Core Capabilities
### 1. Camera2 Architecture Expert
**Specialization**: Camera2 API, image capture, preview management
**Key Tasks**:
- Configure camera characteristics and resolution selection
- Debug camera state transitions and lifecycle issues
- Optimize image format (YUV_420_888, NV21) for performance
- Implement FPS limiting and frame rate control
- Handle camera permissions and error recovery
**Reference**: Load `references/camera2-architecture.md` for component details
**Common Patterns**:
```kotlin
// Query supported resolutions
characteristicsHelper.getSupportedResolutions(cameraId, ImageFormat.YUV_420_888)
// Set FPS range
captureRequestBuilder.set(
CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
Range(targetFps, targetFps)
)
```
### 2. Motion Detection Algorithm Specialist
**Specialization**: Frame difference algorithm, tripwire implementation, performance optimization
**Key Tasks**:
- Tune sensitivity and motion threshold parameters
- Implement and debug tripwire region detection
- Optimize frame processing (pixel sampling, resolution)
- Diagnose false positives/negatives
- Profile and reduce CPU usage
**Reference**: Load `references/motion-detection-algorithm.md` for algorithm details
**Key Parameters**:
- **sensitivity**: Pixel difference threshold (0-255) - Lower = more sensitive
- **motionThreshold**: Percentage of pixels (0.0-1.0) - Lower = more sensitive
- **tripwirePosition**: Horizontal position (0.0-1.0) - 0=left, 0.5=center, 1=right
- **tripwireWidth**: Width fraction (0.0-1.0) - Smaller = narrower detection zone
### 3. Networking Architecture Expert
**Specialization**: LAN sockets, Supabase Realtime, timing synchronization
**Key Tasks**:
- Debug LAN socket server/client connections
- Implement Supabase Realtime messaging
- Handle network state changes and reconnection
- Optimize latency for timing precision
- Troubleshoot WiFi discovery issues
**Reference**: Load `references/networking-architecture.md` for architecture
**Network Flow**:
1. **Discovery**: Supabase Realtime (4-digit session codes)
2. **Handshake**: Host broadcasts LAN IP:port via Realtime
3. **Connection**: Client connects TCP socket (port 9898)
4. **Timing**: LAN for low latency or Supabase fallback
### 4. Debugging & Performance Optimization
**Specialization**: Crash analysis, logcat interpretation, profiling
**Key Tasks**:
- Analyze stack traces and crash logs
- Use Android Studio Profiler (CPU, Memory, Network)
- Debug Camera2 state issues
- Profile frame processing performance
- Identify memory leaks and resource cleanup issues
**Reference**: Load `references/debugging-guide.md` for debugging strategies
**Common Tools**:
- Android Studio Debugger with breakpoints
- Logcat filtering: `tag:MotionDetector OR tag:Camera2Manager`
- CPU/Memory/Network profilers
- ADB commands for device inspection
## Project-Specific Knowledge
### Architecture Overview
**Main Components**:
- **MainActivity**: Camera screen with motion detection
- **LobbyActivity**: Device pairing and role assignment
- **Camera2Manager**: Camera2 API orchestrator
- **MotionDetector**: Frame difference algorithm with tripwire
- **LobbyRepository**: Supabase data access layer
- **LanSocketServer/Client**: TCP networking for timing
**Data Flow**:
```
Camera2 → ImageReader → MotionDetector → Timer
Lobby → Supabase → LAN Handshake → Timing Sync
```
**Reference**: Load `references/project-structure.md` for complete file layout
### Role-Based Timing System
**Roles**:
- **START**: Triggers when runner enters start gate
- **SPLIT**: Optional mid-course checkpoint
- **FINISH**: Final timing at finish line
**Assignment Flow**:
1. Host assigns roles via LobbyActivity dropdown
2. Roles sync via Supabase Realtime to `participants` table
3. Device with matching role can trigger timing event
4. Event broadcasts to all devices (LAN or Supabase mode)
5. Timing stored in `timing_events` table
### Configuration Files
**Supabase Setup** (`local.properties` - gitignored):
```properties
supabase.url=https://xxxxx.supabase.co
supabase.anon.key=your-anon-key
```
**Build Injection** (`app/build.gradle.kts`):
```kotlin
buildConfigField("String", "SUPABASE_URL", localProps["supabase.url"])
buildConfigField("String", "SUPABASE_ANON_KEY", localProps["supabase.anon.key"])
```
## Workflow Decision Tree
### Starting a New Task
**1. Is it camera-related?**
- YES → Load `references/camera2-architecture.md`
- Focus on Camera2Manager, CaptureSessionManager, CameraPreview
- Check camera lifecycle and state management
**2. Is it motion detection?**
- YES → Load `references/motion-detection-algorithm.md`
- Focus on MotionDetector.kt
- Consider parameter tuning and tripwire logic
**3. Is it networking?**
- YES → Load `references/networking-architecture.md`
- Focus on LanSocket classes, LobbyRepository
- Check both Supabase and LAN code paths
**4. Is it a crash or bug?**
- YES → Load `references/debugging-guide.md`
- Analyze stack trace first
- Check common issues section for similar patterns
**5. Need project context?**
- YES → Load `references/project-structure.md`
- Understand component relationships
- Review data flow diagrams
### Implementing a Feature
**Step 1**: Understand the requirement
- Which component does it affect?
- Does it require camera, motion, or network changes?
**Step 2**: Read relevant references
- Load applicable reference docs based on domain
- Review existing implementations in that file
- Check for similar patterns elsewhere
**Step 3**: Plan the implementation
- Identify specific files to modify
- Consider threading (main, camera, network)
- Plan error handling and null safety
**Step 4**: Implement with best practices
- Use Kotlin idioms (data classes, sealed classes, null safety)
- Handle lifecycle properly (onCreate, onPause, onDestroy)
- Add logging for debugging
- Follow existing code style
**Step 5**: Test thoroughly
- Unit tests for pure logic (MotionDetector)
- Manual testing on physical device
- Check edge cases (rotation, backgrounding, permissions)
### Debugging a Problem
**Step 1**: Gather information
- Read crash log or error message carefully
- Note timestamp and affected component
- Reproduce the issue consistently
**Step 2**: Locate the issue
- Find crash location in stack trace
- Read surrounding code in that file
- Load `references/debugging-guide.md` for similar issues
**Step 3**: Form hypothesis
- What caused this? Null reference? State issue? Threading?
- Is it lifecycle-related (camera closing early)?
- Check logcat for warnings before crash
**Step 4**: Test hypothesis
- Add strategic breakpoints or logging
- Run with Android Studio debugger attached
- Verify assumptions about state
**Step 5**: Implement fix
- Fix root cause, not just symptoms
- Add null checks or state guards
- Update related code if needed
- Test fix thoroughly and check for regressions
## Common Implementation Patterns
### Camera Initialization Pattern
```kotlin
// 1. Check permission
if (ContextCompat.checkSelfPermission(this, CAMERA) == GRANTED) {
camera2Manager.openCamera(cameraId)
}
// 2. Camera opened callback
override fun onOpened(camera: CameraDevice) {
camera2Manager.createCaptureSession(surfaces, callbacks)
}
// 3. Session configured callback
override fun onConfigured(session: CameraCaptureSession) {
session.setRepeatingRequest(previewRequest, callback, handler)
}
```
### Motion Detection Pattern
```kotlin
// 1. Receive frame from ImageReader
override fun onImageAvailable(reader: ImageReader) {
val image = reader.acquireLatestImage() ?: return
// 2. Extract Y plane (grayscale)
val plane = image.planes[0]
val data = ByteArray(plane.buffer.remaining())
plane.buffer.get(data)
// 3. Detect motion with tripwire
val motion = motionDetector.detectMotionFromByteArray(
data, image.width, image.height
)
// 4. Handle result
if (motion && !timerStarted) {
timerManager.start()
timerStarted = true
}
// 5. Cleanup
image.close()
}
```
### Network Handshake Pattern
```kotlin
// HOST SIDE
// 1. Create lobby and get session code
val sessionCode = lobbyRepository.createLobby(deviceId, deviceName)
// 2. Start LAN server
lanServer = LanSocketServer(port = 9898)
lanServer.start()
// 3. Broadcast LAN offer via Realtime
channel.broadcast("lan_offer", mapOf(
"ip" to localIp,
"port" to 9898
))
// CLIENT SIDE
// 1. Join lobby with session code
lobbyRepository.joinLobby(sessionCode, deviceId, deviceName)
// 2. Subscribe to LAN offer
channel.on("lan_offer") { payload ->
val hostIp = payload["ip"] as String
val port = payload["port"] as Int
// 3. Connect to host
lanClient = LanSocketClient(hostIp, port)
lanClient.connect()
}
```
## Best Practices
### Code Quality
- Use Kotlin data classes for data models
- Prefer sealed classes for state representation
- Use coroutines for async operations (avoid callbacks)
- Handle nullable types with safe calls (`?.`) or Elvis (`?:`)
- Add KDoc comments for public APIs
### Error Handling
- Wrap Camera2 calls in try-catch (CameraAccessException)
- Check for null before using Camera/Session references
- Handle network exceptions gracefully with retry logic
- Provide user feedback via Toast or Snackbar
### Resource Management
- Close ImageReader when done (onPause/onDestroy)
- Release camera in onPause, reopen in onResume
- Close sockets in cleanup methods
- Cancel coroutines properly (lifecycleScope)
### Threading
- Camera operations on HandlerThread (not main)
- Frame processing on background thread or coroutine
- UI updates always on main thread (use Handler/runOnUiThread)
- Network I/O on IO dispatcher (Dispatchers.IO)
### Logging
- Use consistent log tags (e.g., "Camera2Manager", "MotionDetector")
- Log state transitions and important events
- Log errors with full stack traces
- Use BuildConfig.DEBUG to disable verbose logs in release
## Quick Reference
### Common ADB Commands
```bash
# Install APK
adb install -r app/build/outputs/apk/debug/app-debug.apk
# View logs in realtime
adb logcat -v time | grep "MotionDetector\|Camera2"
# Clear logs
adb logcat -c
# Force stop app
adb shell am force-stop com.motiondetector
# Check WiFi connection
adb shell dumpsys wifi | grep "SSID"
```
### Common Gradle Commands
```bash
# Clean build
./gradlew clean
# Build debug APK
./gradlew assembleDebug
# Install on connected device
./gradlew installDebug
# Run unit tests
./gradlew test
```
### Logcat Filters
```
# Camera-related logs
tag:Camera2Manager OR tag:CaptureSessionManager OR tag:CameraPreview
# Motion detection
tag:MotionDetector
# Networking
tag:LanSocket OR tag:LobbyRepository OR tag:Supabase
# Crashes and errors only
level:error OR level:assert
```
## Integration with Task Tool
### When to Use Subagents
**Use `subagent_type=Explore`** when:
- Investigating unfamiliar codebase architecture
- Finding all usages of a class across the project
- Understanding data flow across multiple components
**Use `subagent_type=code-reviewer`** when:
- Reviewing code before committing
- Checking for common Android anti-patterns
- Validating null safety and resource cleanup
**Use `subagent_type=debugger`** when:
- Complex crash analysis spanning multiple files
- Performance bottleneck investigation
- Memory leak detection across components
### When to Use This Skill Directly
Use this skill directly (without subagents) when:
- You know exactly which file to modify
- Implementing a well-defined feature
- Making targeted bug fixes in a single component
- The task is self-contained within one domain
## Resources
Detailed reference documentation available in `references/`:
- **camera2-architecture.md**: Camera2 API components, workflows, threading
- **motion-detection-algorithm.md**: Frame difference algorithm, tripwire, tuning
- **networking-architecture.md**: LAN sockets, Supabase Realtime, timing sync
- **debugging-guide.md**: Debugging tools, common issues, crash analysis
- **project-structure.md**: File layout, data flow, dependencies, build config
Load references as needed based on the specific task domain. References contain code examples, common patterns, and troubleshooting guides.