Skip to content

chore(android): finish Android support before the main merge - #40

Merged
heoblitz merged 16 commits into
feature/android-supportfrom
feature/android-e2e-and-main-merge
Nov 12, 2026
Merged

heoblitz merged 16 commits into
feature/android-supportfrom
feature/android-e2e-and-main-merge

Conversation

@heoblitz

@heoblitz heoblitz commented Nov 12, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

What is left before feature/android-support can go to main, following #38 and #39.

CI

  • The SDK and simulator jobs were iOS only but did not say so. They are now
    iOS SDK Build & Tests and iOS Simulator Connection & CLI E2E.
  • Android Emulator Connection E2E boots an emulator on a Linux runner, runs the
    sample and speaks to the SDK through ADB the way the host does: the handshake, the
    frame and request limits, and a request that succeeds. The Necto host needs macOS
    and hosted Mac runners cannot run an emulator, so this job does not cover the Mac
    side. script/android-sample gains --sdk-only and script/test-android-security
    no longer requires a host.
  • After a release is published, Android SDK on JitPack asks JitPack to build the
    new tag and runs script/test-android-consumer --jitpack <version> against it.

Checks

  • script/test-android-artifacts keeps the two checks nothing else makes: no SDK
    module declares a permission, and each plugin module carries only its own panel.
    Comparing packaged panel files with their source repeated the copy the Gradle task
    does, and the debuggable check tested the sample's build type rather than the SDK.
  • The Control tests end their activity after each test. composeTapRunsTheClickHandler
    saw stale Compose text in one build variant or the other across three CI runs, with
    compositions from earlier tests still running; it passes in both since.

Docs

  • The device plugin tutorial builds its example in Kotlin too.
  • The install guide shows how to run the Android sample and what to check when an
    Android app does not appear.
  • The Korean verification and harness pages gain the Android sections their English
    versions have.
  • The bug report template, the contributing and security notes, the plugin pages and
    the architecture module table no longer assume iOS.

Main

  • Merges main. Localizable.strings keeps both the Android settings strings and
    main's reworded font hint, with the Korean Android strings in the tone main moved
    the copy to. The Preferences panel changed on both sides and is rebuilt from the
    merged sources.

Renaming the two jobs changes the names the main ruleset requires. The ruleset has
to be updated before this branch is proposed for main.

Test Plan

  • script/test swift, script/test native, script/test release and
    script/test web pass on the merged tree.
  • yarn build rebuilds every panel into SDK/Plugins/<Name>/Panel; only the
    Preferences index.js differs from what was committed.
  • yarn docs:build passes.
  • All twelve Gradle projects configure, and the JVM modules build and pass their tests.
  • The tutorial's Kotlin plugin compiles against necto-core, and its panel loads from
    resources laid out as the tutorial describes.

Covered by this PR's CI rather than locally:

  • Android Emulator Connection E2E passes: the emulator boots and
    script/test-android-security reports all six checks.
  • The Android library modules and the sample, script/test-android-artifacts and
    script/test-android-consumer pass.

Not verified:

  • Android SDK on JitPack, which runs only during a release.
  • --sdk-only on a device.
  • The tutorial's Kotlin plugin inside a real Android app.

heoblitz and others added 16 commits November 3, 2026 14:09
…-polish

Show update indicators and download progress in Settings
test: resolve generator CLI file URL as a native path
fix: include gitignore files in packed plugin templates
…ship

Comparing packaged panel files with their source repeated what the Gradle task
does by copying them, and the consumer check already asserts which panels an app
ends up with. The debuggable check tested the sample's build type rather than
the SDK.
The install guide only showed how to run the iOS example and how to find a
missing iOS app. The Korean verification and harness pages lacked the Android
sections their English versions have.
The SDK and simulator jobs were iOS only but did not say so. They are now
iOS SDK Build & Tests and iOS Simulator Connection & CLI E2E.

Android Emulator Connection E2E boots an emulator, runs the sample and speaks
to the SDK through ADB the way the host does. The Necto host needs macOS and
hosted Mac runners cannot run an emulator, so script/android-sample gains
--sdk-only and script/test-android-security no longer requires a host.
JitPack builds a tag on its first request, so a broken tag showed up only when
an app added it. The release workflow now asks for the build once the release
is published and runs the selective consumer check against the artifacts.
The tutorial built its example plugin in Swift only. It now answers the same
contract in Kotlin, carries the same built panel as Java resources and registers
it with NectoAndroid.
Conflicts: the Android settings strings and main's reworded font hint both
landed in Localizable.strings, and the built Preferences panel changed on both
sides. The strings keep both, with the Android ones in the tone main moved the
Korean copy to. The panel is rebuilt from the merged sources.
The bug report template, the contributing and security notes and the plugin
pages named only USB devices, simulators and Swift packages. The architecture
page lists the Android bridge and the plugin folders.
The emulator job never booted: avdmanager created the AVD where the emulator did
not look, the emulator exited, and adb waited for a device until the job timed
out. Both now use ANDROID_AVD_HOME, and the wait is bounded.
composeTapRunsTheClickHandler passed in one variant and failed in the other of
the same CI run: the tap changed the state, but the text was still Count 0 after
sixty frames. The helper now sends snapshot apply notifications itself rather
than relying on the process-wide observer to do it under Robolectric.
Sending snapshot notifications from the frame helper did not stop
composeTapRunsTheClickHandler from seeing stale text, so that change is undone.

The tests never ended their activities, so compositions from earlier tests kept
running against Compose's process-wide UI dispatcher while Robolectric reset the
main looper between tests. Each test now closes its activity and lets the looper
finish.
@heoblitz
heoblitz merged commit 3435815 into feature/android-support Nov 12, 2026
28 checks passed
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