aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2026-07-01release: 0.20.2Lena3-3/+9
Cut 0.2 for the F-Droid submission: it carries the opus playback fix, transactional session bring-up and teardown, the activity hardening, and the release-input verification. versionCode 2 corresponds to the already-written changelog for the store listing.
2026-07-01readme: document security and release policyLena1-18/+51
2026-07-01build: verify release inputsLena15-35/+379
Pin and verify what goes into a release: JitPack confined to the SPAKE2 module via exclusiveContent, the vendored subtree pulled by commit SHA instead of a mutable tag, a pinned Docker base digest with a checksummed cmdline-tools download, and a verifyScrcpyServer task wired into every assets merge. The expected server checksum can be overridden with -PscrcpyServerSha256 when the jar is built from source. build-apk now requires apksigner and fails unless independent signature verification succeeds. Split the test image into unit and e2e targets so JVM-only test runs do not download an emulator. Ship THIRD_PARTY_NOTICES and the LGPL text for SPAKE2 in the APK. Add scripts/check as the host quality gate.
2026-07-01app: fix session lifecycle, teardown, and opus playbackLena20-230/+449
Opus playback never worked: feed() called dequeueInputBuffer() on a codec in async-callback mode, which always throws, so every packet was silently dropped. Feed input through the async callback with a bounded pending queue instead. Make bring-up transactional: roll back partially opened streams and the server shell on failure, join reader threads on stop, and close the owning ADB streams before releasing sinks. Replace the openAbstract watchdog thread with a real timeout in the vendored AdbConnection.open(), which also removes the half-open stream from the lookup table on failure. Harden the activity: release owned Surfaces, gate callbacks on a destroyed flag and a session generation, serialize reconnect, and handle target replacement via singleTask + onNewIntent. Propagate device-list write failures instead of swallowing them, bound the clipboard payload and the video pending queue against hostile peers, and discard incomplete recordings instead of keeping corrupt files. Use the mediaPlayback foreground-service type; Android 15 stops dataSync services after six hours. Drop the unused ACCESS_NETWORK_STATE permission.
2026-07-01readme: document vendor/scrcpy and fastlane, fix build stepsLena1-1/+8
The layout section did not mention the scrcpy submodule (used by the F-Droid build to compile scrcpy-server from source) or the fastlane store metadata. The build steps told everyone to run fetch-vendor, but the vendored tree is committed; the script is only for bumping the pin, and running it mutates local history via git subtree.
2026-07-01fastlane: add store iconLena1-0/+0
The launcher icon is adaptive-XML-only (vector drawables, no raster mipmaps), which fdroidserver cannot extract from the APK, so the F-Droid listing would ship without an icon. Provide the 512x512 PNG via fastlane metadata: rendered 1:1 from the adaptive-icon vector drawables, cropped to the inner 72dp of the 108dp viewport.
2026-07-01test-rig: pre-install AGP's build-tools 34 pinLena2-1/+4
AGP 8.7 downloads build-tools;34.0.0 into the SDK at build time when it is missing, which made the first test run in a fresh image reach for the network. Bake it into the image.
2026-07-01test: print --help from the header comment blockLena1-1/+3
The sed line range broke silently whenever the header grew or shrank. Print from line 2 down to the first non-comment line instead, so the usage text tracks the header.
2026-07-01test: pass /dev/kvm's gid to docker numericallyLena1-4/+4
Group names resolved on the host do not exist inside the container, so the "kvm" fallback broke --group-add on hosts where getent found no kvm group. stat the device instead; the numeric gid is all that matters and /dev/kvm is already known to exist at this point.
2026-07-01test: derive the docker image tag from the rig inputsLena1-3/+3
The tag suffix had to be bumped by hand whenever the Dockerfile or sdk-packages.txt changed; forgetting meant silently testing against a stale image. Hash the two files into the tag so any edit invalidates the cache automatically.
2026-07-01treewide: correct stale commentsLena4-12/+11
- MuxRecorder claimed minSdk 35; it is 31. - Adb claimed API 34 is the current Android max, next to compileSdk 35. - Server claimed the openAbstract budget is wall-clock bounded below the e2e deadline; the deadline is per stream, so the worst case is not. Describe what actually holds instead. - Pixhash contradicted itself about java.desktop availability.
2026-07-01app: require the full signing credential setLena1-11/+11
signingConfigs.release populates only when all four of KEYSTORE_PATH, KEYSTORE_PASS, KEY_ALIAS and KEY_PASS are set, but the buildTypes wiring keyed on KEYSTORE_PATH alone. A half-set environment selected a half-populated config and failed with a confusing gradle error. Gate both on the same condition.
2026-07-01app: report whether a recording was actually writtenLena3-36/+21
MuxRecorder had a Listener interface that nothing implemented; every callback fired into a no-op. Delete it. stop() now returns whether a keyframe ever landed and the muxer ran, so Mirror can stop claiming "recording saved" when no file was written.
2026-07-01app: clamp forwarded touch pressure to u16Lena1-1/+4
MotionEvent.getPressure() is calibrated around 1.0 but may exceed it on some digitizers. Masking with 0xffff wrapped hard presses around to a light touch; clamp instead.
2026-07-01app: guard VideoSink.submit against torn-down codecLena1-5/+9
reconfigure() tears the codec down outside the lock, so an in-flight MediaCodec callback can reach submit() while `codec` is null. The NPE lands on the callback handler thread, which has no catch and kills the process. Drop the frame instead, like any back-pressure casualty. Also rewrite the back-pressure comment: it described a keyframe-aware drop policy this class cannot implement (the keyframe flag never reaches it). The real policy protects config frames only.
2026-06-24scrcpy-android: mirror an Android device over wireless ADB0.1Lena124-0/+12789
Native Java app for Android 12+ that mirrors another Android device over wireless ADB, forwarding video, audio, touch input, and clipboard. Bundles a pinned scrcpy-server.jar and the vendored libadb-android stack. Supports h264/h265/av1 video and raw/opus audio with in-app codec selection. No NDK, no Kotlin. Includes JVM unit tests and a Docker-based emulator e2e rig.