Release v0.4.0-alpha
Pre-release
Pre-release
·
6 commits
to main
since this release
Added
- URI-based screenshot detection in
ScreenshotContentObserver(query by content URI ID instead of scanning latest) - Deduplication with synchronized
processedUris/pendingUrissets to prevent duplicate processing - Retry logic with
queryByIdWithRetry(3 attempts with 500ms delay) to handle MediaStore index race clearProcessedUris()lifecycle hook called after cleanup work completesgoAsync()/pendingResult.finish()pattern inBootReceiverandNotificationActionReceiverfor proper BroadcastReceiver lifecyclecontentObserverreference onSsJanitorAppto enable cleanup worker to reset dedup statenotificationManagerlifecycle management inScreenshotDetectionService(dismiss on destroy)REQUEST_IGNORE_BATTERY_OPTIMIZATIONSpermission declaration for battery optimization opt-out- Battery optimization check with re-evaluation on lifecycle resume
AutoStartUtil— OEM-specific auto-start settings intents (Xiaomi, Huawei, OPPO, vivo, OnePlus, Samsung)EmptyStateViewsubtitle parameter for multi-line empty state messages
Changed
- Switched
SsJanitorAppdatabase/repository/settings fromlateinittoby lazyfor thread-safe initialization - Refactored
ScreenshotDetectionService.onCreate()to start foreground inonCreate(moved out of helper method) - Simplified
ScreenshotCleanupWorker— removed deadautoDelete = truebranch; always deletes archived screenshots - Shared single
CoroutineScope(Dispatchers.IO)inScreenshotContentObserverinstead of creating per-screenshot scopes BootReceiverexportedattribute set totruefor reliableBOOT_COMPLETEDdelivery on modern Android- Permission warning card now includes "No Kill" and "Auto Start" action buttons
- Empty state message split into separate lines with kept count subtitle
- Animated stats grid entrance and extracted auto-archive badge
- Tracked file size for screenshots with freed-up bytes display
Removed
- All
Log.d/Log.e/Log.wstatements across the codebase (production code cleanup) ScreenshotDetectorstale-run guard log messages
Fixed
ContentUris.parseId()crash path — wrapped in try/catch forNumberFormatExceptionqueryByIdWithRetry— fixed to 3 total attempts (was 4 due to fallthrough)BootReceiver— missinggoAsync()which could cause ANR on bootNotificationActionReceiver— missinggoAsync()which could cause ANR