amlcurran/ShowcaseView
[Archived] Highlight the best bits of your app to users quickly, simply, and cool...ly
Stale and unlicensed — last commit 8y ago
weakest axisno license — legally unclear; last commit was 8y ago…
no license — can't legally use code; no tests detected…
Documented and popular — useful reference codebase to read through.
no license — can't legally use code; last commit was 8y ago
- ✓9 active contributors
- ✓CI configured
- ⚠Stale — last commit 8y ago
Show all 6 evidence items →Show less
- ⚠Single-maintainer risk — top contributor 84% of recent commits
- ⚠No license — legally unclear to depend on
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: publish a permissive license (MIT, Apache-2.0, etc.)
- →Fork & modify Concerns → Mixed if: add a LICENSE file
- →Deploy as-is Concerns → Mixed if: add a LICENSE file
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/amlcurran/showcaseview)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/amlcurran/showcaseview on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: amlcurran/ShowcaseView
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/amlcurran/ShowcaseView 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
AVOID — Stale and unlicensed — last commit 8y ago
- 9 active contributors
- CI configured
- ⚠ Stale — last commit 8y ago
- ⚠ Single-maintainer risk — top contributor 84% of recent commits
- ⚠ No license — legally unclear to depend on
- ⚠ 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 amlcurran/ShowcaseView
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/amlcurran/ShowcaseView.
What it runs against: a local clone of amlcurran/ShowcaseView — 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 amlcurran/ShowcaseView | Confirms the artifact applies here, not a fork |
| 2 | Default branch master exists | Catches branch renames |
| 3 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 4 | Last commit ≤ 3048 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of amlcurran/ShowcaseView. If you don't
# have one yet, run these first:
#
# git clone https://github.com/amlcurran/ShowcaseView.git
# cd ShowcaseView
#
# 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 amlcurran/ShowcaseView and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "amlcurran/ShowcaseView(\\.git)?\\b" \\
&& ok "origin remote is amlcurran/ShowcaseView" \\
|| miss "origin remote is not amlcurran/ShowcaseView (artifact may be from a fork)"
# 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 "library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseView.java" \\
&& ok "library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseView.java" \\
|| miss "missing critical file: library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseView.java"
test -f "library/src/main/java/com/github/amlcurran/showcaseview/targets/Target.java" \\
&& ok "library/src/main/java/com/github/amlcurran/showcaseview/targets/Target.java" \\
|| miss "missing critical file: library/src/main/java/com/github/amlcurran/showcaseview/targets/Target.java"
test -f "library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseDrawer.java" \\
&& ok "library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseDrawer.java" \\
|| miss "missing critical file: library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseDrawer.java"
test -f "library/src/main/java/com/github/amlcurran/showcaseview/AnimationFactory.java" \\
&& ok "library/src/main/java/com/github/amlcurran/showcaseview/AnimationFactory.java" \\
|| miss "missing critical file: library/src/main/java/com/github/amlcurran/showcaseview/AnimationFactory.java"
test -f "library/src/main/java/com/github/amlcurran/showcaseview/ShotStateStore.java" \\
&& ok "library/src/main/java/com/github/amlcurran/showcaseview/ShotStateStore.java" \\
|| miss "missing critical file: library/src/main/java/com/github/amlcurran/showcaseview/ShotStateStore.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 3048 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~3018d)"
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/amlcurran/ShowcaseView"
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
ShowcaseView is an Android library that creates distinctive overlay highlights over specific UI elements to guide users through app features. It renders a darkened overlay with a transparent 'spotlight' circle around target views, paired with title and description text, supporting three visual styles (Holo, NewStyle, Material). The library uses reflection-based targeting to work with ActionBar items, standard Views, and even specific Points on screen. Single-module Android library under library/ containing source at library/src/main/java/com/github/amlcurran/showcaseview/. Core is ShowcaseView.java (main view class) plus ShowcaseDrawer implementations (StandardShowcaseDrawer, MaterialShowcaseDrawer, NewShowcaseDrawer) for rendering styles. Separate targets/ package handles different view targeting strategies (ViewTarget, ActionViewTarget, PointTarget, etc.) using Reflector pattern for ActionBar compatibility layers.
👥Who it's for
Android developers building user onboarding flows or feature tutorials who need to highlight specific UI elements without building custom overlay logic. Used by production apps like Google Cast Videos, BBC iPlayer Radio, AllCast, The Guardian, and HaxSync.
🌱Maturity & risk
Mature but archived: the repo is no longer actively maintained (marked [Archived] in description), last activity appears to be around v5.4.3 release cycle. The codebase is stable and production-proven (used by major apps), has CI via Travis CI (.travis.yml present), but no recent commits or active development visible. Safe for existing integrations, but expect no updates for new Android API levels.
Main risk is API level ceiling: only supports API 11+ and no longer updated, so Material Design 3 features and modern Android patterns won't be backported. Single maintainer (amlcurran) with no recent activity increases bus factor. Dependency on ActionBar reflection (ActionBarReflector, AppCompatReflector, SherlockReflector) means it may break with AppCompat library updates. No test infrastructure visible in file list, only gradle build config.
Active areas of work
Project is archived—no active development. The README mentions the legacy branch as a historical reference point. v5 intentionally removed ShowcaseViews queue class and ghostly hand gesture, simplifying the API around the Builder pattern. No visible PRs or open issues in provided data.
🚀Get running
Clone repo: git clone https://github.com/amlcurran/ShowcaseView.git && cd ShowcaseView. Build library: ./gradlew build (using Gradle wrapper in repo). To use in another project, add to build.gradle: compile 'com.github.amlcurran.showcaseview:library:5.4.3' or clone and reference locally.
Daily commands:
Run ./gradlew build to compile the library. For the sample app (if included): ./gradlew installDebug or open in Android Studio and run. No dev server; this is a library meant to be embedded in other Android apps.
🗺️Map of the codebase
library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseView.java— Core View class that renders the showcase overlay and handles all visual presentation logic; foundational entry point for the entire librarylibrary/src/main/java/com/github/amlcurran/showcaseview/targets/Target.java— Abstract interface defining how showcase targets are positioned and measured; critical abstraction for all view/action targetinglibrary/src/main/java/com/github/amlcurran/showcaseview/ShowcaseDrawer.java— Core abstraction for rendering showcase visuals; implementations (Standard, Material, NewShowcase) depend on this interfacelibrary/src/main/java/com/github/amlcurran/showcaseview/AnimationFactory.java— Factory interface for animation strategies; enables pluggable animation behavior across API levelslibrary/src/main/java/com/github/amlcurran/showcaseview/ShotStateStore.java— Persistence layer for showcase state tracking; manages single-shot behavior and user preferenceslibrary/src/main/java/com/github/amlcurran/showcaseview/OnShowcaseEventListener.java— Event callback interface for lifecycle hooks; required for handling showcase open/close/dismiss events
🛠️How to make changes
Add a custom showcase visual style
- Create a new class extending ShowcaseDrawer interface (
library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseDrawer.java) - Implement draw() and calculateShowcaseRect() methods with custom Canvas rendering logic (
library/src/main/java/com/github/amlcurran/showcaseview/StandardShowcaseDrawer.java) - Pass instance to ShowcaseView via setShowcaseDrawer() or builder pattern (
library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseView.java)
Add support for a new UI element type (custom targets)
- Create new Target implementation extending the Target interface (
library/src/main/java/com/github/amlcurran/showcaseview/targets/Target.java) - Implement getPoint() to return center coordinates and getRadius() for highlight size (
library/src/main/java/com/github/amlcurran/showcaseview/targets/ViewTarget.java) - Pass instance to ShowcaseView.setTarget(target) during configuration (
library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseView.java)
Customize animation behavior across API levels
- Implement AnimationFactory interface with createShowcaseAnimation() and createButtonAnimation() methods (
library/src/main/java/com/github/amlcurran/showcaseview/AnimationFactory.java) - Reference existing AnimatorAnimationFactory or NoAnimationFactory for API-compatible patterns (
library/src/main/java/com/github/amlcurran/showcaseview/AnimatorAnimationFactory.java) - Inject factory via ShowcaseView.setAnimationFactory() before show() (
library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseView.java)
Add showcase state persistence/tracking
- Extend or wrap ShotStateStore to customize SharedPreferences keys and retention logic (
library/src/main/java/com/github/amlcurran/showcaseview/ShotStateStore.java) - Pass custom store instance to ShowcaseView constructor or via builder method (
library/src/main/java/com/github/amlcurran/showcaseview/ShowcaseView.java) - Call shotId(String) to enable single-shot mode and automatic dismissal on subsequent app launches (
sample/src/main/java/com/github/amlcurran/showcaseview/sample/SingleShotActivity.java)
🪤Traps & gotchas
Reflection-based ActionBar targeting (ActionBarReflector, AppCompatReflector, SherlockReflector) is version-specific and may silently fail if ActionBar internals change—no clear error messages. ShowcaseView must be added to a ViewGroup (typically Activity's root), not all container types work equally. The ShotStateStore uses SharedPreferences for 'don't show again' logic, so clearing app data wipes tutorial state. Material drawer expects API 21+ but gracefully falls back to NewStyle on lower APIs. Touch interception with hideOnTouchOutside() may conflict with other overlay libraries.
🏗️Architecture
💡Concepts to learn
- Reflection for ActionBar introspection — ShowcaseView uses Java reflection (ActionBarReflector.java, AppCompatReflector.java) to dynamically detect and locate ActionBar menu items without depending on their internal structure, enabling support across ActionBar variants (native, AppCompat, ActionBarSherlock)
- Canvas-based custom drawing (2D graphics) — ShowcaseDrawer implementations use Android Canvas API to render the overlay darkness, spotlight circle, and text—understanding Canvas transforms, Path operations, and Paint properties is essential for modifying visual styles
- Property Animation framework (ValueAnimator/ObjectAnimator) — AnimatorAnimationFactory.java uses the Property Animation API (API 11+) to smoothly animate the spotlight entrance/exit rather than immediate visibility, critical for the 'cool...ly' aspect advertised in the README
- ViewGroup overlay and touch event interception — ShowcaseView is a FrameLayout overlay added to the activity root; understanding ViewGroup.onTouchEvent() and onInterceptTouchEvent() is needed to implement hideOnTouchOutside() and prevent touch leakage to underlying UI
- Strategy pattern with ShowcaseDrawer and Target interfaces — The codebase uses Strategy pattern heavily (ShowcaseDrawer subclasses, Target subclasses, ReflectorFactory) to swap rendering styles and targeting logic at runtime without modifying ShowcaseView.java itself
- SharedPreferences for lightweight persistence — ShotStateStore.java uses SharedPreferences to remember which showcases a user has dismissed ('don't show this tutorial again'), a common pattern in onboarding systems
- View coordinate geometry and transformation — ShowcaseAreaCalculator.java performs coordinate space math (getLocationOnScreen, bounding boxes, padding calculations) to convert view-local coordinates to screen-absolute positions for spotlight rendering—essential for correctness across nested layouts
🔗Related repos
TakuSemba/Spotlight— Modern alternative to ShowcaseView for highlighting UI elements with Material Design, still actively maintained and supports latest Android APIsworker8/TourGuide— Another Android onboarding/tutorial library supporting multiple target types and custom styling, easier integration with modern Android projectssquare/android-times-square— Related Square library showing similar Gradle-based Android library structure and publishing patterns used by ShowcaseViewgoogle/android-architecture-samples— Official Google samples demonstrating modern Android architecture patterns that would replace some of ShowcaseView's reflection hacks on newer APIsamlcurran/Fragments— Same author's other Android library showing consistent builder-pattern API design approach used throughout ShowcaseView
🪄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 ShowcaseAreaCalculator and ShowcaseView core positioning logic
The library lacks test coverage for critical positioning calculations. ShowcaseAreaCalculator.java handles complex geometry for highlighting UI elements, and ShowcaseView.java manages the overlay rendering. These are high-risk areas where bugs directly impact user experience. Adding unit tests would catch regressions in highlight positioning, especially across different screen sizes and orientations.
- [ ] Create library/src/test/java/com/github/amlcurran/showcaseview/ShowcaseAreaCalculatorTest.java with tests for coordinate calculations with various View positions
- [ ] Create library/src/test/java/com/github/amlcurran/showcaseview/ShowcaseViewTest.java testing highlight radius, padding, and edge-case positioning (near screen edges)
- [ ] Add test fixtures for different Target implementations (ViewTarget.java, PointTarget.java, ActionItemTarget.java)
- [ ] Update library/build.gradle to include testImplementation dependencies (JUnit4, Mockito, Robolectric for Android View mocking)
Migrate deprecated ActionBar/ActionView targets to modern AndroidX and AppCompat equivalents
The codebase contains obsolete reflection-based targeting for SherlockActionBar (ActionBarReflector.java, SherlockReflector.java) which is no longer maintained. While AppCompatReflector.java exists, the library still exposes legacy ActionBarViewWrapper.java and ActionBarReflector.java. Modern Android apps use AndroidX exclusively. This PR would deprecate old reflectors, document migration paths, and provide AppCompat-only examples.
- [ ] Mark ActionBarReflector.java, SherlockReflector.java, and ActionBarViewWrapper.java as @Deprecated with migration guidance in Javadoc
- [ ] Add code sample in README.md or create docs/MIGRATION.md showing ActionItemTarget/ActionViewTarget usage with modern AppCompat
- [ ] Update example app (if present in scaffold) to remove any SherlockActionBar imports and use AppCompatActivity exclusively
- [ ] Add a new test targeting AppCompat ActionBar items to validate current AppCompatReflector.java functionality
Add instrumented tests for ShowcaseDrawer implementations across API levels
The library has three concrete ShowcaseDrawer implementations (StandardShowcaseDrawer, NewShowcaseDrawer, MaterialShowcaseDrawer) that render differently based on Android API level. There are no instrumented (Android) tests validating rendering correctness or verifying the factory selection logic in MaterialShowcaseDrawer.java. This is critical for visual regression detection.
- [ ] Create library/src/androidTest/java/com/github/amlcurran/showcaseview/MaterialShowcaseDrawerTest.java validating Material Design rendering on API 21+
- [ ] Create library/src/androidTest/java/com/github/amlcurran/showcaseview/StandardShowcaseDrawerTest.java for legacy API levels
- [ ] Add tests for ApiUtils.java to verify correct API level detection and drawer instantiation
- [ ] Update library/build.gradle androidTestImplementation to include androidx.test:runner and espresso if not present, ensure CI runs with API 21+ and API 16 emulators
🌿Good first issues
- Add unit tests for ShowcaseAreaCalculator.java—currently no visible test infrastructure exists, and geometry calculations are critical for correct spotlight positioning across different screen sizes and target types
- Document the three ShowcaseDrawer implementations (Standard, Material, NewStyle) with visual examples showing which style looks best on which Android versions in library/README.md
- Create a wrapper for androidx.appcompat compatibility since ActionBarReflector.java still references old AppCompat packages; add reflection detection for androidx.appcompat.app.AppCompatActivity
⭐Top contributors
Click to expand
Top contributors
- @amlcurran — 84 commits
- @Benjamin — 9 commits
- @BasThomas — 1 commits
- @robhor — 1 commits
- @cazador4 — 1 commits
📝Recent commits
Click to expand
Recent commits
c8db06f— Merge pull request #427 from BasThomas/patch-1 (amlcurran)e4d4c1b— Add syntax highlighting to readme (BasThomas)87cfcb9— Merge pull request #321 from bryant1410/patch-1 (amlcurran)27759be— Increments version code (amlcurran)00192b1— Update to version 5.4.3 (amlcurran)f711b5d— Merge pull request #387 from amlcurran/fix-377 (amlcurran)e262db2— Fix #377, where changing the text wouldn't update the ShowcaseView (amlcurran)770f779— Adds some API doc (amlcurran)3a9c664— Adds a piece of sample code to highlight the navigation view on an Toolbar (amlcurran)5564ba6— Update to version 5.4.2 (amlcurran)
🔒Security observations
The ShowcaseView library is an archived project with outdated API targeting (API 11+). While there are no critical vulnerabilities evident from the static analysis, the lack of active maintenance is the primary security concern. The codebase uses reflection for compatibility with various Android versions, which requires careful validation. No hardcoded secrets or major injection vulnerabilities were identified. The main recommendations are to consider using actively maintained alternatives, modernize API targets, add ProGuard rules, and ensure proper state storage security. The medium security score reflects the risks associated with using archived, unmaintained software in production environments.
- Medium · Archived Project with Outdated Dependencies —
Repository root / README.md. The ShowcaseView library is marked as archived on GitHub, indicating it is no longer actively maintained. This means security vulnerabilities discovered in dependencies or the library itself will not be patched. The library targets API Level 11+, which is extremely outdated (released in 2011). Modern Android apps should target much newer API levels. Fix: Consider migrating to actively maintained alternatives or forking and maintaining the library internally. Update minimum and target API levels to at least API 21+ (API 24+ recommended for modern security standards). - Medium · Reflection Usage Without Validation —
library/src/main/java/com/github/amlcurran/showcaseview/targets/Reflector.java and subclasses. The codebase contains multiple Reflector classes (ActionBarReflector.java, AppCompatReflector.java, SherlockReflector.java) that use Java reflection to access ActionBar and ActionItem components. Reflection without proper validation can lead to unexpected behavior or potential security issues if the reflected classes are malicious or modified. Fix: Add input validation and exception handling for all reflection operations. Consider using try-catch blocks to gracefully handle ClassNotFoundException and NoSuchMethodException. Document which versions of Android components are supported. - Low · Unencrypted State Storage —
library/src/main/java/com/github/amlcurran/showcaseview/ShotStateStore.java. The ShotStateStore.java class handles state persistence for showcase views. If this stores any user preference data locally without encryption, it could be vulnerable to local data extraction on rooted devices. Fix: Review ShotStateStore implementation to ensure any persistent state is stored securely. Use Android's EncryptedSharedPreferences for sensitive data storage if applicable. - Low · Missing ProGuard/R8 Configuration —
library/build.gradle. No explicit ProGuard or R8 rules are visible in the provided file structure. Without proper obfuscation rules, the library code could be easily reverse-engineered, potentially exposing business logic or making it easier to exploit vulnerabilities. Fix: Add comprehensive ProGuard/R8 configuration rules in proguard-rules.pro. Enable obfuscation for release builds and document any keep rules necessary for reflection operations. - Low · No Explicit Security Policy —
Repository root. The repository does not appear to have a SECURITY.md file or security vulnerability disclosure policy, making it difficult for security researchers to report issues responsibly. Fix: Create a SECURITY.md file documenting how to report security vulnerabilities responsibly, even though the project is archived. Direct users to fork and maintain if needed.
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.