RepoPilotOpen in app →

alibaba/UltraViewPager

UltraViewPager is an extension for ViewPager to provide multiple features in a single ViewPager.

Mixed

Stale — last commit 5y ago

weakest axis
Use as dependencyMixed

last commit was 5y ago; no CI workflows detected

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isMixed

last commit was 5y ago; no CI workflows detected

  • 9 active contributors
  • MIT licensed
  • Tests present
Show all 6 evidence items →
  • Stale — last commit 5y ago
  • Concentrated ownership — top contributor handles 52% of recent commits
  • No CI workflows detected
What would change the summary?
  • Use as dependency MixedHealthy if: 1 commit in the last 365 days
  • 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 "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/alibaba/ultraviewpager?axis=fork)](https://repopilot.app/r/alibaba/ultraviewpager)

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

Onboarding doc

Onboarding: alibaba/UltraViewPager

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/alibaba/UltraViewPager 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 5y ago

  • 9 active contributors
  • MIT licensed
  • Tests present
  • ⚠ Stale — last commit 5y ago
  • ⚠ Concentrated ownership — top contributor handles 52% of recent commits
  • ⚠ No CI workflows 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 alibaba/UltraViewPager repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/alibaba/UltraViewPager.

What it runs against: a local clone of alibaba/UltraViewPager — 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 alibaba/UltraViewPager | Confirms the artifact applies here, not a fork | | 2 | License is still MIT | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 1789 days ago | Catches sudden abandonment since generation |

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

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "alibaba/UltraViewPager(\\.git)?\\b" \\
  && ok "origin remote is alibaba/UltraViewPager" \\
  || miss "origin remote is not alibaba/UltraViewPager (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
  && ok "license is MIT" \\
  || miss "license drift — was MIT 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"

# 4. Critical files exist
test -f "ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPager.java" \\
  && ok "ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPager.java" \\
  || miss "missing critical file: ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPager.java"
test -f "ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerView.java" \\
  && ok "ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerView.java" \\
  || miss "missing critical file: ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerView.java"
test -f "ultraviewpager/src/main/java/com/tmall/ultraviewpager/IUltraViewPagerFeature.java" \\
  && ok "ultraviewpager/src/main/java/com/tmall/ultraviewpager/IUltraViewPagerFeature.java" \\
  || miss "missing critical file: ultraviewpager/src/main/java/com/tmall/ultraviewpager/IUltraViewPagerFeature.java"
test -f "ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerIndicator.java" \\
  && ok "ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerIndicator.java" \\
  || miss "missing critical file: ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerIndicator.java"
test -f "ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerAdapter.java" \\
  && ok "ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerAdapter.java" \\
  || miss "missing critical file: ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerAdapter.java"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 1789 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~1759d)"
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/alibaba/UltraViewPager"
  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

UltraViewPager is an Android ViewPager extension that encapsulates horizontal/vertical scrolling, circular paging, auto-scrolling, built-in indicators, and page transition animations into a single unified component. It wraps ViewPager in a RelativeLayout to provide multi-view switching scenarios with features like aspect ratio sizing, max-width/height constraints, and both circle and icon-style indicators. Single-module library: core UltraViewPager class (extends RelativeLayout, wraps ViewPager) in src/main/java/com/tmall/ultraviewpager/, paired with sample app in sample/src/main/java demonstrating all features. Layout XMLs in sample/src/main/res/, config via sample/src/main/assets/ultraviewpager_config.xml. Indicator logic built into main component.

👥Who it's for

Android developers building e-commerce apps or content browsing UIs (particularly from Alibaba/Tmall context) who need multi-page carousel/gallery features without building custom ViewPager extensions themselves.

🌱Maturity & risk

Abandoned—the README explicitly states 'Attention. This project is not maintained any more !!!'. Last version published was 1.0.7.7 to jcenter/Maven Central. Project shows reasonable test structure (sample/ with PagerActivity, UPVDemoActivity) but no recent activity visible; suitable for reference/legacy maintenance only, not new projects.

High maintenance risk: explicitly unmaintained by Alibaba. Uses Android Gradle 2.2.2 (very outdated; current is 8.x). Single maintainer (Alibaba org). No CI/CD pipeline visible. Dependency on deprecated jcenter repository (shut down in 2021). Will require significant updates to work with modern Android SDK/Gradle.

Active areas of work

Nothing—project is unmaintained. No active development, PRs, or commits visible. Last release was v1.0.7.7.

