jgilfelt/SystemBarTint
[DEPRECATED] Apply background tinting to the Android system UI when using KitKat translucent modes
Stale — last commit 11y ago
weakest axislast commit was 11y ago; no tests detected…
no tests detected; no CI workflows detected…
Documented and popular — useful reference codebase to read through.
last commit was 11y ago; no CI workflows detected
- ✓4 active contributors
- ✓Apache-2.0 licensed
- ⚠Stale — last commit 11y ago
Show all 7 evidence items →Show less
- ⚠Small team — 4 contributors active in recent commits
- ⚠Single-maintainer risk — top contributor 86% of recent commits
- ⚠No CI workflows detected
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Mixed → Healthy if: 1 commit in the last 365 days; add a test suite
- →Fork & modify Mixed → Healthy if: add a test suite
- →Deploy as-is Mixed → Healthy if: 1 commit in the last 180 days
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Great to learn from" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/jgilfelt/systembartint)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/jgilfelt/systembartint on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: jgilfelt/SystemBarTint
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/jgilfelt/SystemBarTint shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Stale — last commit 11y ago
- 4 active contributors
- Apache-2.0 licensed
- ⚠ Stale — last commit 11y ago
- ⚠ Small team — 4 contributors active in recent commits
- ⚠ Single-maintainer risk — top contributor 86% of recent commits
- ⚠ No CI workflows detected
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live jgilfelt/SystemBarTint
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/jgilfelt/SystemBarTint.
What it runs against: a local clone of jgilfelt/SystemBarTint — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in jgilfelt/SystemBarTint | Confirms the artifact applies here, not a fork |
| 2 | License is still Apache-2.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | Last commit ≤ 3928 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of jgilfelt/SystemBarTint. If you don't
# have one yet, run these first:
#
# git clone https://github.com/jgilfelt/SystemBarTint.git
# cd SystemBarTint
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of jgilfelt/SystemBarTint and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "jgilfelt/SystemBarTint(\\.git)?\\b" \\
&& ok "origin remote is jgilfelt/SystemBarTint" \\
|| miss "origin remote is not jgilfelt/SystemBarTint (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
&& ok "license is Apache-2.0" \\
|| miss "license drift — was Apache-2.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 3928 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~3898d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/jgilfelt/SystemBarTint"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
SystemBarTint is an Android library (API 10+) that applies background tinting to the system status bar and navigation bar when using KitKat translucent modes (API 19+). It solves the problem of providing readable content beneath semi-transparent system UI by letting developers apply solid colors or custom Drawables to the system bar areas without manually calculating insets. Simple two-module Gradle structure: library/ contains the core SystemBarTintManager.java class and AndroidManifest.xml; sample/ contains three demo activities (activity_color, activity_default, activity_match_actionbar) showing different tint configurations. Both use build.gradle for compilation and have legacy project.properties files.
👥Who it's for
Android app developers building activities with translucent status/navigation bars (particularly full-bleed content like maps, photo grids, or wallpaper-driven UIs) who need system UI legibility without implementing complex inset math themselves.
🌱Maturity & risk
Mature but deprecated. The repo is stable with core functionality in SystemBarTintManager.java and working sample apps (activity_color.xml, activity_default.xml), but it's explicitly marked DEPRECATED—Android has moved to EdgeToEdge APIs (API 29+) and modern Material Design. No CI/build action files visible; last activity is unclear but the deprecation status is definitive.
Low technical risk for legacy codebases, but high obsolescence risk: this is officially deprecated and won't work well on modern Android versions (Lollipop+ have better native support, Android 10+ removed translucent system UI theming). Single-maintainer repo (jgilfelt); no visible test suite. Using this in new projects is explicitly discouraged.
Active areas of work
Nothing—this is a completed, deprecated library. No active development, PRs, or issues are visible in the repo metadata. It's maintained in read-only/archive state.
🚀Get running
Clone the repo, then build the library and sample APK: git clone https://github.com/jgilfelt/SystemBarTint.git && cd SystemBarTint && ./gradlew build. This will compile both the library module and the sample app (an APK is already in sample/sample-release.apk for reference).
Daily commands:
Build and install the sample: ./gradlew sample:build then adb install sample/build/outputs/apk/sample-debug.apk. Or use Android Studio to run the sample module directly. The APK will open a demo activity showing status/nav bar tinting with configurable colors.
🗺️Map of the codebase
- library/src/com/readystatesoftware/systembartint/SystemBarTintManager.java: The entire library logic—contains setStatusBarTintEnabled(), setNavigationBarTintEnabled(), setTintColor(), and system bar inset detection via reflection
- library/AndroidManifest.xml: Declares the library module and required Android API levels (minSdkVersion 10, targetSdkVersion 19)
- sample/src/com/chiralcode/colorpicker/: Interactive color picker UI component used in sample activities to demonstrate runtime tint color changes
- sample/res/layout/activity_color.xml: Sample activity layout showing how to integrate SystemBarTintManager with a translucent theme and color picker UI
- build.gradle: Top-level Gradle config defining Android Gradle Plugin version (0.12.+) and repository sources for both library and sample
- library/build.gradle: Library module build config that compiles SystemBarTintManager.java and publishes the AAR artifact
- README.md: Usage guide showing exact API calls (setStatusBarTintEnabled, setTintColor) and deprecation notice
🛠️How to make changes
To modify tinting behavior, edit library/src/com/readystatesoftware/systembartint/SystemBarTintManager.java (the only real source file). To add demo features, edit sample/src/com/chiralcode/ (color picker) or create new layout XMLs in sample/res/layout/activity_*.xml. To test, build with ./gradlew library:build and reference the compiled AAR in your test project.
🪤Traps & gotchas
SystemBarTintManager uses reflection to access android.view.WindowManagerGlobal.getWindowManagerService() to detect system bar insets—this is a hidden Android API that could break across versions. Tinting only works when the Activity has FLAG_TRANSLUCENT_STATUS or FLAG_TRANSLUCENT_NAVIGATION enabled (set in themes like .TranslucentDecor or via android:windowTranslucent attributes); if not set, the tint view is invisible. The library was built for KitKat (API 19) styles and may not work correctly on Lollipop+ where the system bar rendering changed significantly.
💡Concepts to learn
- Translucent System UI (KitKat Feature) — This library exists solely to work around KitKat's translucent status/nav bar rendering; understanding how android:windowTranslucentStatus works is essential to using this library correctly
- Hidden Android APIs via Reflection — SystemBarTintManager uses reflection to call android.view.WindowManagerGlobal.getWindowManagerService(), a hidden internal API—this is fragile and future-breaking
- Window Insets and System Bar Geometry — The core problem this library solves: determining the size and position of status/nav bars across device configurations; essential context for layout padding strategies
- View Hierarchy Manipulation and Decoration — SystemBarTintManager injects color tint views into the activity window decor (behind content), requiring understanding of how Android composites the window structure
- Theme Attributes and Resource Inheritance — The library works by setting theme attributes like android:windowTranslucentNavigation; understanding attribute resolution is key to enabling/disabling tinting
- Drawable Inflation and Custom Tinting — Developers can pass custom Drawable resources via setStatusBarTintDrawable() and setNavigationBarTintResource(); knowledge of Drawable scaling and color filters is important
🔗Related repos
google/material-components-android— Modern replacement: Material Design 3 with native EdgeToEdge support (API 29+) for handling translucent system bars without custom tinting logicchrisbanes/insets-helper— Contemporary library (pre-2015) solving the same inset calculation problem with a different approach using WindowInsetsinsetter/insetter— Modern spiritual successor using Android X library and WindowInsets API to handle system bar insets and padding declaratively in layoutsandroid/architecture-components— Official Google repo showing modern Android architecture patterns; SystemBarTint users should migrate to AndroidX and compose-based system bar handlingandroidx/androidx— Contains androidx.core.view.WindowInsetsCompat and EdgeToEdgeCompat, the official modern APIs replacing SystemBarTint functionality
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Migrate from legacy Android build tools to modern gradle and add unit tests for SystemBarTintManager
The repo uses gradle 0.12.+ which is deprecated (from ~2014). SystemBarTintManager.java is the core logic but has no corresponding test file. Modern Android projects should have proper unit/instrumentation tests. Adding tests for the primary public methods (setTintColor, setTintDrawable, setStatusBarTintEnabled, etc.) would improve reliability and enable safer refactoring of legacy code.
- [ ] Update build.gradle to use AndroidGradlePlugin 7.x+ and modern compileSdkVersion (minimum API 21 given KitKat focus)
- [ ] Create library/src/androidTest/com/readystatesoftware/systembartint/SystemBarTintManagerTest.java for instrumentation tests
- [ ] Add test cases for: tint color setting, tint drawable setting, enabling/disabling tints for status/nav bars
- [ ] Configure testInstrumentationRunner in library/build.gradle and verify tests run with gradlew connectedCheck
Add GitHub Actions workflow for CI and add proguard rules validation
The repo has library/proguard-project.txt and sample/proguard-project.txt but no CI pipeline to verify builds succeed and ProGuard rules are syntactically valid. With deprecated KitKat APIs, automated CI prevents regressions. A GitHub Action can validate builds on multiple API levels and test the sample APK generation.
- [ ] Create .github/workflows/android-build.yml with gradle build step for both library and sample modules
- [ ] Add ProGuard validation step using
gradle shrinkDebugto catch rule syntax errors early - [ ] Test matrix should include multiple compileSdkVersions (21+) to ensure API compatibility
- [ ] Add workflow status badge to README.md
Refactor and document API level requirements in README and add values-v19 specific guidance
The repo targets KitKat (API 19) translucent modes but the README lacks clear documentation on minimum supported API levels, which methods require which API versions, and why values-v19/styles.xml differs from base styles.xml. sample/res/values-v19/styles.xml and library/AndroidManifest.xml suggest API gating, but this is undocumented. Adding this reduces integration friction for new users.
- [ ] Document in README: minimum SDK version, target SDK version, and which Android versions each feature supports
- [ ] Add inline JavaDoc comments to SystemBarTintManager.java explaining API level guards (e.g., @RequiresApi(Build.VERSION_CODES.KITKAT)) for public methods
- [ ] Expand README with a section 'Platform-Specific Behavior' explaining why values-v19 styles exist and what translucent modes require
- [ ] Add example code snippets in README showing version-safe usage patterns
🌿Good first issues
- Add unit tests for SystemBarTintManager edge cases: test that setStatusBarTintEnabled(false) correctly removes the tint view, and that setTintColor() propagates to both status and nav bar. Currently no test/ directory exists.
- Document the required AndroidManifest.xml permissions and theme attributes needed to use SystemBarTintManager—README mentions android:windowTranslucentNavigation but doesn't show the full theme XML snippet or permission requirements.
- Add a sample activity demonstrating SystemBarConfig.getStatusBarHeight() and getNavigationBarHeight() getters, which are mentioned in the README excerpt but not shown in any sample layout (activity_color.xml, activity_default.xml, activity_match_actionbar.xml).
⭐Top contributors
Click to expand
Top contributors
- @jgilfelt — 54 commits
- @blundell — 7 commits
- @richardprior — 1 commits
- @StephaneBg — 1 commits
📝Recent commits
Click to expand
Recent commits
daa0796— bump next version (jgilfelt)881001e— Merge branch 'richardprior-master' (jgilfelt)c22688b— Merge branch 'master' of https://github.com/richardprior/SystemBarTint into richardprior-master (jgilfelt)976a220— tools shifting sands (jgilfelt)6ebec36— tools shifting sands (jgilfelt)fe8deb9— Fixed bug where getActionBarHeight would throw a ResourcesNotFoundException if custom value was set for android:actionBa (richardprior)b72eb27— bump version (jgilfelt)512f6ab— account for nav bar system property override used by emulator - refs #16 (jgilfelt)244f1b8— new version, apk (jgilfelt)5405728— new version, apk (jgilfelt)
🔒Security observations
This is a deprecated Android library from 2014 targeting KitKat with critically outdated build tooling (Gradle 0.12). The project has multiple high-severity issues: ancient Gradle plugin version containing known CVEs, explicitly deprecated status with no maintenance, and likely outdated Android API targets. While the library itself appears to have minimal injection risks (it's primarily UI manipulation), the overall security posture is severely compromised by technical debt and lack of maintenance. This library should not be used in new projects and existing projects should migrate to modern alternatives. The security score reflects the critical dependency vulnerabilities and deprecated status rather than logic flaws in the code itself.
- High · Outdated Gradle Build Tools —
build.gradle (buildscript dependencies). The project uses Gradle plugin version 0.12.+ which is extremely outdated (released around 2014). This version contains numerous security vulnerabilities and is no longer supported. Using outdated build tools exposes the project to known CVEs and prevents access to modern security features. Fix: Update to the latest stable version of Android Gradle Plugin (currently 8.x). Run './gradlew wrapper --gradle-version=<latest>' and update classpath to 'com.android.tools.build:gradle:8.x.x' or similar. - High · Use of Deprecated Library —
Project root (README, repository description). The repository is explicitly marked as [DEPRECATED] in the description. The library targets KitKat (Android 4.4) translucent modes which are very old. Modern Android development has superseded this approach with better APIs. Using deprecated libraries means no security updates, no bug fixes, and incompatibility with modern Android versions. Fix: For modern Android development, use Material Design 3 and the latest AndroidX libraries. Consider using WindowInsets and the modern system bar theming APIs available in Android 5.0+. - Medium · Missing Security Configuration —
sample/AndroidManifest.xml, library/AndroidManifest.xml. No visible security configuration files (e.g., network_security_config.xml) are present in the sample or library. While this library doesn't make network calls, it demonstrates a pattern of missing security hardening that could be problematic in production applications. Fix: Add network_security_config.xml with proper certificate pinning and cleartext traffic policies, even if not immediately needed. - Medium · Outdated Target API Level —
library/AndroidManifest.xml, library/build.gradle, sample/build.gradle. Based on the deprecated nature and KitKat focus, the project likely targets very old API levels. Modern Google Play Store requires targeting API 34+ (as of 2024). Apps targeting old API levels miss critical security patches and features. Fix: Update targetSdkVersion to at least 34 (Android 14) or the latest available. Review and address any breaking changes in newer Android versions. - Low · Missing Proguard/R8 Configuration —
library/proguard-project.txt, sample/proguard-project.txt. While proguard-project.txt files exist, there is no evidence of proper code obfuscation rules in the provided files. This could expose sensitive logic in the library if reverse-engineered. Fix: Ensure comprehensive Proguard/R8 rules are in place. Use R8 (modern replacement) with proper keep rules for public API and native methods. - Low · Pre-compiled APK in Repository —
sample/sample-release.apk. The file 'sample/sample-release.apk' is committed to the repository. Distributing compiled binaries in source control is generally not recommended as it increases repository size and makes tracking changes difficult. Fix: Remove the APK from the repository. Add '*.apk' to .gitignore and distribute builds through proper channels (Google Play, GitHub Releases, etc.).
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.