Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
40dbb62
Improvements driven by the Immich Flutter port comparison
shai-almog May 27, 2026
e3a3256
Address review feedback: WebSocketImpl factory + CLDC11 stub bodies
shai-almog May 27, 2026
e78d8a0
Fix CI gates: SpotBugs nulls, Vale US-English, asciidoc parse errors
shai-almog May 27, 2026
6f4e8e5
Fix CI: PMD (drop FQN) + LanguageTool accept-list additions
shai-almog May 27, 2026
330bded
Fix PMD FQN violations, doc gate typo, and add Android screenshot bas…
shai-almog May 27, 2026
318ffa6
PMD OneDeclarationPerLine + LanguageTool tweens fix
shai-almog May 27, 2026
374abde
PMD ControlStatementBraces fix in JSONWriter.unwrap
shai-almog May 27, 2026
985a700
PMD ControlStatementBraces: brace inline bodies in JSONWriter
shai-almog May 27, 2026
c2b2582
PMD ControlStatementBraces: brace MorphTransition.paintMorph skip check
shai-almog May 27, 2026
6c23af3
PMD ControlStatementBraces: brace inline returns in DefaultLookAndFeel
shai-almog May 27, 2026
377e3da
PMD UnusedFormalParameter: drop unused host arg from modernSpinnerRep…
shai-almog May 27, 2026
42de94f
Checkstyle LeftCurly: expand JSONWriter one-line method bodies
shai-almog May 28, 2026
c37c76c
Add MorphTransition iOS goldens (regular + metal)
shai-almog May 28, 2026
e16f469
Merge remote-tracking branch 'origin/master' into improvements-from-i…
shai-almog May 28, 2026
00538ad
Reuse build-port cache key in input-validation (avoid hash divergence)
shai-almog May 28, 2026
f7cc3e7
Revert WebSocket-in-core: no port has a native impl yet
shai-almog May 28, 2026
382135f
Drop Flutter refs; AnimationTime for spinner; new Tabs/Pull-to-refres…
shai-almog May 28, 2026
ecf3068
OpenAPI redesign phase 1: drop old codegen, add new annotation surface
shai-almog May 28, 2026
d1358bc
OpenAPI redesign phase 4: Java records support for @Mapped
shai-almog May 28, 2026
5307354
OpenAPI redesign phases 2 + 3: REST-client processor + generate-opena…
shai-almog May 28, 2026
c9db66c
Docs gate: fix appendix table syntax + Vale/LanguageTool nits
shai-almog May 28, 2026
558a6f9
SpotBugs: collapse duplicate switch arms in MappingAnnotationProcesso…
shai-almog May 28, 2026
46bc069
Wire TabsAnimatedIndicator + PullToRefreshSpinner into the device runner
shai-almog May 28, 2026
36e856d
SpotBugs: drop dead ternary + unused sign tracker in splitTopLevelArgs
shai-almog May 28, 2026
a496580
@Cookie binding: emit + process cookie parameters end-to-end
shai-almog May 28, 2026
21bb756
JavaBeans accessor support for @Mapped POJOs
shai-almog May 28, 2026
e6ae3c5
PullToRefreshSpinnerScreenshotTest: install modern theme flag
shai-almog May 28, 2026
80cdffd
CI: switch JDK distribution from Zulu to Temurin
shai-almog May 28, 2026
6af952c
Add TabsAnimatedIndicator + PullToRefreshSpinner goldens
shai-almog May 28, 2026
7227bec
Modern pull-to-refresh: Material-spec white disc + drop shadow
shai-almog May 29, 2026
2a10f3a
PullToRefresh goldens: re-capture with disc backdrop + single paint
shai-almog May 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .github/workflows/input-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -127,14 +127,20 @@ jobs:
restore-keys: |
cn1-binaries-${{ runner.os }}-

# Use the exact key build-port saved against (published as a job
# output). Recomputing the src_hash on this runner has been
# observed to produce a different value than build-port on the
# same SHA -- and even when the algorithm is identical, any new
# source path added to the hash here has to land in three
# places at once or the keys diverge.
- name: Restore built CN1 + iOS port artifacts
uses: actions/cache/restore@v4
with:
path: |
~/.m2/repository/com/codenameone
Themes
Ports/iOSPort/nativeSources
key: cn1-built-${{ runner.os }}-${{ steps.src_hash.outputs.hash }}
key: ${{ needs.build-port.outputs.cn1_built_cache_key }}
fail-on-cache-miss: true

