ogaclejapan/SmartTabLayout
A custom ViewPager title strip which gives continuous feedback to the user when scrolling
Stale — last commit 6y ago
weakest axislast commit was 6y ago; no tests detected…
no tests detected; no CI workflows detected…
Documented and popular — useful reference codebase to read through.
last commit was 6y ago; no CI workflows detected
- ✓13 active contributors
- ✓Apache-2.0 licensed
- ⚠Stale — last commit 6y ago
Show all 6 evidence items →Show less
- ⚠Concentrated ownership — top contributor handles 73% 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/ogaclejapan/smarttablayout)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/ogaclejapan/smarttablayout on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: ogaclejapan/SmartTabLayout
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/ogaclejapan/SmartTabLayout 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 6y ago
- 13 active contributors
- Apache-2.0 licensed
- ⚠ Stale — last commit 6y ago
- ⚠ Concentrated ownership — top contributor handles 73% 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 ogaclejapan/SmartTabLayout
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/ogaclejapan/SmartTabLayout.
What it runs against: a local clone of ogaclejapan/SmartTabLayout — 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 ogaclejapan/SmartTabLayout | 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 ≤ 2195 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of ogaclejapan/SmartTabLayout. If you don't
# have one yet, run these first:
#
# git clone https://github.com/ogaclejapan/SmartTabLayout.git
# cd SmartTabLayout
#
# 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 ogaclejapan/SmartTabLayout and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "ogaclejapan/SmartTabLayout(\\.git)?\\b" \\
&& ok "origin remote is ogaclejapan/SmartTabLayout" \\
|| miss "origin remote is not ogaclejapan/SmartTabLayout (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 2195 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~2165d)"
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/ogaclejapan/SmartTabLayout"
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
SmartTabLayout is a custom Android ViewPager title strip that provides continuous visual feedback during page scrolling via smooth indicator animations and tab transitions. It extends the basic Google SlidingTabBasic sample with features like indicator interpolation modes, customizable decorations (overline/underline/divider), RTL support, and flexible tab distribution—enabling Material Design–compliant tab experiences without relying on the standard TabLayout. Standard Android library module structure: core library lives in library/ (compiled as AAR), optional utilities in utils-v4/ and utils-v13/ (for different support-library versions), and a demo app in demo/src/main/ showcasing all features across 7 distinct Activities. Build system uses gradle with Bintray publishing config.
👥Who it's for
Android app developers building tabbed interfaces who need smooth, responsive tab indicators and custom styling beyond the standard Android Support Library TabLayout; particularly those targeting pre-Material Design or apps requiring fine-grained control over tab animation behavior.
🌱Maturity & risk
Production-ready and moderately mature: the library has reached version 2.0.0 with androidx support, maintains separate branches for legacy support-library (1.7.0) and modern androidx, and includes comprehensive demo app with 7 different example implementations. However, the last commit age is not visible in provided data; check git log to confirm ongoing maintenance.
Low-to-moderate risk: single-language Java codebase (78KB) reduces complexity, but the project appears to be maintained by a single author (ogaclejapan); no CI/CD pipeline visible in gradle config (uses Bintray, now deprecated in favor of Maven Central). The library depends on ViewPager (legacy or androidx) which may face deprecation pressure as Compose gains adoption.
Active areas of work
The repository maintains two active release tracks: version 2.0.0 for androidx users and version 1.7.0 for legacy support-library projects. The demo app includes specialized implementations like DemoLikeMediumActivity, DemoRtlActivity, and DemoTabWithNotificationMarkActivity, suggesting recent feature expansion. Specific recent PR/commit data not visible in provided snapshot.
🚀Get running
Clone and build with gradle: git clone https://github.com/ogaclejapan/SmartTabLayout.git && cd SmartTabLayout && ./gradlew assembleDebug. To run the demo app: ./gradlew demo:installDebug followed by launching the app on an emulator or device. See demo/src/main/AndroidManifest.xml for the main entry point.
Daily commands:
./gradlew demo:installDebug && adb shell am start -n com.ogaclejapan.smarttablayout.demo/.MainActivity or open in Android Studio and run via the IDE.
🗺️Map of the codebase
- library/src/main/java/com/ogaclejapan/smarttablayout/SmartTabLayout.java: Core widget implementation; handles indicator positioning, page change callbacks, and all visual rendering via custom paint logic
- library/src/main/res/values/attrs.xml: Defines all 20+ custom XML attributes (stl_indicatorColor, stl_indicatorInterpolation, etc.) that users configure in layouts
- demo/src/main/java/com/ogaclejapan/smarttablayout/demo/MainActivity.java: Entry point demonstrating how to wire SmartTabLayout to a ViewPager with a FragmentPagerAdapter
- demo/src/main/java/com/ogaclejapan/smarttablayout/demo/DemoActivity.java: Canonical example activity showing attribute configuration and basic usage patterns
- build.gradle: Root gradle config; includes Bintray publishing settings and version management (GROUP, VERSION_NAME, ARTIFACT_NAME)
🛠️How to make changes
Core tab behavior lives in library/src/main/java/com/ogaclejapan/smarttablayout/ (SmartTabLayout.java is the main widget). For styling/attributes, check library/src/main/res/values/attrs.xml. To add a new demo variant, create a new Activity in demo/src/main/java/com/ogaclejapan/smarttablayout/demo/ mirroring DemoActivity.java. For indicator drawing logic, inspect the onDraw() and onPageScrolled() methods in SmartTabLayout.java.
🪤Traps & gotchas
The library supports both legacy android:support library (v28.0.0, version 1.7.0) and androidx (version 2.0.0+); ensure your project uses the correct AAR flavor to avoid duplicate class errors. The stl_titleOffset attribute (24dp default) controls horizontal padding and may cause layout shift if not accounted for. RTL support via DemoRtlActivity requires explicit manifesting; check for layoutDirection bugs on Android < 5.0. The deprecated utils-v13 module should not be used in new projects.
💡Concepts to learn
- ViewPager.OnPageChangeListener — Core mechanism for SmartTabLayout to receive scroll callbacks from ViewPager and update indicator position in real-time during user swipes
- Custom Paint Rendering & Canvas Drawing — SmartTabLayout draws indicators, decorations (overline/underline/divider) directly via onDraw() using Paint objects; understanding clip regions and layer ordering is essential for modifying visual behavior
- Interpolator (Animation Interpolation) — The stl_indicatorInterpolation attribute supports 'smart', 'linear', and 'accelerate' modes; Interpolator interface controls non-linear animation easing of tab transitions
- Custom Styleable Attributes — SmartTabLayout exposes 20+ XML attributes via attrs.xml using custom namespaces (app:stl_*); required for configurable theming without code changes
- Right-to-Left (RTL) Layout Direction — DemoRtlActivity demonstrates RTL support required for Arabic/Hebrew apps; requires careful handling of tab order and indicator mirroring
- AAR (Android Archive) Packaging — SmartTabLayout publishes as .aar files to Maven/Bintray; understanding this format is essential for library distribution and dependency management
- Fragment + PagerAdapter Pattern — Demo app uses FragmentPagerAdapter to bind Fragments to ViewPager; understanding lifecycle coordination is crucial for proper tab and page state management
🔗Related repos
material-components/material-components-android— Official Material Design TabLayout; modern alternative but less customizable for advanced indicator animationsastuetz/PagerSlidingTabStrip— Historical predecessor for ViewPager tab indicators; SmartTabLayout builds on similar continuous-feedback pattern but with modern aestheticsgoogle/android-samples— Contains the SlidingTabBasic sample that inspired this library; useful reference for ViewPager integration patternsandroid/architecture-samples— Demonstrates best practices for modular Android library structure and build configuration similar to SmartTabLayout's setup
🪄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.
Add unit tests for SmartTabLayout core functionality
The repo lacks visible test coverage. The library's core tab layout logic (scrolling feedback, tab positioning, ViewPager integration) should have unit tests. This is critical for a UI library where continuous feedback during scrolling is the main feature. Tests would prevent regressions when updating to newer Android gradle versions (currently at 3.3.1).
- [ ] Create src/test/java directory structure mirroring the library source
- [ ] Add unit tests for SmartTabLayout's scroll position calculations and ViewPager callbacks
- [ ] Add tests for RTL (right-to-left) layout handling, since DemoRtlActivity.java exists
- [ ] Add AndroidX instrumented tests (androidTest) for visual feedback during actual ViewPager scrolling
- [ ] Update build.gradle with testImplementation dependencies (junit, mockito, androidx.test)
Add GitHub Actions CI workflow for automated testing and release validation
The project uses Bintray for publishing (gradle-bintray-plugin) and has multiple demo activities, but no visible CI configuration. A GitHub Actions workflow would validate builds against different Android API levels, run tests, and catch compatibility issues before releases, especially important given the gradle version is outdated (3.3.1).
- [ ] Create .github/workflows/android-build.yml to build and test on API 21, 24, 29, 33+
- [ ] Add step to validate APK generation for demo/ module
- [ ] Add step to run lint checks on both library and demo modules
- [ ] Create .github/workflows/publish.yml for Bintray release validation on version tags
- [ ] Document CI status in README.md with badge
Add comprehensive Javadoc and update README with API documentation for SmartTabLayout configuration options
The README snippet is incomplete (cuts off at 'androidx (1.0'). The library has multiple demo activities showing different configurations (DemoLikeMediumActivity, DemoTabWithNotificationMarkActivity, DemoRtlActivity), but there's no API documentation explaining available XML attributes or programmatic configuration. New contributors need clear docs to understand customization options.
- [ ] Complete the README.md Usage section with full androidx dependency snippet and attribute documentation
- [ ] Add Javadoc comments to SmartTabLayout public methods and XML attributes
- [ ] Create docs/CONFIGURATION.md documenting available attributes (colors, sizing, behavior flags) with examples from the demo activities
- [ ] Add section in README linking to specific demo activities as examples for common use cases (Medium-style layout, notification badges, RTL support)
- [ ] Generate Javadoc using gradle task and ensure it's generated in CI/CD
🌿Good first issues
- Add instrumented unit tests for indicator position calculation (SmartTabLayout.java's indicator interpolation logic lacks test coverage; write tests for linear, smart, and accelerate interpolation modes with mock OnPageChangeListener scenarios)
- Document all 20+ XML attributes with code examples in a dedicated ATTRIBUTES.md file (currently only README.md snippet shows a subset; create a reference with descriptions of stl_indicatorGravity, stl_overlineThickness, stl_distributeEvenly, etc.)
- Extract magic numbers from SmartTabLayout.java into named constants (e.g., the indicator animation duration, default padding values) and add comments explaining their purpose
⭐Top contributors
Click to expand
Top contributors
- @ogaclejapan — 73 commits
- @satorufujiwara — 5 commits
- @kawano_shohei — 4 commits
- [@Shaun Kawano](https://github.com/Shaun Kawano) — 3 commits
- @ogata_masaki — 3 commits
📝Recent commits
Click to expand
Recent commits
712e81a— Migrate to androidx (ogaclejapan)2a2141d— Bump up version to 1.7.0 (ogaclejapan)af1d44f— Update gradle environment and support library to latest version (ogaclejapan)a38d288— Merge pull request #200 from EzimetYusup/patch-1 (ogaclejapan)97b763e— Update README.md (EzimetYusup)5bdc52f— Bump up build tools plugin version to 2.2.2 (ogaclejapan)f756b35— added link for ios (EzimetYusup)f305a2d— Merge pull request #163 from cosic/master (ogaclejapan)1793554— #162 Fix black cicle indicator for Samsung Galaxy S Duos GT-S7562 (cosic)06a99c8— Bump up version to 1.6.1 (ogaclejapan)
🔒Security observations
The SmartTabLayout project has significant security concerns related to outdated dependencies and build tools. The Android Gradle plugin (3.3.1) and various gradle plugins are several years old and no longer receiving security updates. The use of deprecated repositories (jcenter and Bintray) compounds the risk. Immediate action is required to update all build tooling and migrate away from deprecated services. The codebase itself does not show obvious code-level vulnerabilities (SQLi, XSS, hardcoded secrets), but the build infrastructure requires modernization for secure dependency management.
- High · Outdated Gradle Plugin —
build.gradle - classpath 'com.android.tools.build:gradle:3.3.1'. The Android Gradle plugin version 3.3.1 is significantly outdated (released in 2019). This version may contain known security vulnerabilities and lacks security patches available in current versions (7.x+). Fix: Update to the latest stable Android Gradle plugin version (e.g., 7.4.2 or later) to receive security patches and vulnerability fixes. - High · Outdated Bintray Plugin —
build.gradle - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'. The gradle-bintray-plugin version 1.8.4 is outdated. Bintray was deprecated and shut down in May 2021. Using outdated build plugins can introduce security risks. Fix: Migrate to Maven Central Repository directly or use alternative distribution methods. Update to use 'com.gradle.plugin-publish' or remove Bintray dependencies entirely. - Medium · Outdated Gradle Plugins —
build.gradle - multiple classpath entries. Multiple gradle plugins are significantly outdated: android-maven-gradle-plugin (2.1, archived), gradle-versions-plugin (0.21.0), and license-gradle-plugin (0.15.0). Outdated tools may have unpatched vulnerabilities. Fix: Update gradle-versions-plugin to latest version. Replace android-maven-gradle-plugin with 'maven-publish' plugin. Update license-gradle-plugin to the latest stable version. - Medium · Use of Deprecated jcenter Repository —
build.gradle - jcenter() in repositories. The build.gradle file includes jcenter() repository which was shut down by JFrog in January 2022. Relying on deprecated repositories can lead to build failures and security issues. Fix: Remove jcenter() repository references. Ensure all dependencies are available from google() and mavenCentral() repositories. - Low · Missing Security Best Practices in ProGuard Configuration —
demo/proguard-rules.pro. While a proguard-rules.pro file exists, there is no visibility into its contents to verify proper configuration for security-sensitive code obfuscation. Fix: Review ProGuard rules to ensure sensitive classes are properly obfuscated and that security-critical code is protected. - Low · No Security Policy Documentation —
Repository root. No SECURITY.md or security policy file is present for reporting vulnerabilities responsibly. Fix: Create a SECURITY.md file with instructions for responsible vulnerability disclosure.
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.