Releases: mini-page/Cleanify
Release list
v2.9.2
v2.9.2 - UX Polish & Media Controls
New Features
- Per-media tap actions: Images open preview, videos/audio play/pause, PDFs/docs no-op
- Audio mute/unmute toggle: Mute button now works on audio files
- Audio/Docs 3:4 ratio: Audio players and document previews display in a centered 3:4 card
- Hide Action Buttons: New toggle for immersive swiping without delete/keep buttons
- Scan Video Files: Toggle in Settings > Media & Storage
- File type scan toggles: Filter by Images/Videos/Audio/Documents in duplicate scanner
- Hide filename toggle: Controls filename visibility in context menu
Improvements
- Video controls hidden by default, shown when paused
- N/N counter pill has better padding
- Video mute state defaults to unmuted
- Removed duplicate lint entry in lint.xml
Bug Fixes
- Fixed ClassCastException in
estoreSessionState (savedStateHandle collision) - Fixed mute toggle not working on audio files
- Fixed duplicate scanner empty state rescan button
- Fixed home screen empty state rescan button
- Fixed FileCategory unresolved reference in SwiperViewModel
Full Changelog: v2.9.1...v2.9.2
v2.9.1
v2.9.1 - Bug Fixes & Performance
Bug Fixes
- Fix crash on Start Session button tap (ClassCastException in SwiperViewModel)
- Fix duplicate scanner empty state - add Rescan button
- Add Rescan button on home screen empty state
Performance
- Split SettingsScreen: 1982 → 563 lines (72% reduction)
- Split SwiperScreen: 2973 → 793 lines (73% reduction)
Testing
- Add Compose UI tests (EmptyState, SectionHeader, SettingSwitch)
Other
- Add lint configuration
- Clean up code structure into packages
Cleanify v2.9.0
🎉 Cleanify v2.9.0
✨ New Features
- Immersive Mode — Hide status/navigation bars in Swiper (Settings → Appearance)
- Privacy Policy & Terms of Use — Standalone web pages linked in app About screen
- Recycle Bin Home Shortcut — Long-press app icon to access Recycle Bin directly
🌐 Website & Links
- Developer portfolio link updated (mini-page.github.io/ugsoc)
- Website images fixed (GitHub raw URLs, now work on Vercel)
- Website lazy loading + DNS prefetch hints added
- CONTRIBUTING.md repository links fixed
🔧 Improvements
- Settings dropdowns now inline with pill-shaped trigger (like toggles)
- N/N counter restored as simple pill in Swiper header
- Swipe direction tags appear on trailing edge for clarity
- 3-dot menu dropdown positioned correctly below button
- Git tags v2.5.0 and v2.7.0 backfilled
🐛 Fixes
- Dropdown menu positioning in settings
- Keep/Delete tag colors and positions during swipe
- Media info sheet accessibility
APK: Cleanify-v2.9.0-release.apk (universal)
v2.8.0: UI/UX Audit, Code Quality & Swiper Redesign
What's New
SwiperScreen Redesign
- Icon-only round buttons for Delete/Keep with smooth interactions
- Swipe direction tags (Keep/Delete) overlay on card during swipe
- Stronger swipe visuals - 0.9 alpha, 3-stop radial gradient, smoother feel
- Long press menu - truncated filename, integrated Info button for media info
- 3-dot menu consolidated - Open With, Share, Info all in dropdown
- N/N counter pill moved to header next to 3-dot menu
Settings Screen
- Replaced ModalBottomSheet with DropdownMenu for all 18 picker items (DRY principle)
- Layout settings moved to Sorting sub-page
Code Quality
- Preference wrapper for type-safe preferences
- Formatters.kt - shared fileSize(), duration(), pathForDisplay() eliminating 5 duplicates
- Fixed API 33+ crash - getInstalledApplications() now uses ApplicationInfoFlags
- Proper logging - replaced e.printStackTrace() with Log.w() in FileManager
- AppDialog - consistent styling for all confirmation dialogs across app
Bug Fixes
- Fixed FileManager deprecations (getUuid() → uuid)
- Fixed StorageVolumeProvider isRemovable API handling
- Fixed FileScanner API 33+ compatibility
- Added logging to silent catch blocks in RecycleBinManager, NomediaManager, ContactCleanerViewModel
APKs
- arm64-v8a - Most modern devices (recommended)
- armeabi-v7a - Older 32-bit ARM devices
- x86_64 - 64-bit emulators
- Universal - All architectures (larger file)
Cleanify v2.7.0
What's New in v2.7.0
✨ Immersive Media Preview
Full-screen viewer with pinch-to-zoom, double-tap reset. Just the media — clean close/delete overlays only.
📊 Storage Analysis (New Tool!)
Donut chart showing used vs free storage, per-volume cards (internal + SD), category breakdown bars (Images, Videos, Music, Documents, APK, Downloads), and top-10 largest files with tap-to-detail dialog.
🧹 Multi-Volume Empty Cleaner
Dynamic volume selector when external storage is detected — scan All, Internal storage, or SD Card individually.
♻️ Recycle Bin Rewrite
Select-all/deselect-all toggle, always-visible tabs, media preview for images/videos, confirm dialogs for delete/empty operations.
♿ Accessibility
Reduce Animations toggle (snap transitions), Hide from Gallery (.nomedia, default ON), haptic feedback on destructive actions, full TalkBack support on all interactive elements.
🔗 App Shortcuts & Widgets
4 deep-link shortcuts (Empty Cleaner, Contact Cleaner, Duplicates, Recycle Bin), Quick Settings tile, redesigned home screen widget with emoji icons.
📂 External Storage Support
Cross-volume file moves, multi-root scanning across internal + SD + USB OTG in all cleaner tools.
Note: R8/proguard is temporarily disabled for this release due to a known OOM issue during minification. Debug builds are unaffected.
v2.6.0
Changelog
All notable changes to Cleanify are documented here.
[2.6.0] — 2026-06-11
Added
- Native xxHash64 hashing engine — SHA-256 replaced with xxHash64 via C/NDK
for exact duplicate detection. Usesmmap()for zero-copy file access, delivering
~10x faster hash computation on bulk media scanning. - CMake + NDK integration — C code compiled for all 4 ABIs (arm64-v8a,
armeabi-v7a, x86_64, x86) and bundled into split APKs automatically. NativeHasherfallback — pure-KotlinhashBytes()fallback if native
library fails to load, ensuring no functionality regression.- Release keystore — generated at
app/release.jksfor signed release builds.
Changed
- Duplicate scanning —
DuplicateFinderUseCasenow calls native xxHash64
for full file hashes, partial video hashes, and pixel hashes instead of
MessageDigest("SHA-256"). - ABI-split APKs —
splits { abi { ... } }configured to produce separate
APKs per architecture plus a universal fallback.
[2.5.0] — 2026-06-11
Added
- Haptic feedback on destructive actions: swipe left/right/down in the media
swiper, delete in Contact Cleaner, Duplicate Finder, Recycle Bin, Empty Cleaner,
and "Apply Changes" in the Summary Sheet. Provides tactile confirmation for
all irreversible operations. - In-app update checker (Settings → About → Updates). Checks
github.com/mini-page/Cleanify/releases/latest, shows changelog dialog,
downloads APK with progress bar, and launches the system package installer.
v2.4.0
What's New in v2.4.0
✨ New Features
- Tooltips — PlainTooltip added to Close, Favorite, More, Info, Create Album, Skip, Undo, Delete, and Keep icons in the swiper screen
- Info bottom sheet — ⓘ button opens a details sheet with metadata (name, type, size, resolution, duration, dates) plus Rename and Drop Metadata actions
- Rename items — Rename files directly from the info bottom sheet via an AlertDialog with OutlinedTextField
- Drop EXIF metadata — Strip EXIF tags (artist, datetime, GPS, make, model, software) from images using ExifInterface
- Favorite button — Heart icon in SwiperTopBar toggles item favorites, persisted via DataStore
- Gesture settings sub-page — Dedicated settings page for swipe sensitivity, swipe-down action, full-screen swipe, invert swipe, tap action, and double-tap action
- Tap / Double‑tap actions — Configurable tap (Play/Pause, None) and double-tap (Favorite, Fullscreen, None) actions
- Invert swipe visual swap — FABs swap colors/icons when Invert Swipe is enabled (left shows Keep/Check, right shows Delete/Trash)
- ABI-split APKs — Separate APKs for arm64-v8a, armeabi-v7a, x86_64, x86 plus universal
🎨 UI Changes
- 80% container width — Media card width reduced to 80% of screen for edge-to-edge peeking
- Filename overlay removed — Filename setting now controls visibility in the info bar instead of overlaid on the card
- FAB swap — Left/right FABs visually invert when Invert Swipe is enabled
🛠 Build & Release
- Version bumped to 2.4.0 (code 9)
- Release keystore generated with credentials from gradle.properties
- ProGuard rule added to suppress PDFBox JP2 warnings
- R8 minification enabled for release builds
- ABI-split APK configuration added