Take odrcore 6, which has no decoder engines and binds its own port - #544
Merged
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5a84be6283
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
The index commit adds an odrcore/6 recipe and pins 6.0.1: 6.0.0 drops the pdf2htmlEX and wvWare backends, so `with_pdf2htmlEX` and `with_wvWare` no longer exist as options and the two `=False` lines have to go with them - the build is exactly what it already was, the options just stopped being the way to ask for it. 6.0.1 is that release plus the android build fix in opendocument-app/OpenDocument.core#628, without which `libodr_jni.so` does not compile for any ABI. Two things the app talks to went with that release: - `DecoderEngine` is gone entirely. With the external backends removed the enum had one value left and could not select anything, so `open()` drops the `DecodePreference` that named it. It only ever existed to keep the engines that are not compiled in from being offered. - `HttpServer` splits `listen(host, port)` into `bind(host, port)` and `listen()`, and `Config.cachePath` is gone with `serveFile` - what a service was translated into belongs to whoever translated it, and this app translates through `Html.translate` and hands the cache path there already. `bind` is what the port dance was missing. It returns the port it actually got and throws when it cannot bind, which is what the ServerSocket probe in front of `listen` was approximating - so the probe goes, along with the reasoning about which socket options it had to match. The core sets SO_REUSEADDR now rather than cpp-httplib's SO_REUSEPORT, so a port held only by TIME_WAIT sockets is bindable again and only a live server of the other flavor still sends us to a free one. Verified with the four ABIs built against odrcore 6: unit tests, lint, and the 12 instrumented tests on a Pixel 6 Pro AVD, which load and edit real documents off that server. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015CX6aCCt9pM9WaTF5MwM5o
andiwand
force-pushed
the
update-odrcore-6
branch
from
July 27, 2026 22:54
5a84be6 to
56ee5b3
Compare
andiwand
enabled auto-merge (squash)
July 27, 2026 22:57
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pulls the conan-odr-index submodule up to
08a9adc(bump odrcore 6.0.1) and moves the app onto it.with_pdf2htmlEX/with_wvWareare gone from the recipe — 6.0.0 dropped both backends, so the options that used to switch them off no longer exist. The android build is unchanged by that; it never had them. 6.0.1 is that release plus opendocument-app/OpenDocument.core#628, without whichlibodr_jni.sodoes not compile for any ABI.Two pieces of the API the app talks to went with the same release:
DecoderEngineis gone entirely. With the external backends removed the enum had a single value and could not select anything, soopen()drops theDecodePreferencethat named it. It only existed to keep engines that are not compiled in from being offered.HttpServersplitslisten(host, port)intobind(host, port)+listen(), andConfig.cachePathwent withserveFile. This app translates throughHtml.translateand passes the cache path there already, so thecore/servercache directory is simply no longer created.bindis what the port handling was missing. It returns the port it actually got and throws when it cannot bind — which is what theServerSocketprobe in front oflistenwas approximating — so the probe goes, and with it the reasoning about which socket options it had to be at least as strict as. The core setsSO_REUSEADDRnow instead of cpp-httplib'sSO_REUSEPORT, so a port held only by TIME_WAIT sockets can be bound again and only a live server of the other flavor still sends us to a free one.Test
./gradlew assembleProDebug testProDebugUnitTest lintProDebug spotlessApply— green../gradlew connectedProDebugAndroidTeston a Pixel 6 Pro AVD — 12/12, including the ODT/DOCX edit round trips and the spreadsheet sheet names, all of which fetch from the server this PR rewires the binding of.Both ran against odrcore 6 built for
armv8,armv7,x86andx86_64(NDK 28.2.13676358, api 26) — first on 6.0.0 with #628 as a local recipe patch, and re-run on the released 6.0.1 that carries it.🤖 Generated with Claude Code
https://claude.ai/code/session_015CX6aCCt9pM9WaTF5MwM5o