Skip to content

Apple TV (tvOS) and Google TV (Android TV) support#5261

Open
shai-almog wants to merge 4 commits into
masterfrom
tv-support
Open

Apple TV (tvOS) and Google TV (Android TV) support#5261
shai-almog wants to merge 4 commits into
masterfrom
tv-support

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Adds TV form-factor support across the framework, builders and CI. Modeled on the merged Apple Watch port (#5252), but tvOS is handled like the Mac Catalyst slice (Metal + most iOS APIs, just no OpenGL ES) rather than the watch's Core-Graphics backend.

Phase 1 — shared form-factor API + @media (complete, verified)

  • CN.isTV() / Display.isTV() / CodenameOneImplementation.isTV() (mirrors isWatch()).
  • iOS isTV() via a new isRunningOnTV() native backed by TARGET_OS_TV; {tv,ios,appletv} platform overrides.
  • Android isTV() (television/leanback feature + UiModeManager fallback); {tv,android,android-tv} overrides.
  • Resources.loadTheme now selects device-tv / device-watch @media variants at runtime — this also completes @media for the existing watch port, which never wired it.
  • CSSDeviceFormFactorMediaQueryTest (passes against the real compiler) + css.asciidoc docs.

Phase 2 — Google TV / Android TV (complete, verified)

  • AndroidGradleBuilder (both the maven-plugin and BuildDaemon copies): LEANBACK_LAUNCHER category, android.software.leanback + touchscreen-optional uses-feature, and a generated 320×180 tv_banner, gated on a new android.tv hint.
  • Build-hint schema (android.tv / android.tv.banner); README + new TVPlatforms.asciidoc dev-guide section.
  • Same APK runs on phones/tablets.

Phase 3 — Apple TV (tvOS)

  • TvNativeBuilder adds a separate appletvos Xcode target (TARGETED_DEVICE_FAMILY=3, Metal, OpenGL-only .m files excluded), reusing the shared UIApplicationMain entry — modeled on MacNativeBuilder. Wired into IPhoneBuilder + CN1BuildMojo (codename1.tvMain) + build-hint schema.
  • Verified end-to-end locally against the Xcode 26 / tvOS 26 SDK: the <Main>TV target generates and the build reaches compilation.
  • Native #if !TARGET_OS_TV slice in progress: MessageUI + several UIKit-conformance guards landed; the remaining guards (notifications, WebKit, status-bar/orientation, pickers) are tracked in Ports/iOSPort/nativeSources/TVOS_PORT.md.

Phase 4 — tvOS screenshot tests

  • scripts/run-tv-ui-tests.sh (tvOS-simulator clone of run-watch-ui-tests.sh) + a non-blocking build-ios-tv CI job (continue-on-error until the native slice compiles and the scripts/ios/screenshots-tv golden set is seeded — the same bootstrap the watch port used). Sample auto-enables the target via codename1.tvMain.

Status / follow-up

Phases 1–2 are complete and verified. The tvOS builder + test infrastructure are complete and verified to generate a valid tvOS target; the tvOS native source slice needs further !TARGET_OS_TV guarding (documented in TVOS_PORT.md) before build-ios-tv goes blocking and seeds goldens. Corresponding TvNativeBuilder changes were also made in the BuildDaemon repo (cloud builds).

🤖 Generated with Claude Code

Phase 1 — shared form-factor API + @media:
- CN.isTV() / Display.isTV() / CodenameOneImplementation.isTV() (mirrors isWatch())
- iOS isTV() via new isRunningOnTV() native (TARGET_OS_TV) + {tv,ios,appletv} overrides
- Android isTV() (television/leanback feature + UI-mode) + {tv,android,android-tv} overrides
- Resources.loadTheme selects device-tv / device-watch @media variants at runtime
  (also completes @media for the existing watch port, which never wired it)
- CSSDeviceFormFactorMediaQueryTest (runs green) + dev-guide css.asciidoc

Phase 2 — Google TV / Android TV:
- AndroidGradleBuilder: LEANBACK_LAUNCHER category, android.software.leanback +
  touchscreen-optional uses-feature, generated 320x180 tv_banner; gated on android.tv
- build-hint schema (android.tv / android.tv.banner); README + TVPlatforms dev guide

Phase 3 — Apple TV (tvOS):
- TvNativeBuilder: adds a separate appletvos Xcode target (family 3, Metal, GL-only
  sources excluded), modeled on the Mac Catalyst slice; wired into IPhoneBuilder +
  CN1BuildMojo (codename1.tvMain) + build-hint schema. Verified end-to-end locally:
  generates the <Main>TV target against the tvOS 26 SDK.
- Native tvOS slice (#if !TARGET_OS_TV) in progress: MessageUI + several UIKit
  conformance guards done; remaining guards tracked in TVOS_PORT.md.

Phase 4 — tvOS screenshot tests:
- scripts/run-tv-ui-tests.sh + a non-blocking build-ios-tv CI job (continue-on-error
  until the native slice compiles and goldens are seeded, as the watch port was);
  scripts/ios/screenshots-tv goldens dir; sample auto-enables via codename1.tvMain.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

@shai-almog

shai-almog commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 11 screenshots: 11 matched.
✅ JavaSE simulator integration screenshots matched stored baselines.

@shai-almog

shai-almog commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 121 screenshots: 121 matched.
✅ JavaScript-port screenshot tests passed.

@shai-almog

shai-almog commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 128 screenshots: 128 matched.

Native Android coverage

  • 📊 Line coverage: 14.26% (8693/60944 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 11.54% (42773/370671), branch 5.12% (1787/34885), complexity 6.09% (2037/33421), method 10.54% (1646/15615), class 17.16% (378/2203)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6327 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.ClassReader – 0.00% (0/1519 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1148 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.MethodWriter – 0.00% (0/923 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/730 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/623 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.Frame – 0.00% (0/564 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/495 lines covered)
      • kotlinx.coroutines.kotlinx.coroutines.JobSupport – 0.00% (0/423 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 14.26% (8693/60944 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 11.54% (42773/370671), branch 5.12% (1787/34885), complexity 6.09% (2037/33421), method 10.54% (1646/15615), class 17.16% (378/2203)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6327 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.ClassReader – 0.00% (0/1519 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1148 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.MethodWriter – 0.00% (0/923 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/730 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/623 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.Frame – 0.00% (0/564 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/495 lines covered)
      • kotlinx.coroutines.kotlinx.coroutines.JobSupport – 0.00% (0/423 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 190ms / native 326ms = 0.5x speedup
SIMD float-mul (64K x300) java 124ms / native 125ms = 0.9x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 395.000 ms
Base64 CN1 decode 240.000 ms
Base64 native encode 1018.000 ms
Base64 encode ratio (CN1/native) 0.388x (61.2% faster)
Base64 native decode 1505.000 ms
Base64 decode ratio (CN1/native) 0.159x (84.1% faster)
Image encode benchmark status skipped (SIMD unsupported)

@github-actions

github-actions Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ByteCodeTranslator: 0 findings (no issues)
    • android: 0 findings (no issues)
    • codenameone-maven-plugin: 0 findings (no issues)
    • core-unittests: 0 findings (no issues)
    • ios: 0 findings (no issues)
  • PMD: 0 findings (no issues) [Report archive]
  • Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 125 screenshots: 125 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 70ms / native 5ms = 14.0x speedup
SIMD float-mul (64K x300) java 73ms / native 4ms = 18.2x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 280.000 ms
Base64 CN1 decode 170.000 ms
Base64 SIMD encode 151.000 ms
Base64 encode ratio (SIMD/CN1) 0.539x (46.1% faster)
Base64 SIMD decode 133.000 ms
Base64 decode ratio (SIMD/CN1) 0.782x (21.8% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 33.000 ms
Image createMask (SIMD on) 11.000 ms
Image createMask ratio (SIMD on/off) 0.333x (66.7% faster)
Image applyMask (SIMD off) 51.000 ms
Image applyMask (SIMD on) 24.000 ms
Image applyMask ratio (SIMD on/off) 0.471x (52.9% faster)
Image modifyAlpha (SIMD off) 55.000 ms
Image modifyAlpha (SIMD on) 17.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.309x (69.1% faster)
Image modifyAlpha removeColor (SIMD off) 57.000 ms
Image modifyAlpha removeColor (SIMD on) 18.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.316x (68.4% faster)

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@shai-almog

shai-almog commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 127 screenshots: 127 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

@shai-almog

shai-almog commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 127 screenshots: 127 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

@shai-almog

shai-almog commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 128 screenshots: 128 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 134 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 61ms / native 3ms = 20.3x speedup
SIMD float-mul (64K x300) java 57ms / native 3ms = 19.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 356.000 ms
Base64 CN1 decode 223.000 ms
Base64 native encode 816.000 ms
Base64 encode ratio (CN1/native) 0.436x (56.4% faster)
Base64 native decode 491.000 ms
Base64 decode ratio (CN1/native) 0.454x (54.6% faster)
Base64 SIMD encode 56.000 ms
Base64 encode ratio (SIMD/CN1) 0.157x (84.3% faster)
Base64 SIMD decode 48.000 ms
Base64 decode ratio (SIMD/CN1) 0.215x (78.5% faster)
Base64 encode ratio (SIMD/native) 0.069x (93.1% faster)
Base64 decode ratio (SIMD/native) 0.098x (90.2% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 24.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.125x (87.5% faster)
Image applyMask (SIMD off) 106.000 ms
Image applyMask (SIMD on) 56.000 ms
Image applyMask ratio (SIMD on/off) 0.528x (47.2% faster)
Image modifyAlpha (SIMD off) 92.000 ms
Image modifyAlpha (SIMD on) 68.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.739x (26.1% faster)
Image modifyAlpha removeColor (SIMD off) 152.000 ms
Image modifyAlpha removeColor (SIMD on) 97.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.638x (36.2% faster)

@shai-almog

shai-almog commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
✅ Native Apple Watch (watchOS, Core Graphics) screenshot tests passed.

@shai-almog

shai-almog commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator Author

iOS screenshot updates

Compared 128 screenshots: 3 matched, 121 updated, 4 missing references.

  • AdsScreen — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    AdsScreen
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as AdsScreen.png in workflow artifacts.

  • AnimateHierarchyScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    AnimateHierarchyScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as AnimateHierarchyScreenshotTest.png in workflow artifacts.

  • AnimateLayoutScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    AnimateLayoutScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as AnimateLayoutScreenshotTest.png in workflow artifacts.

  • AnimateUnlayoutScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    AnimateUnlayoutScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as AnimateUnlayoutScreenshotTest.png in workflow artifacts.

  • ButtonTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ButtonTheme_dark
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as ButtonTheme_dark.png in workflow artifacts.

  • ButtonTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ButtonTheme_light
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as ButtonTheme_light.png in workflow artifacts.

  • chart-bar-stacked — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-bar-stacked
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as chart-bar-stacked.png in workflow artifacts.

  • chart-bubble — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-bubble
    Preview info: JPEG preview quality 40; JPEG preview quality 40; downscaled to 825x1789.
    Full-resolution PNG saved as chart-bubble.png in workflow artifacts.

  • chart-combined-xy — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-combined-xy
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as chart-combined-xy.png in workflow artifacts.

  • chart-cubic-line — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-cubic-line
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as chart-cubic-line.png in workflow artifacts.

  • chart-doughnut — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-doughnut
    Preview info: JPEG preview quality 60; JPEG preview quality 60; downscaled to 825x1789.
    Full-resolution PNG saved as chart-doughnut.png in workflow artifacts.

  • chart-line — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-line
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as chart-line.png in workflow artifacts.

  • chart-pie — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-pie
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as chart-pie.png in workflow artifacts.

  • chart-radar — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-radar
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as chart-radar.png in workflow artifacts.

  • chart-range-bar — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-range-bar
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as chart-range-bar.png in workflow artifacts.

  • chart-rotated-pie — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-rotated-pie
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as chart-rotated-pie.png in workflow artifacts.

  • chart-scatter — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-scatter
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as chart-scatter.png in workflow artifacts.

  • chart-time — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-time
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as chart-time.png in workflow artifacts.

  • chart-transform — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    chart-transform
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as chart-transform.png in workflow artifacts.

  • ChatInput_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ChatInput_dark
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as ChatInput_dark.png in workflow artifacts.

  • ChatInput_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ChatInput_light
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as ChatInput_light.png in workflow artifacts.

  • ChatView_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ChatView_dark
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as ChatView_dark.png in workflow artifacts.

  • ChatView_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ChatView_light
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as ChatView_light.png in workflow artifacts.

  • CheckBoxRadioTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    CheckBoxRadioTheme_dark
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as CheckBoxRadioTheme_dark.png in workflow artifacts.

  • CheckBoxRadioTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    CheckBoxRadioTheme_light
    Preview info: JPEG preview quality 60; JPEG preview quality 60; downscaled to 825x1789.
    Full-resolution PNG saved as CheckBoxRadioTheme_light.png in workflow artifacts.

  • ComponentReplaceFadeScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ComponentReplaceFadeScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as ComponentReplaceFadeScreenshotTest.png in workflow artifacts.

  • ComponentReplaceFlipScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ComponentReplaceFlipScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as ComponentReplaceFlipScreenshotTest.png in workflow artifacts.

  • ComponentReplaceSlideScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ComponentReplaceSlideScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as ComponentReplaceSlideScreenshotTest.png in workflow artifacts.

  • CoverHorizontalTransitionTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    CoverHorizontalTransitionTest
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as CoverHorizontalTransitionTest.png in workflow artifacts.

  • css-gradients — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    css-gradients
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as css-gradients.png in workflow artifacts.

  • DesktopMode — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    DesktopMode
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as DesktopMode.png in workflow artifacts.

  • DialogTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    DialogTheme_dark
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as DialogTheme_dark.png in workflow artifacts.

  • DialogTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    DialogTheme_light
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as DialogTheme_light.png in workflow artifacts.

  • FadeTransitionTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    FadeTransitionTest
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as FadeTransitionTest.png in workflow artifacts.

  • FlipTransitionTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    FlipTransitionTest
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as FlipTransitionTest.png in workflow artifacts.

  • FloatingActionButtonTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    FloatingActionButtonTheme_dark
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as FloatingActionButtonTheme_dark.png in workflow artifacts.

  • FloatingActionButtonTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    FloatingActionButtonTheme_light
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as FloatingActionButtonTheme_light.png in workflow artifacts.

  • Gpu3DAnimation — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots/Gpu3DAnimation.png.

    Gpu3DAnimation
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as Gpu3DAnimation.png in workflow artifacts.

  • Gpu3DCube — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots/Gpu3DCube.png.

    Gpu3DCube
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as Gpu3DCube.png in workflow artifacts.

  • Gpu3DModel — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots/Gpu3DModel.png.

    Gpu3DModel
    Preview info: JPEG preview quality 40; JPEG preview quality 40; downscaled to 825x1789.
    Full-resolution PNG saved as Gpu3DModel.png in workflow artifacts.

  • Gpu3DTexturedCube — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots/Gpu3DTexturedCube.png.

    Gpu3DTexturedCube
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as Gpu3DTexturedCube.png in workflow artifacts.

  • graphics-affine-scale — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-affine-scale
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-affine-scale.png in workflow artifacts.

  • graphics-clip-under-rotation — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-clip-under-rotation
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-clip-under-rotation.png in workflow artifacts.

  • graphics-draw-arc — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-draw-arc
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 590x1278.
    Full-resolution PNG saved as graphics-draw-arc.png in workflow artifacts.

  • graphics-draw-gradient-stops — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-draw-gradient-stops
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-draw-gradient-stops.png in workflow artifacts.

  • graphics-draw-gradient — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-draw-gradient
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-draw-gradient.png in workflow artifacts.

  • graphics-draw-image-rect — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-draw-image-rect
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 590x1278.
    Full-resolution PNG saved as graphics-draw-image-rect.png in workflow artifacts.

  • graphics-draw-line — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-draw-line
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 413x895.
    Full-resolution PNG saved as graphics-draw-line.png in workflow artifacts.

  • graphics-draw-rect — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-draw-rect
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-draw-rect.png in workflow artifacts.

  • graphics-draw-round-rect — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-draw-round-rect
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-draw-round-rect.png in workflow artifacts.

  • graphics-draw-shape — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-draw-shape
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-draw-shape.png in workflow artifacts.

  • graphics-draw-string-decorated — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-draw-string-decorated
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 590x1278.
    Full-resolution PNG saved as graphics-draw-string-decorated.png in workflow artifacts.

  • graphics-draw-string — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-draw-string
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 413x895.
    Full-resolution PNG saved as graphics-draw-string.png in workflow artifacts.

  • graphics-fill-arc — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-fill-arc
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-fill-arc.png in workflow artifacts.

  • graphics-fill-polygon — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-fill-polygon
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-fill-polygon.png in workflow artifacts.

  • graphics-fill-rect — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-fill-rect
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-fill-rect.png in workflow artifacts.

  • graphics-fill-round-rect — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-fill-round-rect
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-fill-round-rect.png in workflow artifacts.

  • graphics-fill-shape — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-fill-shape
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-fill-shape.png in workflow artifacts.

  • graphics-fill-triangle — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-fill-triangle
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-fill-triangle.png in workflow artifacts.

  • graphics-gaussian-blur — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-gaussian-blur
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-gaussian-blur.png in workflow artifacts.

  • graphics-inscribed-triangle-grid — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-inscribed-triangle-grid
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 590x1278.
    Full-resolution PNG saved as graphics-inscribed-triangle-grid.png in workflow artifacts.

  • graphics-large-stroke-dirty-clip — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-large-stroke-dirty-clip
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-large-stroke-dirty-clip.png in workflow artifacts.

  • graphics-rotate — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-rotate
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-rotate.png in workflow artifacts.

  • graphics-scale — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-scale
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-scale.png in workflow artifacts.

  • graphics-stroke-test — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-stroke-test
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-stroke-test.png in workflow artifacts.

  • graphics-tile-image — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-tile-image
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 413x895.
    Full-resolution PNG saved as graphics-tile-image.png in workflow artifacts.

  • graphics-transform-camera — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-transform-camera
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-transform-camera.png in workflow artifacts.

  • graphics-transform-perspective — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-transform-perspective
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-transform-perspective.png in workflow artifacts.

  • graphics-transform-rotation — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-transform-rotation
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-transform-rotation.png in workflow artifacts.

  • graphics-transform-translation — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    graphics-transform-translation
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as graphics-transform-translation.png in workflow artifacts.

  • ImageViewerNavigationModes — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ImageViewerNavigationModes
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as ImageViewerNavigationModes.png in workflow artifacts.

  • kotlin — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    kotlin
    Preview info: JPEG preview quality 40; JPEG preview quality 40; downscaled to 825x1789.
    Full-resolution PNG saved as kotlin.png in workflow artifacts.

  • landscape — updated screenshot. Screenshot differs (2556x1179 px, bit depth 8).

    landscape
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 1789x825.
    Full-resolution PNG saved as landscape.png in workflow artifacts.

  • LightweightPickerButtons_above_center — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    LightweightPickerButtons_above_center
    Preview info: JPEG preview quality 40; JPEG preview quality 40; downscaled to 825x1789.
    Full-resolution PNG saved as LightweightPickerButtons_above_center.png in workflow artifacts.

  • LightweightPickerButtons_below_right — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    LightweightPickerButtons_below_right
    Preview info: JPEG preview quality 40; JPEG preview quality 40; downscaled to 825x1789.
    Full-resolution PNG saved as LightweightPickerButtons_below_right.png in workflow artifacts.

  • LightweightPickerButtons_between_mixed — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    LightweightPickerButtons_between_mixed
    Preview info: JPEG preview quality 40; JPEG preview quality 40; downscaled to 825x1789.
    Full-resolution PNG saved as LightweightPickerButtons_between_mixed.png in workflow artifacts.

  • LightweightPickerButtons — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    LightweightPickerButtons
    Preview info: JPEG preview quality 40; JPEG preview quality 40; downscaled to 825x1789.
    Full-resolution PNG saved as LightweightPickerButtons.png in workflow artifacts.

  • ListTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ListTheme_dark
    Preview info: JPEG preview quality 60; JPEG preview quality 60; downscaled to 825x1789.
    Full-resolution PNG saved as ListTheme_dark.png in workflow artifacts.

  • ListTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ListTheme_light
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as ListTheme_light.png in workflow artifacts.

  • LottieAnimatedScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    LottieAnimatedScreenshotTest
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as LottieAnimatedScreenshotTest.png in workflow artifacts.

  • MainActivity — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    MainActivity
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as MainActivity.png in workflow artifacts.

  • MediaPlayback — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    MediaPlayback
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as MediaPlayback.png in workflow artifacts.

  • MorphTransitionScrolledSourceTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    MorphTransitionScrolledSourceTest
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as MorphTransitionScrolledSourceTest.png in workflow artifacts.

  • MorphTransitionSnapshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    MorphTransitionSnapshotTest
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as MorphTransitionSnapshotTest.png in workflow artifacts.

  • MorphTransitionTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    MorphTransitionTest
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as MorphTransitionTest.png in workflow artifacts.

  • MotionShowcaseScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    MotionShowcaseScreenshotTest
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as MotionShowcaseScreenshotTest.png in workflow artifacts.

  • MultiButtonTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    MultiButtonTheme_dark
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as MultiButtonTheme_dark.png in workflow artifacts.

  • MultiButtonTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    MultiButtonTheme_light
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as MultiButtonTheme_light.png in workflow artifacts.

  • PaletteOverrideTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    PaletteOverrideTheme_dark
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as PaletteOverrideTheme_dark.png in workflow artifacts.

  • PaletteOverrideTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    PaletteOverrideTheme_light
    Preview info: JPEG preview quality 40; JPEG preview quality 40; downscaled to 825x1789.
    Full-resolution PNG saved as PaletteOverrideTheme_light.png in workflow artifacts.

  • PickerTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    PickerTheme_dark
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as PickerTheme_dark.png in workflow artifacts.

  • PickerTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    PickerTheme_light
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as PickerTheme_light.png in workflow artifacts.

  • PullToRefreshSpinnerScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    PullToRefreshSpinnerScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as PullToRefreshSpinnerScreenshotTest.png in workflow artifacts.

  • Sheet — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    Sheet
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as Sheet.png in workflow artifacts.

  • SheetSlideUpAnimationScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SheetSlideUpAnimationScreenshotTest
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as SheetSlideUpAnimationScreenshotTest.png in workflow artifacts.

  • ShowcaseTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ShowcaseTheme_dark
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as ShowcaseTheme_dark.png in workflow artifacts.

  • ShowcaseTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ShowcaseTheme_light
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as ShowcaseTheme_light.png in workflow artifacts.

  • SlideFadeTitleTransitionTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SlideFadeTitleTransitionTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as SlideFadeTitleTransitionTest.png in workflow artifacts.

  • SlideHorizontalBackTransitionTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SlideHorizontalBackTransitionTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as SlideHorizontalBackTransitionTest.png in workflow artifacts.

  • SlideHorizontalTransitionTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SlideHorizontalTransitionTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as SlideHorizontalTransitionTest.png in workflow artifacts.

  • SlideVerticalTransitionTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SlideVerticalTransitionTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as SlideVerticalTransitionTest.png in workflow artifacts.

  • SmoothScrollScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SmoothScrollScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as SmoothScrollScreenshotTest.png in workflow artifacts.

  • SpanLabelTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SpanLabelTheme_dark
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as SpanLabelTheme_dark.png in workflow artifacts.

  • SpanLabelTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SpanLabelTheme_light
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as SpanLabelTheme_light.png in workflow artifacts.

  • StatusBarTapDiagnosticScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    StatusBarTapDiagnosticScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as StatusBarTapDiagnosticScreenshotTest.png in workflow artifacts.

  • StickyHeaderFadeTransitionScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    StickyHeaderFadeTransitionScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as StickyHeaderFadeTransitionScreenshotTest.png in workflow artifacts.

  • StickyHeaderScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    StickyHeaderScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as StickyHeaderScreenshotTest.png in workflow artifacts.

  • StickyHeaderSlideTransitionScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    StickyHeaderSlideTransitionScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as StickyHeaderSlideTransitionScreenshotTest.png in workflow artifacts.

  • SVGAnimatedScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SVGAnimatedScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as SVGAnimatedScreenshotTest.png in workflow artifacts.

  • SVGStatic — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SVGStatic
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as SVGStatic.png in workflow artifacts.

  • SwitchTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SwitchTheme_dark
    Preview info: JPEG preview quality 40; JPEG preview quality 40; downscaled to 825x1789.
    Full-resolution PNG saved as SwitchTheme_dark.png in workflow artifacts.

  • SwitchTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    SwitchTheme_light
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as SwitchTheme_light.png in workflow artifacts.

  • TabsAnimatedIndicatorScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    TabsAnimatedIndicatorScreenshotTest
    Preview info: JPEG preview quality 30; JPEG preview quality 30; downscaled to 825x1789.
    Full-resolution PNG saved as TabsAnimatedIndicatorScreenshotTest.png in workflow artifacts.

  • TabsBehavior — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    TabsBehavior
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as TabsBehavior.png in workflow artifacts.

  • TabsTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    TabsTheme_dark
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as TabsTheme_dark.png in workflow artifacts.

  • TabsTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    TabsTheme_light
    Preview info: JPEG preview quality 60; JPEG preview quality 60; downscaled to 825x1789.
    Full-resolution PNG saved as TabsTheme_light.png in workflow artifacts.

  • TensileBounceScreenshotTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    TensileBounceScreenshotTest
    Preview info: JPEG preview quality 10; JPEG preview quality 10; downscaled to 825x1789.
    Full-resolution PNG saved as TensileBounceScreenshotTest.png in workflow artifacts.

  • TextAreaAlignmentStates — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    TextAreaAlignmentStates
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as TextAreaAlignmentStates.png in workflow artifacts.

  • TextFieldTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    TextFieldTheme_dark
    Preview info: JPEG preview quality 50; JPEG preview quality 50; downscaled to 825x1789.
    Full-resolution PNG saved as TextFieldTheme_dark.png in workflow artifacts.

  • TextFieldTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    TextFieldTheme_light
    Preview info: JPEG preview quality 60; JPEG preview quality 60; downscaled to 825x1789.
    Full-resolution PNG saved as TextFieldTheme_light.png in workflow artifacts.

  • ToastBarTopPosition — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ToastBarTopPosition
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as ToastBarTopPosition.png in workflow artifacts.

  • ToolbarTheme_dark — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ToolbarTheme_dark
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as ToolbarTheme_dark.png in workflow artifacts.

  • ToolbarTheme_light — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ToolbarTheme_light
    Preview info: JPEG preview quality 70; JPEG preview quality 70; downscaled to 825x1789.
    Full-resolution PNG saved as ToolbarTheme_light.png in workflow artifacts.

  • UncoverHorizontalTransitionTest — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    UncoverHorizontalTransitionTest
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as UncoverHorizontalTransitionTest.png in workflow artifacts.

  • ValidatorLightweightPicker — updated screenshot. Screenshot differs (1179x2556 px, bit depth 8).

    ValidatorLightweightPicker
    Preview info: JPEG preview quality 20; JPEG preview quality 20; downscaled to 825x1789.
    Full-resolution PNG saved as ValidatorLightweightPicker.png in workflow artifacts.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 177 seconds

Build and Run Timing

Metric Duration
Simulator Boot 66000 ms
Simulator Boot (Run) 1000 ms
App Install 12000 ms
App Launch 7000 ms
Test Execution 233000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 52ms / native 3ms = 17.3x speedup
SIMD float-mul (64K x300) java 68ms / native 3ms = 22.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 468.000 ms
Base64 CN1 decode 240.000 ms
Base64 native encode 391.000 ms
Base64 encode ratio (CN1/native) 1.197x (19.7% slower)
Base64 native decode 271.000 ms
Base64 decode ratio (CN1/native) 0.886x (11.4% faster)
Base64 SIMD encode 70.000 ms
Base64 encode ratio (SIMD/CN1) 0.150x (85.0% faster)
Base64 SIMD decode 45.000 ms
Base64 decode ratio (SIMD/CN1) 0.188x (81.3% faster)
Base64 encode ratio (SIMD/native) 0.179x (82.1% faster)
Base64 decode ratio (SIMD/native) 0.166x (83.4% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 17.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.118x (88.2% faster)
Image applyMask (SIMD off) 52.000 ms
Image applyMask (SIMD on) 35.000 ms
Image applyMask ratio (SIMD on/off) 0.673x (32.7% faster)
Image modifyAlpha (SIMD off) 65.000 ms
Image modifyAlpha (SIMD on) 33.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.508x (49.2% faster)
Image modifyAlpha removeColor (SIMD off) 72.000 ms
Image modifyAlpha removeColor (SIMD on) 28.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.389x (61.1% faster)

@shai-almog

shai-almog commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 128 screenshots: 128 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 321 seconds

Build and Run Timing

Metric Duration
Simulator Boot 63000 ms
Simulator Boot (Run) 1000 ms
App Install 14000 ms
App Launch 16000 ms
Test Execution 243000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 54ms / native 3ms = 18.0x speedup
SIMD float-mul (64K x300) java 73ms / native 2ms = 36.5x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 449.000 ms
Base64 CN1 decode 202.000 ms
Base64 native encode 509.000 ms
Base64 encode ratio (CN1/native) 0.882x (11.8% faster)
Base64 native decode 224.000 ms
Base64 decode ratio (CN1/native) 0.902x (9.8% faster)
Base64 SIMD encode 59.000 ms
Base64 encode ratio (SIMD/CN1) 0.131x (86.9% faster)
Base64 SIMD decode 48.000 ms
Base64 decode ratio (SIMD/CN1) 0.238x (76.2% faster)
Base64 encode ratio (SIMD/native) 0.116x (88.4% faster)
Base64 decode ratio (SIMD/native) 0.214x (78.6% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 17.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.118x (88.2% faster)
Image applyMask (SIMD off) 47.000 ms
Image applyMask (SIMD on) 28.000 ms
Image applyMask ratio (SIMD on/off) 0.596x (40.4% faster)
Image modifyAlpha (SIMD off) 49.000 ms
Image modifyAlpha (SIMD on) 29.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.592x (40.8% faster)
Image modifyAlpha removeColor (SIMD off) 52.000 ms
Image modifyAlpha removeColor (SIMD on) 29.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.558x (44.2% faster)

shai-almog and others added 3 commits June 20, 2026 07:07
Brings the HelloCodenameOneTV target much closer to compiling against the
tvOS 26 simulator SDK (verified locally). Guarded/handled:

- IOSNative.m: broadened the watch guards to also cover tvOS for the native
  features tvOS lacks (CLLocation region monitoring, MPMoviePlayer, UIPasteboard,
  orientation, status bar, telephony) — 144 errors -> 0. (Compile-first measure;
  re-enabling tvOS-capable features like UITextField/audio is a follow-up, see
  TVOS_PORT.md.)
- CodenameOne_GLAppDelegate.m: guard UNNotificationResponse /
  UNTextInputNotificationResponse and the legacy openURL delegate (tvOS-absent);
  hold currentNotificationResponse as id.
- NetworkConnectionImpl.m: guard setNetworkActivityIndicatorVisible (tvOS-removed).
- UIWebViewEventDelegate.[hm]: drop the legacy UIWebView browser peer on tvOS.
- DrawStringTextureCache.m: use sizeWithAttributes: on tvOS (sizeWithFont: removed).
- CodenameOne_GLViewController.m: tvOS trusts view bounds for orientation (like
  Mac Catalyst).
- sample LocalNotificationNativeImpl.m: no-op the delivered-notification calls on tvOS.

TVOS_PORT.md documents the remaining CodenameOne_GLViewController.m surgical
guards (~63 sites incl. the UIPopoverController->id change) and the exact local
build recipe (arm64, preserve the CN1_USE_METAL define, -ferror-limit=0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- CodenameOne_GLViewController.m now COMPILES for tvOS: ~63 surgical
  #if !TARGET_OS_TV guards (device orientation, status bar, UIToolbar keyboard
  input-accessory, on-screen keyboard notifications, UIHoverGestureRecognizer,
  the UIImagePicker/UIDatePicker/UIPickerView/UIActionSheet/UIDocumentInteraction
  delegate methods), legacy sizeWithFont:/drawAtPoint:withFont: -> the modern
  sizeWithAttributes:/withAttributes: API, and UIPopoverController -> id.

- IOSNative.m: reverted the earlier blanket watch-guard broadening (it was wrong:
  tvOS supports most of what watchOS lacks - CIFilter, vImage, UIView capture,
  audio, UNUserNotificationCenter). Correct model is tvOS≈iOS, guarding only the
  genuinely tvOS-absent APIs. Remaining IOSNative.m surgical work is ~6 localized
  features (UIWebView, MPMoviePlayer*, UIPasteboard, orientation,
  UIDocumentInteractionController, scrollsToTop) + LAContext + push actions,
  documented in TVOS_PORT.md.

Both files are structurally valid (balanced #if/#endif) and compile unchanged
for iOS. Verified against the tvOS 26 simulator SDK locally.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Regression fixes (my tvOS changes broke the existing iOS/Mac builds):
- UIPopoverController -> id was applied unconditionally, breaking iOS/Mac where
  popoverController.delegate needs the real type. Now conditional: id only on
  tvOS (where UIPopoverController is unavailable), UIPopoverController* elsewhere
  (IOSNative.m + CodenameOne_GLViewController.m).
- sizeWithFont:/drawAtPoint:withFont: were modernized to the attributed-string
  API on ALL platforms, changing existing iOS rendering. Restored: iOS keeps the
  original sizeWithFont:/withFont:; only the tvOS slice (where they were removed)
  uses sizeWithAttributes:/withAttributes:.

iOS target verified building clean against the iphonesimulator SDK; tvOS
GLViewController.m still compiles; the iOS API paths are byte-for-byte unchanged.

Developer-guide prose gate:
- TVPlatforms.asciidoc: 320x180 -> 320×180 (Vale proselint typography).
- Add "Leanback" (Android's android.software.leanback / LEANBACK_LAUNCHER proper
  noun) to languagetool-accept.txt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@shai-almog shai-almog closed this Jun 20, 2026
@shai-almog shai-almog reopened this Jun 20, 2026
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.

1 participant