RepoPilotOpen in app →

ongakuer/CircleIndicator

A lightweight indicator like in nexus 5 launcher

Mixed

Stale — last commit 3y ago

weakest axis
Use as dependencyMixed

last commit was 3y 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 3y ago; no CI workflows detected

  • 9 active contributors
  • Apache-2.0 licensed
  • Stale — last commit 3y ago
Show all 6 evidence items →
  • Concentrated ownership — top contributor handles 68% 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/ongakuer/circleindicator?axis=learn)](https://repopilot.app/r/ongakuer/circleindicator)

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/ongakuer/circleindicator on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: ongakuer/CircleIndicator

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/ongakuer/CircleIndicator 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 3y ago

  • 9 active contributors
  • Apache-2.0 licensed
  • ⚠ Stale — last commit 3y ago
  • ⚠ Concentrated ownership — top contributor handles 68% 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 ongakuer/CircleIndicator repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/ongakuer/CircleIndicator.

What it runs against: a local clone of ongakuer/CircleIndicator — 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 ongakuer/CircleIndicator | 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 ≤ 1131 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>ongakuer/CircleIndicator</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of ongakuer/CircleIndicator. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/ongakuer/CircleIndicator.git
#   cd CircleIndicator
#
# 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 ongakuer/CircleIndicator and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "ongakuer/CircleIndicator(\\.git)?\\b" \\
  && ok "origin remote is ongakuer/CircleIndicator" \\
  || miss "origin remote is not ongakuer/CircleIndicator (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 1131 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~1101d)"
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/ongakuer/CircleIndicator"
  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

CircleIndicator is a lightweight Android library that renders dot-style page indicators like the Nexus 5 launcher, supporting ViewPager, RecyclerView, and ViewPager2 with customizable animations and styles. It provides three indicator classes (CircleIndicator, CircleIndicator2, CircleIndicator3) that automatically sync with their respective container widgets and support manual control via methods like createIndicators() and animatePageSelected(). Two-module structure: circleindicator/ is the core library containing BaseCircleIndicator.java (abstract base), three concrete implementations (CircleIndicator.java, CircleIndicator2.java, CircleIndicator3.java), and XML attribute definitions in attrs.xml; LoopingViewPager/ is an optional companion module providing LoopViewPager.java wrapper for infinite paging. Resources include drawable templates (white_radius.xml) and animator definitions (scale_with_alpha.xml) in res/.

👥Who it's for

Android developers building paged UI experiences (carousels, image galleries, onboarding flows) who need a polished, out-of-the-box indicator component without rolling custom animations or state management.

🌱Maturity & risk

Mature and stable: published to Maven Central with version 2.1.6 for AndroidX and 1.3.2 for legacy support libraries, targeting SDK 14+ with Java 1.8. The library has been actively maintained with support for modern Android components (ViewPager2, AndroidX) but shows moderate activity (API is settled, no major breaking changes recently visible).

Low risk: minimal dependencies (only androidx.viewpager:viewpager and androidx.fragment), no third-party animation libraries, and broad API coverage (three indicator variants cover all major paging containers). Single maintainer (ongakuer) is a potential long-term maintenance risk, but the library is small and self-contained with no external service dependencies.

Active areas of work

No active development signals are visible in the provided file list; repository appears in maintenance mode with stable API. The CHANGELOG.md exists but content not shown; last tagged version appears to be 2.1.6 supporting AndroidX. No open PRs or ongoing feature work visible.

🚀Get running

Clone and build via Gradle: git clone https://github.com/ongakuer/CircleIndicator.git && cd CircleIndicator && ./gradlew assembleDebug. Import the circleindicator module into your project as implementation 'me.relex:circleindicator:2.1.6' (AndroidX) or add it as a source module dependency.

Daily commands: No runnable app in the main library. Execute tests via ./gradlew test or debug with ./gradlew assembleDebug. To see it in action, reference the sample APK in apk/sample.apk or examine integration examples in the README (ViewPager, RecyclerView, ViewPager2 binding patterns).

🗺️Map of the codebase

🛠️How to make changes

For animation changes: edit circleindicator/src/main/res/animator/scale_with_alpha.xml. For core indicator logic: modify circleindicator/src/main/java/me/relex/circleindicator/BaseCircleIndicator.java (shared base) or specific implementations (CircleIndicator.java for ViewPager, CircleIndicator2.java for RecyclerView, CircleIndicator3.java for ViewPager2). For attributes: update circleindicator/src/main/res/values/attrs.xml and corresponding getter/setter methods in indicator classes.

🪤Traps & gotchas

No hidden traps are evident from the file structure. Config is straightforward (AndroidX dependencies, Java 1.8 target, no custom Gradle plugins or build-time code generation). One minor note: CircleIndicator and CircleIndicator3 use different callback mechanisms (ViewPager.OnPageChangeListener vs ViewPager2.OnPageChangeCallback), so switching between them requires rewriting the binding code—this is expected but worth noting during migration.

💡Concepts to learn

  • nickbutcher/plaid — Material Design showcase app with sophisticated page indicators and ViewPager usage patterns; reference implementation of indicator UX best practices
  • google/accompanist — Modern Compose library with Pager and indicator composables; successor pattern for new Android projects migrating from Views
  • yarolegovich/DiscreteScrollView — Alternative library for pageable horizontal lists; complements CircleIndicator as a full carousel solution with different scroll behavior
  • android/architecture-samples — Canonical Android architecture patterns and testing examples; reference for structuring indicator library tests and sample app
  • ongakuer/LoopingViewPager — Sibling repository by same author; provides infinite looping wrapper (LoopViewPager.java is bundled as LoopingViewPager module) for use with CircleIndicator

🪄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 BaseCircleIndicator.java and CircleIndicator variants

The repo has no visible test directory (no src/test or src/androidTest folders). Given that CircleIndicator has three main variants (CircleIndicator, CircleIndicator2, CircleIndicator3) with different backing views (ViewPager, RecyclerView, ViewPager2), unit tests would catch regressions in indicator positioning, animation behavior, and lifecycle management. This is critical for a UI library.

  • [ ] Create circleindicator/src/test/java/me/relex/circleindicator/ for unit tests
  • [ ] Create circleindicator/src/androidTest/java/me/relex/circleindicator/ for instrumentation tests
  • [ ] Add tests for BaseCircleIndicator.java covering indicator count changes, selection updates, and animation triggers
  • [ ] Add tests for CircleIndicator2.java verifying RecyclerView adapter integration and scroll position synchronization
  • [ ] Add tests for CircleIndicator3.java verifying ViewPager2 integration
  • [ ] Update circleindicator/build.gradle to include androidx.test:runner and androidx.test.espresso:espresso-core dependencies

Add GitHub Actions workflow for automated testing and APK build verification

No CI/CD pipeline exists (.github/workflows/ directory is missing). The repo has a sample APK but no automated verification that it builds correctly on pull requests. A CI workflow would catch build failures from gradle changes, API level incompatibilities, or dependency conflicts across Android SDK versions.

  • [ ] Create .github/workflows/android-build.yml with gradle build step for circleindicator module
  • [ ] Add gradle build step for sample module to verify sample app builds
  • [ ] Configure workflow to run on push to main/master and on all pull requests
  • [ ] Test against Android SDK 29 and 30+ (referenced in build.gradle) using mavenCentral() dependencies
  • [ ] Add optional lint checks using ./gradlew lint task to catch Android lint warnings

Document and add example implementations for CircleIndicator3 with ViewPager2

CircleIndicator3 is listed in the README but has no usage documentation or sample implementation visible. The LoopingViewPager and sample code don't demonstrate ViewPager2 integration. Adding a concrete example in sample/src/main would help new contributors understand the ViewPager2 API differences and reduce support questions.

  • [ ] Create sample/src/main/java/me/relex/circleindicator/ViewPager2Activity.java with CircleIndicator3 integrated with ViewPager2
  • [ ] Add corresponding sample layout file sample/src/main/res/layout/activity_viewpager2.xml
  • [ ] Update sample/src/main/AndroidManifest.xml to register ViewPager2Activity
  • [ ] Add section to README.md documenting CircleIndicator3 usage with code example and ViewPager2 dependencies
  • [ ] Add comments explaining differences from CircleIndicator (ViewPager) implementation for maintainability

🌿Good first issues

  • Add unit tests for BaseCircleIndicator state transitions (no test files visible in circleindicator/src); verify indicator count, selection index, and animation triggering under lifecycle changes
  • Document and test RecyclerView edge case: CircleIndicator2 behavior when adapter is empty or has fewer items than visible—add null checks and empty state handling if missing
  • Create example XML layouts in circleindicator/src/main/res/layout/ (or sample app) demonstrating all three indicator variants (ViewPager, RecyclerView, ViewPager2) side-by-side with working code snippets

Top contributors

Click to expand
  • @Relex — 68 commits
  • @ongakuer — 22 commits
  • [@Daniell Algar](https://github.com/Daniell Algar) — 2 commits
  • @zhehuaz — 2 commits
  • @polok — 2 commits

📝Recent commits

Click to expand
  • 7847a22 — Add mavenCentral(). Update README.md (Relex)
  • a4ab1f5 — upload to maven (Relex)
  • 678e9a6 — Update README.md (Relex)
  • aa31b62 — bugfix (Relex)
  • 5aeeb26 — update jcenter (Relex)
  • 43752b4 — Support Change Drawable (Relex)
  • 0d8d118 — Dependency Updates (Relex)
  • 91f5bf5 — Merge remote-tracking branch 'remotes/origin/master' (Relex)
  • 4d4725d — update (Relex)
  • 7dd9264 — xml preview (Relex)

🔒Security observations

This Android UI library has moderate security concerns primarily related to outdated dependencies and build configurations. The main risks are: (1) Significantly outdated SDK versions (API 29) lacking modern security patches, (2) Outdated AndroidX dependencies with unpatched vulnerabilities, (3) Code minification disabled in release builds enabling reverse engineering, and (4) Extremely low minimum SDK support (API 14) exposing users to legacy vulnerabilities. The codebase itself appears to be a lightweight UI indicator library without obvious injection vulnerabilities or hardcoded secrets. Remediation should focus on updating all dependencies, increasing minimum and target SDK versions, enabling code minification, and validating against current Android security best practices.

  • High · Outdated Gradle and Android SDK Versions — circleindicator/build.gradle. The project uses compileSdkVersion 29 and targetSdkVersion 29, which are significantly outdated (released in 2019). This means the library may not include critical security patches and may not comply with modern Google Play Store requirements. Current stable versions are 33+. Fix: Update compileSdkVersion and targetSdkVersion to at least 33 or higher. Review and update deprecated APIs accordingly.
  • High · Outdated AndroidX Dependencies — circleindicator/build.gradle. The project uses androidx.viewpager:viewpager:1.0.0 (released 2019) and androidx.fragment:fragment:1.2.5 (released 2020). These versions lack security patches and bug fixes from newer releases. Fix: Update dependencies: androidx.viewpager:viewpager to 1.0.0 or androidx.viewpager2:viewpager2 (recommended), and androidx.fragment:fragment to 1.6.0+. Review release notes for breaking changes.
  • Medium · Minify Disabled in Release Builds — circleindicator/build.gradle. The build configuration has minifyEnabled set to false in release builds. This exposes the application code to reverse engineering and makes it easier for attackers to understand and exploit the application logic. Fix: Set minifyEnabled to true in release builds and configure appropriate ProGuard/R8 rules in proguard-rules.pro to obfuscate code while preserving necessary functionality.
  • Medium · Low Minimum SDK Version — circleindicator/build.gradle. minSdkVersion is set to 14 (Android 4.0, released 2011). This is extremely old and associated with numerous security vulnerabilities. Supporting such old versions exposes the application to known exploits and security issues. Fix: Increase minSdkVersion to at least 21 (Android 5.0) or higher to reduce exposure to legacy vulnerabilities. Check market requirements for your target audience.
  • Low · Missing Security Configuration — circleindicator/src/main/res/. No explicit security configuration files (network_security_config.xml) are visible in the repository. While this library may not make network requests, good practice would be to define security policies. Fix: Consider creating a network_security_config.xml file to explicitly define certificate pinning and network security policies, especially if the library or sample app makes any network calls.
  • Low · Gradle Wrapper JAR Present — gradle/wrapper/gradle-wrapper.jar. The gradle/wrapper/gradle-wrapper.jar file is committed to version control. While this can be intentional for reproducible builds, it poses a supply chain risk if the JAR is compromised. Fix: Consider using gradle/wrapper/gradle-wrapper.properties with 'distributionUrl' to download the wrapper at build time instead of committing the JAR. If keeping the JAR, ensure it's from an official source and regularly audited.

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 · ongakuer/CircleIndicator — RepoPilot