🚀Get running

Clone and build with Gradle: git clone https://github.com/alibaba/UltraViewPager.git && cd UltraViewPager && ./gradlew build. Run sample app: ./gradlew sample:installDebug or open in Android Studio and run sample module. Note: you will need to update build.gradle (currently references Gradle 2.2.2) to a modern version.

Daily commands: Import into Android Studio, select sample module, click Run. Or from CLI: ./gradlew sample:assembleDebug && adb install -r sample/build/outputs/apk/sample-debug.apk. Requires API 14+ target. Note: gradle.properties and gradle/wrapper/ define build environment.

🗺️Map of the codebase

  • ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPager.java — Main entry point and orchestrator; contains core ViewPager extension logic, feature composition, and public API—essential to understand the library's architecture
  • ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerView.java — RelativeLayout-based container that wraps ViewPager and Indicator; responsible for layout management and view composition
  • ultraviewpager/src/main/java/com/tmall/ultraviewpager/IUltraViewPagerFeature.java — Plugin interface defining the feature extension pattern; all feature implementations depend on this contract
  • ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerIndicator.java — Built-in indicator system supporting circle and icon styles; critical for page navigation UI
  • ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerAdapter.java — Adapter base class handling circular view wrapping and multi-view pagination logic
  • ultraviewpager/src/main/java/com/tmall/ultraviewpager/TimerHandler.java — Handler-based auto-scroll timer implementation; critical for timed page transitions
  • ultraviewpager/src/main/res/values/attrs.xml — XML attribute definitions for all customizable properties; required reference for configuration

🛠️How to make changes

Add a Custom Page Transition Animation

  1. Create a new transformer class extending PageTransformer in the transformer package (ultraviewpager/src/main/java/com/tmall/ultraviewpager/transformer/)
  2. Implement transformPage() to modify page View scale, rotation, and alpha properties (ultraviewpager/src/main/java/com/tmall/ultraviewpager/transformer/UltraScaleTransformer.java)
  3. Register transformer via setPageTransformer() in UltraViewPager class (ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPager.java)

Add a Custom Feature (e.g., new auto-scroll behavior)

  1. Create new class implementing IUltraViewPagerFeature interface (ultraviewpager/src/main/java/com/tmall/ultraviewpager/IUltraViewPagerFeature.java)
  2. Implement init() and destroy() lifecycle methods matching TimerHandler pattern (ultraviewpager/src/main/java/com/tmall/ultraviewpager/TimerHandler.java)
  3. Register feature by adding to feature list in UltraViewPager constructor (ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPager.java)

Customize Indicator Appearance

  1. Implement IUltraIndicatorBuilder interface to define custom indicator layout and styling (ultraviewpager/src/main/java/com/tmall/ultraviewpager/IUltraIndicatorBuilder.java)
  2. Build custom indicator View with circle or icon drawable resources (sample/src/main/res/mipmap-xhdpi/)
  3. Set builder via setIndicatorBuilder() in UltraViewPagerIndicator (ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerIndicator.java)

Enable Circular Pagination with Auto-Scroll

  1. Create custom adapter extending UltraViewPagerAdapter and override getCount() to wrap count (ultraviewpager/src/main/java/com/tmall/ultraviewpager/UltraViewPagerAdapter.java)
  2. Set XML attributes in layout: setCircularEnabled=true, setAutoScroll=true, setScrollDuration=3000 (ultraviewpager/src/main/res/values/attrs.xml)
  3. See working example in UPVDemoActivity (sample/src/main/java/com/tmall/ultraviewpager/sample/UPVDemoActivity.java)

🪤Traps & gotchas

  1. jcenter repository is permanently shut down (2021)—dependency declaration in README will not work; must use mavenCentral or local build. 2. Gradle 2.2.2 is incompatible with modern Android SDK/AGP versions; build.gradle must be updated to AGP 7.x+. 3. Uses legacy Support Library ViewPager (android.support.v4.view.ViewPager), not AndroidX androidx.viewpager.widget.ViewPager; migration required for new projects. 4. MotionEvent interception for vertical scroll may conflict with modern gesture handling (CoordinatorLayout, NestedScrollView). 5. No ProGuard/R8 rules provided beyond sample/proguard-rules.pro—risks obfuscation issues in release builds.

🏗️Architecture

