Skip to content

Aura v5.20.0

Choose a tag to compare

@SysAdminDoc SysAdminDoc released this 11 Apr 23:16
· 1129 commits to main since this release

Aura v5.20.0

Round 3 QA audit — wallpaper/sound apply path, parallax pipeline, widget UX, and locale completeness.

Data integrity — parallax atomic writes

  • WallpaperApplier.prepareParallaxWallpaper now writes through a sibling .tmp file and renames on success, with a copy+delete fallback for cross-filesystem cases.
  • Previously an interrupted download (process death, storage pressure, cancellation mid-stream) left a truncated image at the target path, which ParallaxWallpaperService would happily load on the next surface creation and render a garbled wallpaper.
  • The .tmp is now always cleaned up on failure, so orphaned partial writes can't accumulate.

Crash prevention — bitmap decode safety

  • WallpaperApplier.downloadBitmap now rejects empty response bodies (IOException) and zero-dimension bounds from the first-pass inJustDecodeBounds decode.
  • A corrupt or truncated image that decoded bounds to outWidth=0 would previously skip the sub-sampling math and either crash inside BitmapFactory or decode at full resolution and OOM on a large wallpaper.

Locale correctness — finishing the v5.18.0 sweep

  • SoundApplier.guessMimeType + ensureFileNameExtension: Locale.ROOT on the .mp3 / .ogg / .wav / .m4a / .aac / .flac extension matching. Under Turkish locale the default lowercase could map I to ı, miss the correct MIME, fall through to audio/mpeg, and mis-label the MediaStore entry.
  • WallpaperRepository.nearestWallhavenColor: Locale.ROOT on the hex prefix normalization.

Widget UX — responsive feedback

  • FreeVibeWidget.applyRandom and applyFromSource now show a "Shuffling…" toast on Dispatchers.Main before starting the 3–10 s network round-trip. Previously a tap produced no visible response until the wallpaper actually applied, which made the widget feel broken on slow networks.

Audit findings verified as non-issues in this pass

  • MainActivity intent handling — proper runCatching around ContentSource.valueOf, orEmpty() on nullable strings, navigation tokenization for onNewIntent. No bugs.
  • SoundApplier.saveToMediaStore catch-all — the MediaStore insert is explicitly rolled back (resolver.delete(uri, null, null)) when written = false, so there's no orphaned row.
  • SettingsScreen.dailyWp SharedPreferences read inside remember {} — blocks the main thread exactly once per composition. Migration to ViewModel is scope creep for a one-off setting; left as-is.

APK: Aura-v5.20.0.apk
SHA-256: c9fe5f9573d9d11f27cc8df9c170ba11bc1eedecbff1b28f90e43bdafd283a66
versionCode: 70