A satisfying Pop-It fidget sensory app for Android. Tap or drag across the silicone-style bubbles to pop them โ complete with 3D animations, haptic feedback, and satisfying pop sounds.
๐ Live Demo ย โขย โฌ๏ธ Download APK ย โขย ๐ Report a Bug
| Rainbow grid | โก Neon + Challenge Mode |
|---|---|
![]() |
![]() |
| Feature | Details |
|---|---|
| ๐จ 6 Color Themes | Rainbow, Pink, Blue, Pastel, โก Neon, ๐ฌ Candy |
| ๐ 4 Grid Sizes | 4ร4, 5ร5, 6ร6, 7ร7 |
| ๐ Pop Sounds | 4 programmatically-generated WAV variations with pitch randomization |
| ๐ณ Haptic Feedback | Crisp 25 ms vibration pulse on every pop |
| ๐ Multi-Touch | Drag multiple fingers to pop bubbles in one sweep |
| โจ 3D Bubble Rendering | RadialGradient dome with specular highlight using Canvas |
| ๐ Celebration | Animated overlay + auto-reset when all bubbles are popped |
| ๐ Pop Counter | Live X / Total count in the header bar |
| โ๏ธ Settings | Toggle sound and haptic feedback independently |
| โฑ๏ธ Challenge Mode | Race the clock โ timer starts on first pop, tracks personal best |
- Tap โฎ โ โฑ Challenge Mode to toggle it on. A timer bar appears below the pop counter.
- The clock doesn't start until you pop your first bubble โ no penalty for switching the menu or thinking.
- Pop all bubbles as fast as you can. The clock stops the moment the last bubble pops.
- Your time is shown in the celebration overlay (e.g.
๐ 4.2s! ๐). - If it's your fastest run, it's saved as your personal best and displayed next to the timer on every future run.
- Tap โบ (FAB or menu) to reset and try again. Best time persists across sessions.
- โก Neon theme โ electric magenta, cyan, matrix green, orange, yellow, blue with glow rim
- ๐ฌ Candy theme โ bubblegum pink, tangerine, lemon, lime, sky blue, grape
- โฑ๏ธ Challenge Mode โ timed runs with personal best stored in SharedPreferences
- โ๏ธ Settings screen โ sound and haptic toggles that persist across launches
- ๐งช Unit + UI tests โ 12 JVM tests (
GridMathTest) and 4 Espresso tests (BubblePopTest) - ๐๏ธ CI โ GitHub Actions builds APK and runs lint on every push
- Android Studio Giraffe (2022.3.1) or newer
- JDK 17
- Android SDK with API level 35 platform
git clone https://github.com/HighviewOne/PopItBubble.git
cd PopItBubbleOpen the folder in Android Studio โ it will sync Gradle automatically.
Then press โถ Run or build from the terminal:
# macOS / Linux
./gradlew assembleDebug
# Windows
gradlew.bat assembleDebugThe debug APK will be at:
app/build/outputs/apk/debug/app-debug.apk
PopItBubble/
โโโ app/src/
โ โโโ main/java/com/popitbubble/
โ โ โโโ MainActivity.kt # Toolbar, menu, counter, celebration
โ โ โโโ BubbleGridView.kt # Custom View โ Canvas drawing, touch, animation
โ โ โโโ SoundManager.kt # Programmatic WAV generation + SoundPool
โ โ โโโ SettingsActivity.kt # Sound / haptic toggle screen
โ โ โโโ GridMath.kt # Pure grid calculation utilities (testable)
โ โ โโโ Prefs.kt # SharedPreferences wrapper
โ โโโ test/java/com/popitbubble/
โ โ โโโ GridMathTest.kt # JVM unit tests (no Android required)
โ โโโ androidTest/java/com/popitbubble/
โ โโโ BubblePopTest.kt # Espresso UI tests
โโโ docs/ # GitHub Pages landing page + assets
BubbleGridViewโ single customViewdrawing the entire grid onCanvas. UsesRadialGradientfor the 3D dome effect andValueAnimatorwithOvershootInterpolatorfor the pop spring-back.SoundManagerโ generates pop sounds at runtime: white noise + low-frequency tone + click transient, written to cache WAV files and played viaSoundPoolfor sub-20 ms latency.GridMathโ pure Kotlin object with zero Android dependencies, containing all geometric calculations (bubble radius, centre, hit-testing, colour blending). Fully unit-tested on the JVM.- Minimal dependencies โ AndroidX + Material Components +
kotlinx-coroutines-androidfor async sound loading.
| Area | Detail |
|---|---|
| Custom rendering | BubbleGridView bypasses XML layouts entirely โ every bubble is drawn with Canvas.drawCircle + multi-stop RadialGradient for a convincing 3D silicone look |
| Touch handling | onTouchEvent iterates all active pointers on ACTION_MOVE, enabling true multi-finger drag-to-pop |
| Sound synthesis | Pop sounds are generated in-process (white noise envelope + low-frequency resonance) โ no bundled audio assets, zero APK bloat |
| Low-latency audio | SoundPool (not MediaPlayer) keeps playback latency under 20 ms |
| Haptics | VibrationEffect.createOneShot on API 26+, with graceful fallback for older devices |
| Animation | ValueAnimator with OvershootInterpolator gives the characteristic "squish-and-spring" pop feel |
| Testability | All geometry logic is in GridMath โ pure Kotlin, no Android deps, runs on the JVM in milliseconds |
| UI tests | 4 Espresso tests cover: counter initial state, pop increments counter, FAB reset, challenge bar visibility |
| Metric | Value | Notes |
|---|---|---|
| Render frame budget | 16.7 ms (60 fps) | ValueAnimator is Choreographer-driven; invalidates only the animating bubble region |
| Draw complexity | O(n) per frame | Single Canvas pass โ no nested layouts, no RecyclerView overhead |
| Pop animation | 220 ms / ~13 frames | OvershootInterpolator spring at 60 fps |
| Sound latency | ~15โ25 ms | SoundPool vs. ~150โ400 ms for MediaPlayer |
| Haptic latency | ~10 ms | VibrationEffect.createOneShot is low-level HAL call |
| Touch โ visual | โค 1 frame (16 ms) | invalidate() called synchronously in onTouchEvent |
| APK size | ~5.5 MB | No bundled audio assets โ sounds generated at first launch and cached |
- Haptic strength slider
- High-score leaderboard
- Hexagonal grid layout
- Accessibility: screen reader support
Grab the latest debug APK from Releases.
Enable Install from unknown sources in Android Settings โ Apps before installing.
MIT ยฉ 2026 HighviewOne