💡Concepts to learn

  • MotionEvent Interception — UltraViewPager achieves vertical scrolling by intercepting and re-dispatching MotionEvent in onInterceptTouchEvent/onTouchEvent; understanding this is essential to modify scroll behavior or debug touch conflicts
  • ViewPager Decoration Pattern — UltraViewPager extends RelativeLayout rather than ViewPager itself, wrapping ViewPager as a child component; this decorator approach allows feature composition without modifying ViewPager internals
  • Handler-based Auto-Scroll Timer — Auto-scrolling feature uses Handler.sendMessageDelayed() to drive page transitions; understanding Handler threading is necessary to modify auto-scroll behavior or prevent memory leaks
  • PagerAdapter Lifecycle — UltraPagerAdapter must implement getCount(), instantiateItem(), destroyItem(); misunderstanding adapter lifecycle causes crashes or memory leaks in page recycling
  • Circular Paging / Infinite Scroll Illusion — UltraViewPager creates circular paging by duplicating pages at boundaries; recognizing the adapter wrapping logic is critical to understand how it achieves seamless wrap-around
  • Indicator Pattern (Built-in UI Components) — UltraViewPager includes circle and icon-style indicators as child views in its RelativeLayout; understanding the Indicator API (setOrientation, setFocusColor, setNormalColor) is needed to customize visual feedback
  • google/android-viewpager — Official AndroidX ViewPager2 successor; UltraViewPager is built on the legacy ViewPager and should consider this as a modernization path
  • facebook/fresco — Companion image loading library frequently used with carousel/pager UIs in Android apps for efficient image display
  • jknack/handlebars.java — Not directly related but represents Alibaba's general Java ecosystem approach; relevant if studying Alibaba's open-source Android patterns
  • android/architecture-samples — Google's reference Android architecture; useful for understanding modern patterns that would replace UltraViewPager's legacy approach in new projects

🪄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 instrumented Android unit tests for UltraViewPager core functionality

The repo has minimal test coverage (only ApplicationTest.java exists in androidTest). The UltraViewPager library needs tests for critical features like circular scrolling, vertical/horizontal scroll direction handling, auto-scroll timer logic, and aspect ratio calculations. This is especially important since the README explicitly lists these as main features but there's no test coverage validating they work correctly.

  • [ ] Create src/androidTest/java/com/tmall/ultraviewpager/UltraViewPagerCircularScrollTest.java to test circular view switching
  • [ ] Create src/androidTest/java/com/tmall/ultraviewpager/UltraViewPagerScrollDirectionTest.java to test horizontal vs vertical scrolling logic
  • [ ] Create src/androidTest/java/com/tmall/ultraviewpager/UltraViewPagerAutoScrollTest.java to test Handler-based auto-scroll timer behavior
  • [ ] Add assertions for max-height, max-width, and aspect ratio constraint enforcement
  • [ ] Integrate tests into build.gradle with proper androidTest dependencies

Create GitHub Actions CI workflow for automated Android builds and tests

The project has no CI/CD automation despite being an open-source library. With the repo now unmaintained, adding a GitHub Actions workflow would help future contributors catch regressions. The gradle files are already present (gradlew, build.gradle), making this straightforward to implement.

  • [ ] Create .github/workflows/android-ci.yml with checkout, Java setup, and gradlew build steps
  • [ ] Configure the workflow to run on push to main/develop branches and pull requests
  • [ ] Add androidTest execution step using: ./gradlew connectedAndroidTest or Firebase Test Lab integration
  • [ ] Add lint/staticAnalysis checks via: ./gradlew lint
  • [ ] Document the workflow status badge in README.md for visibility

Add comprehensive feature documentation for XML configuration and API usage

The repo has ATTRIBUTES.md and ATTRIBUTES-ch.md but these appear incomplete given the rich feature set (circular scrolling, auto-scroll with configurable intervals, page transition animations, indicator styles). The sample app includes ultraviewpager_config.xml but there's no documentation mapping XML attributes to Java API equivalents or usage patterns.

  • [ ] Expand ATTRIBUTES.md with all XML configuration options and their Java API counterparts
  • [ ] Create ADVANCED-USAGE.md documenting auto-scroll timer configuration, circular scroll setup, and page animation customization
  • [ ] Document the indicator feature (circle vs icon styles) with code examples in ATTRIBUTES.md
  • [ ] Add sample snippets showing how to combine multiple features (e.g., circular + auto-scroll + custom animation)
  • [ ] Reference specific lines from sample/src/main/assets/ultraviewpager_config.xml in the documentation