- name: Install XcodeGen
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/parparvm-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ jobs:
- name: Set up JDK 25
uses: actions/setup-java@v4
with:
distribution: 'zulu'
distribution: 'temurin'
java-version: '25'
- name: Save JDK 25 Path
run: echo "JDK_25_HOME=$JAVA_HOME" >> $GITHUB_ENV
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/scripts-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ jobs:
uses: actions/setup-java@v4
with:
java-version: ${{ matrix.java_version }}
distribution: 'zulu'
distribution: 'temurin'
- name: Set JDK_HOME
if: matrix.id != 'default'
run: echo "JDK_HOME=${JAVA_HOME}" >> $GITHUB_ENV
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/scripts-javascript.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ jobs:
- name: Set up Java 8 for ParparVM
uses: actions/setup-java@v4
with:
distribution: 'zulu'
distribution: 'temurin'
java-version: '8'
cache: 'maven'

Expand All @@ -102,7 +102,7 @@ jobs:
- name: Set up Java 17
uses: actions/setup-java@v4
with:
distribution: 'zulu'
distribution: 'temurin'
java-version: '17'
cache: 'maven'

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/scripts-javase.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'zulu'
distribution: 'temurin'

- name: Set TMPDIR
run: echo "TMPDIR=${{ runner.temp }}" >> "$GITHUB_ENV"
Expand Down
18 changes: 18 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/Body.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// Marks an interface method parameter as the request body. The
/// processor serialises the argument via `Mappers.toJson(...)` and
/// attaches it with `Content-Type: application/json`. At most one
/// `@Body`-annotated parameter is allowed per method.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.PARAMETER)
public @interface Body {
}
19 changes: 19 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/Cookie.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// Binds an interface method parameter to a `Cookie` request-header
/// entry. Multiple `@Cookie`-annotated parameters on the same method
/// are joined into a single `Cookie: a=1; b=2` header. `null`
/// arguments are skipped; values are URL-encoded.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.PARAMETER)
public @interface Cookie {
String value();
}
16 changes: 16 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/DELETE.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// HTTP `DELETE` request. See [GET] for path semantics.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface DELETE {
String value();
}
19 changes: 19 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/GET.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// HTTP `GET` request. The value is the URL path relative to the
/// `baseUrl` passed to `<Tag>Api.of(baseUrl)`. Path placeholders such
/// as `/pet/{petId}` are substituted from method parameters annotated
/// with [Path].
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface GET {
String value();
}
19 changes: 19 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/Header.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// Binds an interface method parameter to an HTTP request header.
/// `null` argument values skip the header. `Authorization` is the
/// usual carrier for the bearer token argument emitted by
/// `cn1:generate-openapi`.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.PARAMETER)
public @interface Header {
String value();
}
16 changes: 16 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/PATCH.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// HTTP `PATCH` request. See [GET] for path semantics.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface PATCH {
String value();
}
16 changes: 16 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/POST.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// HTTP `POST` request. See [GET] for path semantics.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface POST {
String value();
}
16 changes: 16 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/PUT.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// HTTP `PUT` request. See [GET] for path semantics.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface PUT {
String value();
}
18 changes: 18 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/Path.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// Binds an interface method parameter to a `{name}` placeholder in
/// the URL path declared on the verb annotation. The parameter value
/// is URL-encoded before substitution.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.PARAMETER)
public @interface Path {
String value();
}
18 changes: 18 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/Query.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// Binds an interface method parameter to a URL query-string entry.
/// `null` arguments are skipped; collections are appended as repeated
/// `name=value` pairs.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.PARAMETER)
public @interface Query {
String value();
}
31 changes: 31 additions & 0 deletions CodenameOne/src/com/codename1/annotations/rest/RestClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*/
package com.codename1.annotations.rest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/// Marks an interface as a REST client that the build-time
/// annotation processor wires up to a generated network implementation.
/// Companion HTTP-verb annotations ([GET], [POST], [PUT], [DELETE],
/// [PATCH]) on each method carry the path; parameter annotations
/// ([Path], [Query], [Header], [Body]) describe how each argument is
/// attached to the request.
///
/// The processor emits a `<Tag>ApiImpl` class in generated-sources and
/// registers it with [com.codename1.io.rest.RestClients] so the
/// interface's `static T of(String baseUrl)` factory can return an
/// instance without the project source referencing the impl directly.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface RestClient {
}
Loading
Loading