Skip to content

Codebase review: translations, share/timeout fixes, Maps open, version 1.3.11 - #178

Merged
doubleangels merged 10 commits into
mainfrom
refactor/codebase-review
Oct 3, 2026
Merged

doubleangels merged 10 commits into
mainfrom
refactor/codebase-review

Conversation

@doubleangels

Copy link
Copy Markdown
Owner

Translates the Maps strings in all 12 locales and adds StringTranslationsTest so missing/mismatched translations fail the build.

Also includes share-drop feedback, onTimeout Convert cancellation, auto-cleanup thread fix, cache-sweep privacy fix, Scan restyle, added unit tests, and version bump to 1.3.11 (21).

🤖 Generated with Claude Code

doubleangels and others added 10 commits September 25, 2026 16:48
…pers

Cover ShareHandlerActivity intent handling, PermissionManager, LocalNotifications,
MetadataDisplayer map coordinates, MediaUriResolver, AppProcessingScope,
MediaStoreWrites, and VideoMedia3Converter format mapping.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Robolectric's legacy graphics decode arbitrary bytes into fake bitmaps, so
ShareHandlerActivityTest behaved differently on Linux CI than on Windows.
Also include logcat errors in assertion messages and log full exceptions
for failing unit tests so CI failures are diagnosable from the console.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FileProvider caches path roots statically while Robolectric gives each test a
new data directory, so the second test producing a share URI was rejected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Wrap metadata rows in a tonal inset container with inset dividers,
and use primary-colored labels with BodyLarge values.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… verification failures

Fixes REDACT-1S: cancelShareProcessing/finishWithError/onDestroy ran
SecureDelete's multi-pass overwrite+fsync synchronously on the main
thread, which can block long enough to trip the ANR watchdog on large
shared videos. Cleanup now runs on a background executor.

Fixes REDACT-1H, REDACT-1J, REDACT-1Q, REDACT-1R: when snapshotting an
inbound shared URI failed (source already unreadable), the code fell
back to forwarding the same original URI into the rest of the pipeline,
where every later stage (extractor, transcoder, verifier) failed
identically on the same dead URI and logged its own exception. One
real failure was producing four separate crash reports. Unreadable
items are now dropped instead of forwarded.

Fixes REDACT-1V: verifyVideoMetadataRemoval compared the source's raw
METADATA_KEY_DATE against the output's, but Android reports the exact
same sentinel string ("19040101T000000.000Z", the QuickTime epoch) for
both a date-less source and our own date-less encoder output. Any video
with no real creation date was permanently failing verification because
the placeholder matched itself. The placeholder is now normalized to
null before the comparison.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KUuhuB3pkJmPUmtdpqPxJp
…dead code

Run the stale-temp cache sweep from RedactApplication.onCreate (every
process start) instead of only MainActivity.onCreate, so a user who
only ever enters through the share sheet no longer leaves unredacted
source snapshots in cache past the 24h cutoff just because they never
open the main app. A per-process guard keeps the sweep from running
twice on an ordinary cold start into MainActivity.

Switch ConvertFileAdapter to the same DiffUtil pattern MediaAdapter
already uses, instead of notifyDataSetChanged(), so unrelated rows
keep their loaded thumbnail instead of reloading on every edit.

Remove dead code found while simplifying: MetadataStripper's unused
file-size cache (fileSizeCache/getFileSizeFromUri/
getFileSizeFromUriCached/clearFileSizeCache, ~95 lines, no callers
anywhere), duplicate unused stripExtension/sanitizeFileName helpers in
both FormatConverter and VideoMedia3Converter, and PermissionManager's
unused requestMediaPermissions/requestStoragePermissions wrappers and
TAG constant.

Add Android 15+ (API 35) foreground-service timeout handling:
ProcessingForegroundService now overrides onTimeout to cancel the
active job and stop cleanly instead of being killed outright once the
mediaProcessing background execution budget is hit. Also enable
predictive back gesture support (enableOnBackInvokedCallback) -- the
app has no custom back-press handling to conflict with it.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KUuhuB3pkJmPUmtdpqPxJp
Replace the Scan tab's "Copy Coordinates" action with "Open in Maps":
tapping it now launches the device's default maps app at that
location via an implicit geo: intent, instead of putting the raw
lat/lon on the clipboard.

Opening a third-party maps app hands it the exact GPS coordinates,
which may then leave the device (tile loading, address lookup) --
unlike every other Scan action, which stays entirely on-device. The
first time this is used, a dialog explains that and asks for explicit
consent before continuing; consenting is remembered via a new
AppPreferences flag so it won't ask again, and declining just cancels
that one open (asked again next time).

Removed the now-unused "Copy Coordinates" string from all locale
files rather than leave stale translated text under a key nothing
references anymore. The new strings are only added to the default
values/strings.xml; other locales fall back to English until
translated.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KUuhuB3pkJmPUmtdpqPxJp
… and timeout cleanup

- Add missing scan_maps_* / scan_open_coordinates_in_maps translations to all 12 locales
- Add StringTranslationsTest so missing or mismatched translations fail the build
- Count shared items dropped at snapshot time so the partial-success toast still shows
- Cancel the Convert batch in ProcessingForegroundService.onTimeout
- Replace never-shutdown auto-cleanup executor with a one-shot thread

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
versionCode 20 -> 21, versionName 1.3.10 -> 1.3.11

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- ShareHandlerActivityTest: wait for async snapshot deletion before asserting
- CacheCleanup: reset-for-tests joins any in-flight auto-cleanup thread, so a sweep started by Application.onCreate can't delete files mid-test

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@doubleangels
doubleangels merged commit 06150a9 into main Oct 3, 2026
2 checks passed
@doubleangels
doubleangels deleted the refactor/codebase-review branch October 3, 2026 07:03
doubleangels pushed a commit that referenced this pull request Oct 3, 2026
…eview"

This reverts commit 06150a9, reversing
changes made to 09bfc53.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants