Skip to content

HighviewOne/PopItBubble

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

13 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

PopItBubble โ€” the satisfying Pop-It fidget, on Android

Build License: MIT Android Kotlin Platform PRs Welcome

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


Demo

PopItBubble demo animation

Rainbow grid โšก Neon + Challenge Mode

Features

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

How Challenge Mode works

  1. Tap โ‹ฎ โ†’ โฑ Challenge Mode to toggle it on. A timer bar appears below the pop counter.
  2. The clock doesn't start until you pop your first bubble โ€” no penalty for switching the menu or thinking.
  3. Pop all bubbles as fast as you can. The clock stops the moment the last bubble pops.
  4. Your time is shown in the celebration overlay (e.g. ๐ŸŽ‰ 4.2s! ๐ŸŽ‰).
  5. If it's your fastest run, it's saved as your personal best and displayed next to the timer on every future run.
  6. Tap โ†บ (FAB or menu) to reset and try again. Best time persists across sessions.

What's New in v1.1.0

  • โšก 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

How to Build

Requirements

  • Android Studio Giraffe (2022.3.1) or newer
  • JDK 17
  • Android SDK with API level 35 platform

Steps

git clone https://github.com/HighviewOne/PopItBubble.git
cd PopItBubble

Open 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 assembleDebug

The debug APK will be at:

app/build/outputs/apk/debug/app-debug.apk

Project Structure

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

Architecture

  • BubbleGridView โ€” single custom View drawing the entire grid on Canvas. Uses RadialGradient for the 3D dome effect and ValueAnimator with OvershootInterpolator for the pop spring-back.
  • SoundManager โ€” generates pop sounds at runtime: white noise + low-frequency tone + click transient, written to cache WAV files and played via SoundPool for 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-android for async sound loading.

Tech Highlights

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

Performance

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

Roadmap

  • Haptic strength slider
  • High-score leaderboard
  • Hexagonal grid layout
  • Accessibility: screen reader support

Download

Grab the latest debug APK from Releases.

Enable Install from unknown sources in Android Settings โ†’ Apps before installing.


License

MIT ยฉ 2026 HighviewOne