Detect user habits from Android system data — no user input required.
Tracker is an Android library that automatically identifies user behaviors (like language learning and reading) by analyzing device usage patterns. Your app gets reliable habit data without asking users to manually track anything.
-
✅ You're building a habit tracking, wellness, or productivity app
-
✅ You want to detect behaviors without manual logging
-
✅ You need confidence scores for detected activities
-
✅ You want graceful degradation when permissions are missing
-
❌ You just need basic step counting (use Health Connect directly)
-
❌ You want to track custom app-specific actions (use your own analytics)
// 1. Build tracker (no need to declare metrics upfront)
val tracker = Tracker.Builder(context)
.setMinConfidence(0.50f) // 50% confidence threshold
.build()
// 2. Request permissions (opens Settings)
if (!tracker.hasAllRequiredAccess(Metric.LANGUAGE_LEARNING)) {
tracker.requestMissingAccess(this, Metric.LANGUAGE_LEARNING)
}
// 3. Query individual metrics for the last 24 hours
val llResult = tracker.queryLanguageLearning()
val readingResult = tracker.queryReading()
// Language Learning result contains:
llResult.result?.occurred // Whether language learning was detected
llResult.result?.durationMinutes // Total time spent
llResult.result?.confidence // Confidence score (0.0-1.0)
llResult.result?.confidenceLevel // LOW/MEDIUM/HIGH
llResult.result?.apps // Apps used
llResult.dataQuality // What data sources are available/missing
// Reading result contains:
readingResult.result?.occurred // Whether reading was detected
readingResult.result?.durationMinutes // Total time spent
readingResult.result?.confidence // Confidence score (0.0-1.0)
readingResult.result?.apps // Apps used
readingResult.dataQuality // What data sources are available/missingOutput example (last 24 hours):
- Language Learning: "45 minutes detected with 85% confidence (HIGH)"
- Apps: Duolingo, Anki
- Reading: "30 minutes detected with 75% confidence (MEDIUM)"
- Apps: Kindle
| Metric | Data Source | Detected Apps | Permission Required |
|---|---|---|---|
| LANGUAGE_LEARNING | App usage stats | Duolingo, Anki, LingoDeer, Drops, Kanji Study, and 8 more | PACKAGE_USAGE_STATS |
| READING | App usage stats | Kindle, Google Play Books | PACKAGE_USAGE_STATS |
More metrics coming: Exercise (Health Connect), Sleep, Social Activity
Add to your build.gradle:
dependencies {
implementation 'com.tracker:core:2.0.0'
}Add permission to AndroidManifest.xml:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />Every detection includes a confidence level (LOW/MEDIUM/HIGH) based on data quality and evidence strength.
See exactly what data sources are available, missing, and how they affect reliability:
val accessInfo = tracker.getAccessRequirements(Metric.LANGUAGE_LEARNING)
// Shows: which permissions are granted, what's missing, recommendationsResults include quality metrics:
- Which data sources were used
- What's missing and why
- Recommendations to improve accuracy
Built with a self-describing collector pattern. Adding new metrics or data sources requires minimal code changes.
Async by default with Kotlin coroutines, plus callback API for Java/legacy code.
val tracker = Tracker.Builder(context)
.setMinConfidence(0.70f) // Only return HIGH confidence results
.build()val llResult = tracker.queryLanguageLearning()
val readingResult = tracker.queryReading()
// Language learning apps
llResult.result?.apps?.forEach { app ->
println("${app.appName}: ${app.durationMinutes} minutes")
}
// Reading apps
readingResult.result?.apps?.forEach { app ->
println("${app.appName}: ${app.durationMinutes} minutes")
}- Data Collection: Queries Android system APIs (UsageStatsManager, Health Connect, etc.)
- Evidence Gathering: Collects timestamped evidence from the last 24 hours
- Smart Aggregation: Removes duplicates, calculates confidence scores
- Result Building: Returns structured data with quality metrics
Privacy: All processing happens on-device. No data leaves the user's phone.
Tracker (public API)
└─> HabitEngine (orchestration)
├─> Collectors (gather evidence from system APIs)
├─> Aggregators (process evidence into habits)
└─> PermissionManager (check/request access)
- Collectors are self-describing (declare their own requirements)
- Aggregators handle metric-specific logic (confidence scoring, deduplication)
- PermissionManager provides unified access checking across all sources
- Minimum SDK: 26 (Android 8.0)
- Target SDK: 34+
- Language: Kotlin 1.9+
Run the included sample app to see the library in action:
./gradlew :app:installDebugThe sample demonstrates:
- Permission request flow
- Querying multiple metrics (Language Learning + Reading)
- Displaying activity results for the last 24 hours
- Showing confidence scores and detected apps
- Data quality information
See CONTRIBUTING.md for guidelines.
Apache 2.0 — see LICENSE for details.
- Health Connect integration (exercise, sleep)
- OAuth support for third-party APIs (Goodreads, Kindle API, etc.)
- Additional metrics (Social Activity, Screen Time)