🌿Good first issues

  • Migrate build.gradle from Gradle 2.2.2 to current stable AGP version (8.x) and update all deprecated Gradle syntax; test against sample app to ensure no regressions.
  • Add JUnit/Espresso test suite for core UltraViewPager features (horizontal scroll, vertical scroll, circular paging, auto-scroll) in sample/src/androidTest; currently only ApplicationTest.java exists with no actual test cases.
  • Create AndroidX migration branch: replace android.support.v4 ViewPager with androidx.viewpager.widget.ViewPager and update dependencies; document breaking changes in MIGRATION.md for users upgrading from 1.0.7.7.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • b65233e — Update README-ch.md (longerian)
  • 9153d9b — Update README.md (longerian)
  • c16d1d4 — Update README and version. (MikeAfc)
  • 2e43cc9 — Add method to get wrap adapter and refresh data. Fix #34 #36 #37 #84 #90 #87 (MikeAfc)
  • b15c462 — Update version to 1.0.7.6 (MikeAfc)
  • 5ae5bbe — Update README (MikeAfc)
  • 6215f31 — Update demo (MikeAfc)
  • a2dbee2 — Remove unused indicator demo. Fix #83 (MikeAfc)
  • 06e40e6 — Fix #79, #75 (MikeAfc)
  • 57b5674 — Udpate readme (MikeAfc)

🔒Security observations

The codebase has significant security concerns primarily related to outdated dependencies, insecure repository configurations, and lack of active maintenance. The use of Android Gradle Plugin 2.2.2 from 2016 is a critical issue, as is the HTTP-based Maven repository which exposes the build to MITM attacks. The project is explicitly marked as unmaintained, creating long-term security risks. Immediate action is required to update dependencies and migrate to HTTPS repositories. For production use, consider using a maintained alternative or establishing a fork with proper security practices.

  • High · Outdated Gradle and Build Tool Dependencies — build.gradle (buildscript dependencies). The build.gradle file specifies 'com.android.tools.build:gradle:2.2.2' which was released in 2016 and is severely outdated. This version contains multiple known security vulnerabilities and lacks security patches from the past 7+ years. Modern Android build tools include critical security fixes for dependency resolution, code generation, and compilation processes. Fix: Update to the latest stable Android Gradle Plugin version (currently 8.x series). Also update classpath dependencies to their latest versions: gradle-bintray-plugin, build-info-extractor-gradle, and android-maven-gradle-plugin.
  • High · Insecure Maven Repository Configuration — build.gradle (repositories section). The build.gradle file includes HTTP URLs for Maven repositories: 'http://oss.jfrog.org/oss-snapshot-local/'. Using HTTP instead of HTTPS for dependency downloads creates a man-in-the-middle (MITM) attack vulnerability where malicious code could be injected during build time. Fix: Replace all HTTP Maven repository URLs with HTTPS equivalents. Use: 'https://oss.jfrog.org/oss-snapshot-local/' and ensure all repositories use secure HTTPS connections.
  • Medium · Project Marked as Not Maintained — README.md. The README explicitly states 'Attention. This project is not maintained any more !!!'. This indicates that the codebase will not receive security updates, bug fixes, or dependency patches. Using unmaintained libraries in production introduces long-term security risks. Fix: Consider migrating to an actively maintained ViewPager implementation or fork this project with proper maintenance. If continuing use, implement rigorous code review and security testing procedures.
  • Medium · Missing Dependency Version Pinning — build.gradle (buildscript dependencies). Dependencies in build.gradle lack version pinning or range specifications in some cases, making the build non-reproducible. This could lead to different versions being pulled during builds, potentially introducing vulnerabilities. Fix: Pin all dependency versions explicitly (e.g., 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' instead of potentially flexible versioning). Use dependency locking or lock files for reproducible builds.
  • Low · Snapshot Repository Usage — build.gradle (repositories section). The build configuration includes snapshot repositories ('https://oss.sonatype.org/content/repositories/snapshots/' and 'http://oss.jfrog.org/oss-snapshot-local/'). Snapshot versions are pre-release and may contain untested or unstable code. Fix: Remove snapshot repositories if not required for development. Use only stable, released versions in production builds. If snapshots are necessary, use a separate build profile for testing.

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 · alibaba/UltraViewPager — RepoPilot