RepoPilotOpen in app →

ogaclejapan/SmartTabLayout

A custom ViewPager title strip which gives continuous feedback to the user when scrolling

Mixed

Stale — last commit 6y ago

weakest axis
Use as dependencyMixed

last commit was 6y ago; no tests detected…

Fork & modifyMixed

no tests detected; no CI workflows detected…

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isMixed

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 →
  • 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 MixedHealthy if: 1 commit in the last 365 days; add a test suite
  • Fork & modify MixedHealthy if: add a test suite
  • Deploy as-is MixedHealthy 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.

RepoPilot: Great to learn from
[![RepoPilot: Great to learn from](https://repopilot.app/api/badge/ogaclejapan/smarttablayout?axis=learn)](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:

  1. 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.
  2. 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.
  3. 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 |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>ogaclejapan/SmartTabLayout</code></summary>
#!/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).

</details>

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

🛠️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
  • material-components/material-components-android — Official Material Design TabLayout; modern alternative but less customizable for advanced indicator animations
  • astuetz/PagerSlidingTabStrip — Historical predecessor for ViewPager tab indicators; SmartTabLayout builds on similar continuous-feedback pattern but with modern aesthetics
  • google/android-samples — Contains the SlidingTabBasic sample that inspired this library; useful reference for ViewPager integration patterns
  • android/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

📝Recent commits

Click to expand
  • 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.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · ogaclejapan/SmartTabLayout — RepoPilot