Latest posts from Codename One.
Blog

Android 17 Without the Last-Minute Scramble
One of the bugs in our Android 17 preparation was a version number. The platform was 37.2. One builder path removed the punctuation and read it as 372. That number sailed through minimum-version checks. A different path tried to parse the suffix as an integer and failed outright. Neither had anything to do with the application a customer was trying to build. This is the work we want to do before a target-SDK deadline arrives. The API 37 changes check the new platform and fix its path through the builder. The location button then exercises a new permission flow in a generated application. Along the way, PEM parsing and task removal take two more recurring pieces of security code out of individual apps. ...

Javadoc That Feels Like Your Website
Follow a link from the developer guide into an API method and you used to arrive in what felt like another website. The navigation changed. The styling changed. Dark mode made the join harder to hide. We had wrapped standard Javadoc output, scoped its CSS, and loaded its pages through JavaScript. Every improvement to the surrounding site left us with another detail to reconcile inside that wrapper. ...

Native Drag and Drop Meets Cross-Device Continuity
You are halfway through a draft on your phone when you sit down at your computer. The words are already written. The document is already open. Starting again should not be the price of changing screens. Finishing the draft raises another familiar task: getting its output into another application. Copy and paste can help, but dragging the document onto its destination is often the action you reach for first. ...

Faster Starts, Less JavaScript Overhead
A margin calculation is an odd place to find a startup stall. It sounds like arithmetic. In our native Mac profile, it could wait for the operating system’s main thread. Following that call led to screen-scale queries repeated across components, a theme scan repeated across styles, and a switch generating blurred artwork just to say how big it was. None of those costs required a complicated screen. They happened while constructing an ordinary one. ...

Faster Maps: Chasing Swiss Speed
After looking at Go’s collector, we turned to its maps. Swiss tables have an appealing premise: keep entries compact, use a small amount of metadata to narrow the search, and avoid chasing a separate object for every mapping. ParparVM already had compact arrays and separate metadata. We were starting closer than I expected. Then a missing key spoiled the picture. Three million containsKey calls took 32.7 seconds, while the benchmark we usually watched still looked healthy. It mostly asked for keys that existed. ...

What Go Taught Us About Java Garbage Collection
As Java developers, we take a lot of inspiration from HotSpot. It is the gold standard for many of us, and for good reason. But measuring ParparVM against Go recently sent me down a different path. My first thought was stack allocation. If Go was keeping more objects off the heap, that would explain a lot: fewer allocations, fewer pointers to follow, less work for the collector. It is the same attraction that makes Valhalla’s value objects so interesting to Java developers. Why pay for a separate object when what you need is a value? ...

Lies, Damn Lies and Benchmarks
There’s an old joke about three kinds of lies: lies, damn lies, and benchmarks. Codename One did very well in our benchmarks. But were they accurate? Were they representative? Performance is the fitted sheet of programming. Just when you get the damn corner into place, the rest of the bed is a complete mess. This week we made a concentrated effort to get a few more corners into place, and got a lot done. There’s still work ahead that we’ll discuss next week, but it’s getting to a point where I feel confident saying Codename One is pretty fast. Not the best (yet), but fast. ...

Pick One Contact Without Asking for the Address Book
A share screen needs one phone number. A delivery form needs one address. Neither feature needs a database of everybody the user knows. PR #5680 adds ContactPicker, a permission-free path that returns only the contacts and fields the user selects. It uses the Android 17 system Contact Picker, a narrow fallback on older Android versions, and Apple’s CNContactPickerViewController on iOS. For VoIP, VPN, native Mac and Windows work, OTP, billing, and the platform-watch process that found this gap, read the weekly overview. ...

We Stopped Waiting for Platform Changes to Find Us
For years, our warning system for Apple and Google changes was a developer whose build failed first. The community gave us excellent reports, but the sequence was backwards. A platform owner announced a deadline, time passed, an application hit the change, and only then did we trace it into the builder. This week we started a daily scheduled Codex task that reads official notices and checks them against Codename One. Its first useful results include Android 16 back handling in PR #5673 and the permission-safe Contact Picker in PR #5680. ...

Fill an SMS Verification Code Without Reading the Inbox
A six-digit text field should not need access to every message on a phone. PR #5642 adds one-time-code autofill, a country-aware phone-number field, and a complete verification component. iOS, Android, and the browser can offer the code through their protected autofill path. The application never receives the rest of the inbox. For the rest of this release, including native call management, VPN, AppKit, windows, and contacts, read the weekly overview. ...

A Mac App, Not an iOS App on a Mac
Mac Catalyst runs an iPad application on macOS. That was a useful bridge for Codename One, but it remained a bridge. Once we added multiple desktop windows, the missing desktop operations and rendering compromises stopped being edge cases. PR #5601 changes the default native Mac build to AppKit. The result is an NSApplication with NSWindow, NSMenu, NSTextInputClient, NSScreen, and a CAMetalLayer for each rendered window. It is a Mac application rather than an iOS application asking macOS to translate the experience. ...

A Dialog Can Now Be a Native Desktop Window
Last week’s native-window release could open an editor, inspector, and tool palette as separate operating-system windows. Then an ordinary Dialog.show() inside the inspector looked for the current Form and appeared on the wrong surface. That bug exposed every component that treated “top level” and “form” as synonyms. PR #5624 fixes those assumptions and adds something more visible: a Dialog can now become a real modal desktop window. ...