Repository navigation
Aura 6.46.1 is the first public release since 6.45.3 on September 13, so it carries everything from the 6.46.0 work too. It targets Android 16 and fixes a long list of things that quietly didn't work. Every change is listed below.
Highlights
- Tile, unlock and automation rotations run again. Android had been refusing to queue them, so nothing happened when you tapped the tile.
- Finished downloads now clear out of Active on their own. A failed download tells you why and has a Retry button.
- Crop ratios (9:16, 16:9 and 1:1) frame the picture, and the saved wallpaper is exactly the framed area. Pans and pinches used to save a slightly different crop from the one on screen.
- TikTok ringtones lead the Ringtones tab, and sound previews load when you tap them.
- Fit mode can fill the bars with black, a chosen color, a palette color or a blurred edge.
- Theme pack imports are all or nothing now, and backups no longer report success after dropping library items.
- Live wallpapers scale correctly on a second display, and Reddit clips in fragmented MP4 are no longer rejected as too short.
About the community features
Several community changes in the list below run on Aura's server, and they take effect when the community server update goes out. That covers private follows, recording votes in one step, the daily allowance that a failed action no longer uses up, collection links and their limit, upload verification, and deleting older uploads. Until then, voting, collection links, reports, follows and uploads aren't available, the same as in 6.45.3. Vote counts and Top Voted keep working, and who voted for what is already private.
Everything that changed since 6.45.3
6.46.1
- Vote counts and Top Voted keep working before the server update: they read the existing tallies whenever the new public counts don't have a row yet, so they no longer show zero. When the server function that makes collection links is missing, the app tries writing the link directly, the way older versions did.
- Community database locked down: Aura's community database now only answers the reads the app needs, like vote counts, Top Voted and global hides, and refuses everything else. Who voted for what stays private. Collection links, voting, reports, follows and uploads come back with the community server update. Sharing a collection still sends the collection file.
6.46.0
- targetSdk 36: meets Play and Accrescent requirements. All Android 16 behavior changes (predictive back, edge-to-edge, orientation freedom) were already in place.
- Build hardening: JDK 21 preflight rejects unsupported runtimes with an actionable message; dependency-info blob stripped from release artifacts for IzzyOnDroid compatibility and reproducibility.
- Editor back guards: toolbar back arrows in wallpaper, sound, and video crop editors now go through the same unsaved-changes dialog as system back. Video crop gained dirty-state tracking for pan, zoom, and trim.
- Upload and dialog fixes: community upload dialogs use typed flags instead of localized string comparisons for dismissal; profile edit dialog stays open during saves; WebM audio accepted in community sound uploads; downloaded tones populate MediaStore TITLE for system picker display.
- Feed reliability: stale-content warnings clear after a successful refresh; YouTube empty state shows a terminal message instead of perpetual "Loading"; download progress emissions coalesced to 250ms intervals.
- Theme-pack ZIP guard: directory and unrecognized entry bodies now pass through byte and compression-ratio accounting, closing an unbounded decompression path.
- Collection rename: the existing DAO rename function is now reachable from the overflow menu.
- Ringtone restoration verification: post-boot restoration now reads back each URI after setting it and reports whether the restore succeeded, the source was missing, or the write was refused. Individual failures return retry instead of false success.
- AV1 codec gate: YouTube video wallpaper downloads now check hardware AV1 decode capability. Devices without AV1 hardware get AVC-only format selection, and a post-download codec check rejects AV1 before the system picker.
- Dependency-notice tools: all three notice tools and the documented Gradle task now target the correct fullRelease variant instead of a nonexistent bare "release".
- Accessibility semantics: preview mode chips, onboarding style cards, and sound tab bars now expose
selectedstate to screen readers. - Publication gate enhanced: release checker now validates that all expected APKs and SHA256SUMS.txt are present as GitHub release assets. A --strict flag rejects unknown remote state.
- FFmpeg input bounded: every FFmpeg invocation is preceded by a container sniff that rejects AVI, MKV, MOV, and other formats outside the allowlist, mitigating CVE-2026-8461. A policy JSON records the bundled version and its known advisories.
- Crash report template: collects app version, Android version, device model, install channel, repro steps, and restart behavior. Diagnostics bundle is no longer required for no-launch crashes; an adb logcat fallback is documented.
- Debug tooling: debug builds now install StrictMode (disk/network on main thread) and LeakCanary (leaked closables, activity leaks), both logging only. Release builds contain neither.
- Rotation countdown restart: picking a wallpaper yourself now starts the rotation interval over, so the next automatic change is a full interval away. That covers applies from the app, widget shuffles, the Quick Settings tile, automation broadcasts and Diagnostics' Run now. Unlock and screen-off rotations leave the timer alone. The restart uses the scheduler's minute interval when the scheduler is on. It's governed by a preference that's on by default. A tile or automation request that lands while an unlock rotation is still waiting now replaces it instead of being dropped, and a request that changes nothing (the chosen source is switched off, say) leaves the timer alone.
- Sound previews resolve on demand: YouTube sound tabs and search used to extract streams for every result (up to 30) before you tapped anything. Now only the rows on screen plus one ahead get resolved, each once per feed. Switching tab or query cancels the old feed's work, prebuffers included, and resolving and prebuffering share three slots.
- TikTok ringtones lead the Ringtones tab: the latest clips from the @ringtonesforiphone TikTok creator now sit at the top of Ringtones, most played first, in GitHub and Obtainium builds. Aura keeps only the sound. Previews play with the video track switched off, and applying or downloading copies the clip's AAC track into an .m4a without re-encoding, then deletes the video. Every clip keeps the creator's name and a link to the original video. Stored links expire after a couple of days, so an older favorite fetches a fresh one on its own. Loading the list costs one embed page every 30 minutes plus a 1 KB read per clip for its length. With Auto preview on, the first few clips are partly buffered, the same as other sources. Play builds never contact TikTok. A clip that fails to download shows an error instead of crashing, half-written files are swept on the next try, and a cached list drops clips whose links have expired.
- Community sound uploads finish again: the upload service compared the stored file against a size that sound uploads never send, so any upload whose storage entry reported a size was turned away. It now checks that the file exists and sits between 1 byte and 20 MB, the same limit the storage rules use. Wallpaper uploads still have to match their declared size and type.
- Votes and follows stay private, and Top Voted works again: vote counts now live apart from the record of who voted. Anyone can read a count, but only your own account can read which items you voted for, and only you can read who you follow. Before this, voter IDs sat in publicly readable nodes, while the Top Voted list and creator vote totals asked for a whole-tree read the database refused, so they came back empty or zero. Top Voted now uses a sorted, capped query and creator totals read one count per upload. Community uploads also keep their own vote field in step, so feeds sorted by votes order correctly. A one-time backfill tool copies existing counts and voter records into the new layout.
- A failed community action no longer uses up your allowance: votes, follows, blocks, profile edits, reports and uploads used to count against the daily limit and start the cooldown before anything was saved. If the save then failed, the attempt still counted, so a sound upload that hit a storage hiccup cost one of three daily uploads and locked you out for 15 minutes. Each attempt now holds its slot until the save finishes and hands it back, cooldown included, when nothing was stored. If the server stops partway through, the attempt still counts, because its save may have gone through.
- Collection links expire, and deletion records need a real deletion: the app used to write shared collection links straight into the database, with no cap on how many and no expiry. Links now go through the server, which checks the collection, counts its wallpapers and picks the link token itself. You can make 10 links a day, 30 seconds apart, and each one opens for 30 days before a daily job clears it out. Opening an expired link says it has expired. When a link can't be made (the daily cap, more than 250 wallpapers, or no server), the share sheet still sends the collection file. Deleting your own upload now has to remove the upload in the same step that records the deletion, so nobody can file deletion records for uploads that never existed.
- Theme pack import is all or nothing: importing used to write each part of a pack as it went, so a broken piece near the end left you with half a theme, and a bad 24H or sound profile recipe could be saved as is. The whole pack is now checked first: every recipe has to parse, each daypart can only appear once, every file the pack points to has to be in the archive, and every location has to be something Aura can open, AI wallpapers it generated included. If anything fails, nothing changes and the unpacked files are removed. The settings it does change are saved together.
- Votes can't get lost part way: the server recorded that you voted and then added your vote to the count in a second step. If it stopped between the two, your vote never counted and you couldn't vote again. Both now land together, and a vote that was cut off can be cast again a few minutes later. Creator pages kept showing 0 votes when a count couldn't be loaded. They now keep the count they already had. Vote totals from before the private vote change move across on the server, so a vote cast during the move isn't overwritten. The move runs in batches and picks up where the last run stopped, so a large backlog finishes instead of starting over each day. Deletion request lookups also find the short-lived lock a cut-off vote leaves behind.
- Tile, unlock and automation rotations start again: every one of these asked WorkManager for urgent work with a battery condition attached, and WorkManager refuses to build that, so the rotation never got queued. Taps and automation actions still run right away. Unlock and screen-off rotations now run as ordinary work and still wait while the battery is low. A tap that lands while a rotation is being applied starts a fresh one right after it. The rotation already under way still sets both screens and restarts the countdown before it stops, so home and lock never end up out of step, and only one rotation applies at a time. A rotation that changed the home screen but found every lock screen item excluded now restarts the countdown like any other change.
- Finished downloads leave Active, and failed ones can be retried: a finished download used to sit under Active until you dismissed it, so it showed up twice next to your history. It now clears itself a few seconds after it lands in history. A failed download says why in plain words (no connection, a slow or unhappy server, a file too big or not media, or no room to save it) without echoing the link, both on its card and in the message a wallpaper or sound page shows. The card has a Retry button that runs the same download again. A retry that succeeds saves one copy, never a second one next to a half-written file.
- Crop ratios work, and the crop you see is the crop you get: tapping 9:16, 16:9 or 1:1 now draws that frame on the picture, dims everything outside it, zooms in only as far as the frame needs and keeps the part of the picture you were looking at. The chosen ratio is highlighted, read out by TalkBack, and kept through a rotation or when Android closes and reopens the app. The saved wallpaper is the framed area, within a pixel of the ratio. Before this, the export used a different zoom from the screen, so a pan or pinch moved the saved crop by a different amount than the preview, and the picture shown whole at the start was saved as a tighter center crop.
- Older uploads can be deleted again: uploads made before the private upload list existed couldn't be deleted by their owner, because the delete also clears that list entry and the database refused to clear one that wasn't there.
- Firebase CLI upgraded to 15.31.0: root audit findings reduced from 15 to 10 (non-breaking fixes applied). Functions audit is now zero. The remaining root findings are transitive deployment-tool dependencies.
- Pager perf: wallpaper detail pager reads
currentPageOffsetFractioninside thegraphicsLayerblock instead of composition, eliminating per-drag-frame recomposition of page content. - Live wallpaper dimming: the dim overlay and double-tap reveal now work on the parallax engine and on animated GIFs in the video engine, not only on the weather engine. MP4 video wallpapers aren't dimmed yet.
- Sound detail action layout: the action row breakpoint now derives from the actual container width via
BoxWithConstraintsinstead of the device screen width. Split-screen, navigation rail, and foldable pane widths are reflected. - Community Reports states: the report queue shows a loading indicator while it waits and an error with Retry when the query fails, instead of looking like an empty queue. Being offline and lacking admin access now read differently. A failed refresh keeps the reports you were looking at and says when they were last updated. Any other failure shows the translated message first, with the reason under it.
- Lint fix: wallpaper Hide snackbar now resolves strings via
stringResourcein composition scope instead ofcontext.getString()from a coroutine, fixing twoLocalContextGetResourceValueCalllint errors. - Unit test compilation restored: fixed VideoWallpapersViewModelTest to supply the AV1CodecSupport dependency, unblocking both Full and FOSS unit test suites.
- Fragmented MP4 support: video wallpaper probe now distinguishes unknown duration from known zero. When MediaMetadataRetriever reports zero (common with Reddit CMAF fragments), MediaExtractor is tried as a fallback. Valid multi-second fragmented MP4s are no longer rejected as "too short".
- Display context for live wallpapers: all three engines (video, weather, parallax) now use
getDisplayContext()on API 29+ for density, fallback dimensions, and clock overlays, so secondary-display rendering scales correctly. API 26-28 falls back to the service context. - Silent failure surfacing: Firebase vote errors, share intent failures, and video wallpaper display-metrics/retriever exceptions now log or show user feedback instead of being swallowed silently.
- OEM ringtone handling: Samsung and other OEM
IllegalArgumentExceptionon ringtone writes is caught with device-specific guidance pointing to the system sound picker. - Wallpaper long-press fixed: long-pressing a wallpaper card now toggles the favorite instead of destructively hiding it. Hide has an immediate Undo snackbar that reverses both the style-learning signal and the hidden ID.
- Semantic dedupe replaced: follow, block, and profile Cloud Functions now deduplicate by client operation ID instead of desired state. A follow, unfollow, re-follow sequence completes correctly instead of treating the re-follow as a duplicate.
- Upload verification: wallpaper and sound upload finalizers read the actual Storage object metadata before publishing. Missing objects, size mismatches, and content-type mismatches are rejected with actionable error codes.
- Benchmark harness fixed: taps Library instead of stale Favorites, fails immediately when a bottom nav destination is missing, and waits for the shell to appear before measuring.
- Missing local media can be repaired: downloads, favorites, and local wallpaper catalog entries now stay visible when a file moves, disappears, becomes unreadable, or loses Android permission. Relink checks the selected media type and compares its digest, size, dimensions, and duration before it changes anything. A warned replacement requires an explicit Use anyway action. Successful repair keeps tags, collections, wallpaper history, rotation exclusions, theme slots, and home or lock targets. Folder repair matches up to 500 wallpapers by exact SHA-256 without taking over an existing catalog identity. Portable library format 3 and favorites format 2 now carry locator-free local metadata so restored items can be repaired on a new device.
- Saved media keeps its source quality: wallpaper and sound downloads now verify that MediaStore received the exact source bytes, while video wallpaper feeds and local imports retain named originals with provenance. Apply creates a separate copy only for transforms, oversized media, or incompatible video and sound formats. Valid copies are reused. The Downloads screen now includes videos and shows original and optimized metadata, with a control that removes only the optimized file. Pending writes roll back on storage or encoder failure, and Ultra HDR transforms are identified as SDR working copies while the gainmap-bearing original remains intact. Saved video feed items reapply without another network fetch after their size and digest are verified.
- Rotation can skip a bad item without deleting it: wallpapers and videos now have a persistent Exclude from rotation action with immediate Undo. Downloads, local media, and history expose the same control. A manager in Settings restores one item or all of them. Scheduled rotation, one-shot triggers, widgets, theme switching, night variants, and wallpaper packs all honor the choice, while browsing and manual apply remain available. Local content hashes preserve exclusions after a path relink, and portable library backup restores the records without copying raw device paths. Full-file streaming hashes cover large SAF images, while excluded theme and night choices leave a persistent recovery hint in background diagnostics.
- Fit can now look intentional instead of leaving unexplained bars: static wallpapers, videos, and GIFs can use AMOLED black, a chosen color, a Palette color, or a blurred edge behind the complete frame. Preview and apply share the same saved choice. Video builds one canvas from a bounded representative frame and reuses it instead of blurring during playback. HDR and missing-frame fallbacks are deterministic, all generated media stays inside existing memory and file limits, and portable library backups retain the non-secret defaults.
- Restored provider keys now fail safely and visibly: Aura keeps user-entered provider keys in its Android Keystore-backed AES-GCM store and excludes both current and legacy credential files from cloud backup and device transfer. If ciphertext arrives without its device-bound key, Aura removes the unreadable copy and keeps a Settings notice visible until each affected key is handled. Temporary Keystore failures retain encrypted values and now have a tap-to-retry action. Library exports and diagnostics carry status only, never credential names or values. The privacy and Data safety checks now parse both Android backup formats and reject any mismatch between cloud and device-transfer rules.
- Provider availability now has one checked public contract: all 22 source records now declare media types, lifecycle, default order, credential needs, build and release-channel availability, and allowed actions. Reddit stays first for wallpapers and video wherever it ships, while YouTube stays first for sounds in GitHub and Obtainium builds and is absent from Play copy. The README, in-app legal catalog, diagnostics, store listing, and distribution packets now agree. Legacy sources retain attribution for old items without presenting dead feeds or credential prompts. The contract now controls the installed artifact too. Play bundles compile with YouTube disabled, live sound and video ranking follows manifest priority, and legacy items cannot apply, download, edit, share, or enter Aura Originals. Upgraded installs delete retired Freesound credentials on startup. Network requests also stop at a final artifact-availability gate. Saved wallpaper previews, restored video-feed caches, Media3 preview traffic, and NewPipe's direct transport now enforce the same rule. The drift check covers 25 runtime and release surfaces, including feed ranking, Settings, action policy, diagnostics, and the separate Play build command.
- Backups no longer report success after dropping library items: favorites, collections, collection membership, and search history now share one checked transfer contract. Oversized exports stop before the destination is opened, completed payloads are staged before publication, and failed copies clean up partial files. Imports distinguish duplicates from invalid rows, and the app reports exact imported, skipped, and failed counts.
- Release checks now prove the committed tree: one command archives the selected Git commit and runs every tracked-input release, documentation, and legal gate inside it. Ignored maintainer files can no longer make the release packet pass. Missing tracked evidence and references to deleted workflow files fail clearly, while signing, generated artifacts, console access, publication, and device checks report an explicit owner-only status.
Install
Choose the arm64-v8a APK for most modern Android phones. Use the universal APK when you don't know the device architecture. Compare the download against SHA256SUMS.txt before installing. Updating over an earlier Aura release keeps your library and settings.