aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/invalid/lena
AgeCommit message (Collapse)AuthorFilesLines
2026-08-01video: reset stalled encoder generationsLena2-9/+21
2026-08-01audio: harden Opus playbackLena4-136/+154
Preserve decoder timing and keep blocking speaker writes off codec callbacks. Playback failures no longer take down video or control.
2026-08-01app: harden mirroring lifecycle and stateLena27-834/+1625
2026-08-01adb: reduce and harden wireless transportLena3-55/+217
2026-07-01app: enter the device address as one host:port fieldLena2-32/+70
The form asked for a host, a pairing port and a connection port as three separate fields. Nothing on screen says which port is which, and the two are only distinguishable if the reader already knows how adb pair works on Android 11+. Take the connection endpoint the way the target prints it, as a single "ip:port" string copied off the Wireless debugging screen, and leave the pairing dialog with just its port and code. Devices.parseAddress() does the split and rejects anything malformed rather than guessing: an unbracketed IPv6 literal would otherwise be split at the wrong colon. Reported on the F-Droid submission (fdroiddata!41394).
2026-07-01app: pad Main and Settings for system bar insetsLena3-1/+43
targetSdk 35 makes every window edge-to-edge on Android 15. Neither activity handled insets, so Main drew its header under the status bar and the Settings ScrollView started at window y=0: the framework action bar covered its first 80dp and the navigation bar covered the last rows. Pad both roots by the system bar insets. Main adds the IME inset as well, since an edge-to-edge window is not resized when the keyboard opens. Settings drops the framework action bar and draws its own title like Main already does, which removes the action-bar-versus-inset interaction entirely. Reported on the F-Droid submission (fdroiddata!41394).
2026-07-01app: fix session lifecycle, teardown, and opus playbackLena14-218/+385
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-01treewide: correct stale commentsLena3-9/+8
- 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: 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.1Lena26-0/+3549
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.