RepoPilotOpen in app →

Yalantis/Side-Menu.Android

Side menu with some categories to choose.

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
  • Distributed ownership (top contributor 49% of recent commits)
  • Apache-2.0 licensed
Show all 6 evidence items →
  • Stale — last commit 6y ago
  • 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/yalantis/side-menu.android?axis=learn)](https://repopilot.app/r/yalantis/side-menu.android)

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/yalantis/side-menu.android on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: Yalantis/Side-Menu.Android

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/Yalantis/Side-Menu.Android 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
  • Distributed ownership (top contributor 49% of recent commits)
  • Apache-2.0 licensed
  • ⚠ Stale — last commit 6y ago
  • ⚠ 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 Yalantis/Side-Menu.Android repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/Yalantis/Side-Menu.Android.

What it runs against: a local clone of Yalantis/Side-Menu.Android — 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 Yalantis/Side-Menu.Android | 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 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 2129 days ago | Catches sudden abandonment since generation |

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

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Yalantis/Side-Menu.Android(\\.git)?\\b" \\
  && ok "origin remote is Yalantis/Side-Menu.Android" \\
  || miss "origin remote is not Yalantis/Side-Menu.Android (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"

# 4. Critical files exist
test -f "app/src/main/java/yalantis/com/sidemenu/sample/MainActivity.java" \\
  && ok "app/src/main/java/yalantis/com/sidemenu/sample/MainActivity.java" \\
  || miss "missing critical file: app/src/main/java/yalantis/com/sidemenu/sample/MainActivity.java"
test -f "library/build.gradle" \\
  && ok "library/build.gradle" \\
  || miss "missing critical file: library/build.gradle"
test -f "app/src/main/res/layout/activity_main.xml" \\
  && ok "app/src/main/res/layout/activity_main.xml" \\
  || miss "missing critical file: app/src/main/res/layout/activity_main.xml"
test -f "app/build.gradle" \\
  && ok "app/build.gradle" \\
  || miss "missing critical file: app/build.gradle"
test -f "app/src/main/java/yalantis/com/sidemenu/sample/fragment/ContentFragment.java" \\
  && ok "app/src/main/java/yalantis/com/sidemenu/sample/fragment/ContentFragment.java" \\
  || miss "missing critical file: app/src/main/java/yalantis/com/sidemenu/sample/fragment/ContentFragment.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 2129 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~2099d)"
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/Yalantis/Side-Menu.Android"
  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

Side-Menu.Android is an Android library implementing an animated side navigation menu with circular reveal animations and category selection. It wraps the CircularReveal animation utility to provide smooth, visually polished menu transitions matching Material Design patterns, deployed via Gradle dependency from JitPack. Single-module Android app structure: app/src/main/ contains the sample implementation with MainActivity.java orchestrating the drawer, RevealFrameLayout from CircularReveal library acts as the animation container, ContentFragment.java displays overlaid content, and layout XMLs define the DrawerLayout + LinearLayout menu items hierarchy. The library code itself is imported as a Gradle dependency, not included as source.

👥Who it's for

Android app developers (API 16+) who need a production-ready, animated side menu component with smooth category switching UI, particularly those building apps requiring polished Material Design interactions without rolling custom animations.

🌱Maturity & risk

Moderately mature but aging: published in 2015, available as a versioned release (1.0.2) on JitPack and Android Arsenal, includes the sample app in /app with working example code. However, uses deprecated Android Support Library (appcompat-v7:28.0.0) instead of AndroidX, and no visible CI/CD setup or test suite beyond basic AndroidTest placeholder. Last activity cannot be confirmed from the file list alone, but the support library version dates to ~2018.

Low-to-moderate risk for new projects: depends on an external CircularReveal animation library (ozodrukh/CircularReveal:2.1.0) which is not part of this repo, creating a transitive dependency chain. Uses minSdkVersion 16 (Android 4.1) which is now quite old. No Maven Central presence (relies on JitPack), no visible test coverage beyond a placeholder ApplicationTest.java, and migration to AndroidX would be necessary for modern projects.

Active areas of work

No active development visible from the file list. The repository appears to be a stable, published example/library snapshot from the Yalantis design studio circa 2015. No PR data, branch information, or recent commits are evident in the provided structure.

🚀Get running

git clone https://github.com/Yalantis/Side-Menu.Android.git
cd Side-Menu.Android
git submodule update --init
./gradlew build
./gradlew installDebug  # Install sample app to connected device/emulator

Or skip submodule and add JitPack Gradle dependency directly to your own project's build.gradle.

Daily commands:

./gradlew assembleDebug        # Build debug APK
./gradlew installDebug         # Deploy to emulator/device
adb shell am start -n yalantis.com.sidemenu.sample/.MainActivity  # Launch

Or open in Android Studio, select app module, and click Run.

🗺️Map of the codebase

  • app/src/main/java/yalantis/com/sidemenu/sample/MainActivity.java — Entry point of the sample app—demonstrates how to integrate the side menu library and manage fragment transactions
  • library/build.gradle — Defines the reusable side-menu library build configuration and exposes it as a dependency to the sample app
  • app/src/main/res/layout/activity_main.xml — Root layout containing the side menu container and content area—establishes the structural foundation for the UI
  • app/build.gradle — Sample app build configuration that declares the library dependency and CircularReveal animation library
  • app/src/main/java/yalantis/com/sidemenu/sample/fragment/ContentFragment.java — Fragment implementation showing how content swaps in response to menu item selection
  • app/src/main/res/drawable/menu_item_selector.xml — Drawable state selector for menu items—defines visual feedback when menu items are tapped

🧩Components & responsibilities

  • MainActivity (Java, Android Activity, Fragment API) — Orchestrates menu open/close, handles menu item clicks, and manages fragment transactions for content display
    • Failure mode: If MainActivity crashes or fails to initialize, the entire app fails to launch; fragment transactions could result in orphaned fragments or memory leaks if not managed correctly
  • ContentFragment (Java, Android Fragment, Layout inflation) — Displays category-specific content based on menu selection; responsible for rendering UI for each category
    • Failure mode: If fragment fails to inflate or attach, selected category content will not display; improper lifecycle management can cause memory leaks
  • CircularReveal animation (CircularReveal library, Android ViewAnimationUtils) — Provides smooth reveal/conceal visual transitions for the side menu; handles coordinate-based circular animation
    • Failure mode: If animation fails or is interrupted, menu may not animate smoothly or become visually stuck in a partial state; very old devices may not support animation
  • Menu layout & drawable resources (Android XML layouts, drawable selectors, multi-density assets) — Defines menu item structure, icons, and visual states; menu_item_selector.xml provides pressed/selected feedback
    • Failure mode: Missing or corrupt drawable assets cause visual glitches; incorrect selector states prevent visual feedback on interaction
  • Library module (Android Library (AAR), Gradle) — Encapsulates reusable side-menu UI logic, animations, and styling for distribution to other projects

🛠️How to make changes

Add a new menu category

  1. Create a new menu item drawable icon and place it in drawable-hdpi through drawable-xxxhdpi folders (app/src/main/res/drawable-hdpi/icn_8.png)
  2. Add menu item definition in the menu XML or programmatically in MainActivity.java (app/src/main/java/yalantis/com/sidemenu/sample/MainActivity.java)
  3. Create a new ContentFragment subclass to display category-specific content (app/src/main/java/yalantis/com/sidemenu/sample/fragment/ContentFragment.java)
  4. Hook up the menu item click listener in MainActivity to swap fragments when the new item is selected (app/src/main/java/yalantis/com/sidemenu/sample/MainActivity.java)

Customize the side menu animation

  1. The library depends on CircularReveal (ozodrukh:CircularReveal:2.1.0) for reveal animations—review the dependency in build.gradle (app/build.gradle)
  2. Modify MainActivity.java to adjust animation timing, origin point, or reveal radius parameters (app/src/main/java/yalantis/com/sidemenu/sample/MainActivity.java)
  3. Update menu item selector drawable to customize pressed/selected visual states (app/src/main/res/drawable/menu_item_selector.xml)

Change menu item colors and styling

  1. Edit the menu item selector drawable to define new color states for pressed/selected items (app/src/main/res/drawable/menu_item_selector.xml)
  2. Update dimension and color values in the values resource file (app/src/main/res/values/dimens.xml)
  3. Modify the activity layout to adjust menu container background or padding (app/src/main/res/layout/activity_main.xml)

🔧Why these technologies

  • Android AppCompat v7 (28.0.0) — Provides backward-compatible support for Material Design components and styling down to API 16
  • CircularReveal (ozodrukh:CircularReveal:2.1.0) — Implements smooth circular reveal/conceal animations for the side menu on Android 2.3+ without requiring API 21+
  • Gradle multi-module build — Separates the reusable side-menu library from the sample app, enabling clean dependency management and library distribution via .aar
  • Fragment-based navigation — Allows dynamic content swapping within a single activity container when menu items are selected

⚖️Trade-offs already made

  • CircularReveal animation library instead of native API 21+ ViewAnimationUtils

    • Why: Sample targets minSdkVersion 16 to reach a broader audience including older devices
    • Consequence: Adds external dependency but enables consistent reveal animations on older Android versions without API checks
  • Fragment-based content rather than Activity-per-category

    • Why: Reduces overhead and simplifies menu/content lifecycle management
    • Consequence: All content shares a single activity context, reducing memory footprint but requiring careful fragment state management
  • Library published as separate Gradle module

    • Why: Decouples reusable menu UI from sample app concerns
    • Consequence: Requires maintaining two build.gradle files and coordinating versions, but enables cleaner library distribution

🚫Non-goals (don't propose these)

  • Real-time data sync or backend API integration—sample uses static category and content data only
  • Persistent state restoration or saved instance state recovery—menu state is transient
  • Accessibility features (TalkBack, keyboard navigation) are not explicitly implemented
  • Support for Android API < 16 or pre-Android 2.3 devices
  • Right-to-left (RTL) layout support

🪤Traps & gotchas

  1. Submodule initialization: Cloning without git submodule update --init will fail the build — CircularReveal code won't exist. 2. Deprecated Support Library: Code uses com.android.support:appcompat-v7:28.0.0 and android.support.v4.widget.DrawerLayout — will conflict with AndroidX in modern projects; migration requires replacing with androidx equivalents. 3. minSdkVersion 16: Compatibility with Android 4.1 may seem legacy but affects which Java/API features can be used. 4. JitPack availability: The library is distributed via JitPack, which requires internet access and the JitPack Maven repo in build.gradle; offline builds will fail. 5. No active maintenance: Issues/PRs may not be reviewed; the library is essentially frozen at v1.0.2.

🏗️Architecture

💡Concepts to learn

  • Circular Reveal Animation — Core visual effect in this library — Material Design pattern that animates content by expanding/contracting a circular mask; requires understanding of View#setRevealRadius() and animation callbacks
  • DrawerLayout — Android framework widget that manages the side menu slide behavior and touch handling; understanding its listener callbacks (DrawerListener) is essential for hooking animations
  • Fragment-based Content Switching — This project uses Fragments (ContentFragment.java) to swap in/out content when menu items are selected; requires understanding FragmentTransaction and backstack management
  • ViewGroup Overlay Rendering — The layout uses a dual-LinearLayout pattern (content_overlay and content_frame) to layer the menu behind animated reveals; understanding view hierarchy and Z-ordering is key to extending this
  • Android Submodules (Git) — This repo depends on CircularReveal as a Git submodule (.gitmodules); build will fail if not initialized — essential for understanding the project's dependency structure
  • Gradle Dependency Management — Library is distributed via JitPack as a Gradle artifact; understanding how transitive dependencies (CircularReveal) and Maven repositories are resolved is critical for integration
  • yarolegovich/SlidingRootNav — Alternative Android side menu library with slide animations; solves the same problem with a different visual approach than circular reveal
  • jfeinstein10/SlidingMenu — Older but widely-used side menu framework for Android; precursor to modern DrawerLayout-based approaches
  • ozodrukh/CircularReveal — The animation backbone of this project — provides Material Design circular reveal for API 16+; essential dependency
  • Yalantis/uCrop — Another Yalantis open-source library; demonstrates their design-focused Android UI component pattern
  • material-components/material-components-android — Official Material Design library for Android; provides modern DrawerLayout and navigation patterns as alternatives to this custom implementation

🪄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 AndroidX migration and update deprecated Support Library dependencies

The project currently uses the deprecated Android Support Library (com.android.support:appcompat-v7:28.0.0) which was officially deprecated in 2018. Migrating to AndroidX (androidx.appcompat:appcompat) is critical for long-term compatibility, Play Store compliance, and accessing modern Android features. This is a high-value PR that unblocks future dependency updates.

  • [ ] Update build.gradle to replace com.android.support:appcompat-v7:28.0.0 with androidx.appcompat:appcompat:1.x.x
  • [ ] Run Android Studio's built-in AndroidX migration tool on app/src/main/java and app/src/main/res
  • [ ] Update AndroidManifest.xml references if any support library components are used
  • [ ] Verify the library module (referenced as ':library' in dependencies) is also migrated to AndroidX
  • [ ] Test the sample app (MainActivity.java, ContentFragment.java) to ensure all layouts and code work with AndroidX

Add instrumented unit tests for MainActivity and side menu navigation interactions

The app/src/androidTest/java directory only contains a stub ApplicationTest.java. There are no tests for the core side menu functionality in MainActivity.java or the ContentFragment.java navigation flow. Adding instrumented tests for menu item selection, fragment transitions, and animation states would significantly improve code quality and prevent regressions.

  • [ ] Create app/src/androidTest/java/yalantis/com/sidemenu/sample/MainActivityTest.java to test menu opening/closing behavior
  • [ ] Add tests for menu item click listeners and ContentFragment navigation using Espresso framework
  • [ ] Test the circular reveal animation state transitions in app/src/androidTest/java/yalantis/com/sidemenu/sample/SideMenuAnimationTest.java
  • [ ] Add dependency: testImplementation 'androidx.test.espresso:espresso-core:3.x.x' to build.gradle
  • [ ] Verify tests pass on multiple API levels (minSdkVersion 16 and targetSdkVersion 28)

Complete the README.md usage documentation (section appears truncated at 'First of a')

The README.md file ends abruptly mid-sentence at 'Using' section with 'First of a', leaving users without critical implementation instructions. Complete documentation is essential for new contributors to understand how the library works, reducing friction for adoption and contributions.

  • [ ] Expand the 'Using' section with step-by-step integration instructions referencing the library module structure
  • [ ] Add code example showing how to implement the side menu in MainActivity.java with proper initialization
  • [ ] Document the menu item configuration and how ContentFragment.java is used for content switching
  • [ ] Add troubleshooting section for common issues with CircularReveal animation dependency and API level compatibility
  • [ ] Include a 'Customization' section documenting drawable resources (icn_1.png through icn_7.png) and how to customize menu items

🌿Good first issues

  • Migrate from deprecated Android Support Library (appcompat-v7:28.0.0) to AndroidX equivalents (androidx.appcompat:appcompat and androidx.drawerlayout:drawerlayout) — involves updating build.gradle imports, all import statements in .java files, and testing the sample app still animates correctly.
  • Add automated UI tests in app/src/androidTest/ — the placeholder ApplicationTest.java is empty; add Espresso tests to verify menu opens/closes, animation triggers on category selection, and content fragments swap correctly.
  • Extract the library code from the sample app into a separate library/ Gradle module with its own build.gradle and source structure under library/src/main/ — currently the library is only available as an external Gradle dependency, not as source code in this repo for forking/customizing.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • b83ed82 — Merge pull request #85 from Yalantis/readme-update (Kirill)
  • 5225733 — Update README.md (Kirill)
  • ab91987 — Update README.md (Kirill)
  • 90bbf8f — Merge pull request #84 from Yalantis/fix/updateComponents (PenzK)
  • b257076 — Reveal version update and deprecated methods removed (kirill)
  • 0c516f8 — Updated target versions (kirill)
  • c2cf936 — Update README.md (warko-san)
  • 6bdfcf0 — Update README.md (warko-san)
  • 0df554b — Merge pull request #58 from Yalantis/develop (warko-san)
  • 4e69592 — Added group name (dima.sholom)

🔒Security observations

The Side-Menu.Android project has moderate security concerns primarily related to outdated dependencies, disabled code obfuscation, and reliance on unmaintained third-party libraries. The use of deprecated Android Support Library and low target SDK version are significant issues that should be addressed for production use. The application lacks modern security hardening typical of current Android best practices. No evidence of hardcoded credentials, SQL injection risks, or XSS vulnerabilities was found in the provided file structure, but thorough code review of Java files is recommended.

  • High · Outdated Support Library Dependency — app/build.gradle - dependencies section. The project uses 'com.android.support:appcompat-v7:28.0.0' which is from the deprecated Android Support Library. Google has ended support for the Android Support Library as of December 2018 and recommends migration to AndroidX. This can lead to missing security patches and stability fixes. Fix: Migrate from com.android.support:appcompat-v7:28.0.0 to androidx.appcompat:appcompat:1.x.x and update all other support library dependencies to their AndroidX equivalents.
  • Medium · Minification Disabled in Release Build — app/build.gradle - buildTypes.release section. The release build configuration has 'minifyEnabled false', which means code obfuscation is not enabled. This makes the APK easier to reverse engineer and exposes internal code structure, class names, and method signatures to potential attackers. Fix: Enable minification by setting 'minifyEnabled true' and ensure proper ProGuard/R8 rules are configured in proguard-rules.pro to protect sensitive code while maintaining functionality.
  • Medium · Third-party Dependency from Unknown Source — app/build.gradle - dependencies section, jitpack.io repository. The project depends on 'com.github.ozodrukh:CircularReveal:2.1.0' from JitPack, which is a community-hosted repository. This external dependency may not have been properly vetted and could introduce malicious code or vulnerabilities. The ozodrukh project appears to be unmaintained. Fix: Verify the CircularReveal library's source code and maintenance status. Consider using official or well-maintained alternatives. Implement dependency scanning tools (e.g., OWASP Dependency-Check) to detect known vulnerabilities in third-party libraries.
  • Medium · Low Target SDK Version — app/build.gradle - defaultConfig.targetSdkVersion. The project targets SDK 28 (Android 9.0), which is significantly outdated (current target is 34+). This means the app may not meet modern security and privacy requirements enforced by Google Play Store and lacks protections available in newer Android versions. Fix: Update targetSdkVersion to the latest stable Android API level (currently 34 or higher) and ensure compatibility with latest security and privacy requirements.
  • Low · Missing Security-Related Manifest Attributes — app/src/main/AndroidManifest.xml. Without reviewing the AndroidManifest.xml content, best practices suggest ensuring backup is disabled (android:allowBackup='false') and proper intent-filter definitions to prevent intent injection attacks. Fix: Ensure AndroidManifest.xml includes: android:allowBackup='false' unless backup is explicitly needed, proper intent-filter restrictions, and android:usesCleartextTraffic='false' if targeting API 28+.

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 · Yalantis/Side-Menu.Android — RepoPilot