mirror of
https://github.com/Darkrock-Studios/hammer-editor.git
synced 2026-10-03 12:16:51 +00:00
* Switch the desktop Ktor engine to OkHttp `java.net.http.HttpClient`'s constructor opens an NIO `Selector`, whose Windows wakeup pipe is an AF_UNIX socket. The MSIX sandbox rejects the connect with EINVAL, so every Microsoft Store build hard-crashes on the first network call, before any request is sent (JDK-8312215, open since Java 17 with no fix in sight). OkHttp uses blocking socket IO and is unaffected. Ships unconditionally rather than gated on the distribution channel: OkHttp works everywhere, and a second engine would be a second code path to test forever. Android already uses it. Includes the unchecked-IO mapping from `fix/unchecked-io-network-errors`, so a client that cannot be built at all surfaces as a network error rather than taking down the app. * Add an Export Logs button to the desktop About screen Opening the log directory hands the shell a path that does not exist under an MSIX container: the app's writes to %LOCALAPPDATA% are redirected into the package's LocalCache, but reads fall through, so the app sees the directory and Explorer does not. Snap confinement will do the same on Linux. Exporting a zip to a location the user picks works on every distribution vehicle, which makes it the one support instruction that never needs a per-channel caveat. Also walk up to the nearest existing ancestor before handing a directory to the shell, so the open button degrades instead of erroring. * Bake the distribution channel into the build Per-vehicle rules (self-update, store payment policy, "get the app" links, sandbox-aware paths) were tracked by hand. `-Pchannel=<token>` now resolves to a `DistributionChannel` constant, defaulting to DEV, and an unknown token fails the build rather than quietly shipping a store binary as DEV. Every release pipeline passes its own channel; the existing F-Droid build flags map to FDROID without their call sites changing. Flat enum rather than capability flags: every channel-conditional branch is a greppable `when` on the type. Flags can emerge later from actual duplication. The startup banner and all three crash dumps now carry the channel. That line pays for itself immediately: this investigation started from a crash log that did not say which build produced it. * Un-redirect container paths before handing them to the shell MSIX filesystem redirection is asymmetric: the app's writes under %LOCALAPPDATA% land inside the package container, but reads fall through, so File.exists() is true from inside the container and the app is satisfied. Explorer runs outside it and correctly reports nothing at the literal path, which is the "location is not available" dialog the open-logs button produced on the Store build. Rewrite the path into the container for the Microsoft Store channel, both where it is shown and where it is handed to the shell. The package family name is hardcoded: Windows derives its hash suffix from the publisher ID, so it is not in AppxManifest.xml and cannot be computed from it, and it only changes if the Store identity does. `Windows.Storage.ApplicationData.Current.LocalCacheFolder` is the native answer but means a WinRT dependency on a KMP desktop target for one path lookup. Worth revisiting only if more packaged-app APIs are needed. * Cover the About log section with a render test, document the channel * Suppress TooGenericExceptionCaught on the unchecked IO catch |
||
|---|---|---|
| .. | ||
| gradle/wrapper | ||
| icons | ||
| macos-native | ||
| scripts | ||
| src | ||
| build.gradle.kts | ||
| entitlements.plist | ||
| proguard-rules.pro | ||
| runtime-entitlements.plist | ||