Add deep cross-platform calendar integration#5413
Conversation
|
Compared 146 screenshots: 146 matched. Benchmark ResultsDetailed Performance Metrics
|
|
Compared 146 screenshots: 146 matched. Benchmark ResultsDetailed Performance Metrics
|
Cloudflare Preview
|
|
Compared 151 screenshots: 151 matched. Native Android coverage
✅ Native Android screenshot tests passed. Native Android coverage
Benchmark ResultsDetailed Performance Metrics
|
|
Compared 181 screenshots: 181 matched. |
|
Compared 146 screenshots: 146 matched. Benchmark ResultsDetailed Performance Metrics
|
|
Compared 147 screenshots: 147 matched. |
|
Compared 147 screenshots: 147 matched. |
|
Compared 12 screenshots: 12 matched. |
|
Developer Guide build artifacts are available for download from this workflow run:
Developer Guide quality checks: |
|
Compared 148 screenshots: 148 matched. Benchmark Results
Detailed Performance Metrics
|
|
Compared 149 screenshots: 149 matched. Benchmark Results
Build and Run Timing
Detailed Performance Metrics
|
|
Compared 144 screenshots: 144 matched. |
|
Compared 217 screenshots: 217 matched. |
✅ Continuous Quality ReportTest & Coverage
Static Analysis
Generated automatically by the PR CI workflow. |
There was a problem hiding this comment.
Pull request overview
This PR introduces a new com.codename1.calendar package to provide a capability-based, cross-platform calendar abstraction (local device calendars plus app-owned online providers), including portable RFC 5545 import/export, change notifications (pull-based + local listeners), and an opt-in offline mutation queue with explicit conflict handling.
Changes:
- Adds core calendar domain model, capabilities/authorization contract, provider HTTP/auth scaffolding, and offline sync/cache primitives under
CodenameOne/src/com/codename1/calendar/. - Implements local calendar sources for Android (Calendar Provider), iOS/Mac Catalyst (EventKit), and a deterministic simulator-only in-memory JavaSE source; wires these into ports via
getLocalCalendarSource(). - Adds tests (core unit tests + HelloCodenameOne CN1SS smoke) and updates builders/docs for required permissions, privacy strings, and restricted capabilities.
Reviewed changes
Copilot reviewed 85 out of 85 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| scripts/hellocodenameone/conformance/test_port_status.py | Updates conformance expectations and registers the new calendar feature/test. |
| scripts/hellocodenameone/common/src/main/kotlin/com/codenameone/examples/hellocodenameone/HelloCodenameOne.kt | Adds license header (and aligns file with project header conventions). |
| scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/Cn1ssDeviceRunner.java | Registers the new CN1SS CalendarApiTest in the device runner suite. |
| scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/CalendarApiTest.java | Adds a portable calendar API smoke test for CN1SS. |
| Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java | Exposes a simulator-only LocalCalendarSource implementation for JavaSE. |
| Ports/JavaSE/src/com/codename1/impl/javase/JavaSECalendarSource.java | Adds deterministic in-memory local calendar source for the simulator. |
| Ports/iOSPort/src/com/codename1/impl/ios/IOSNative.java | Adds native method surface for EventKit-backed calendar operations. |
| Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java | Wires iOS LocalCalendarSource into the port implementation. |
| Ports/iOSPort/src/com/codename1/impl/ios/IOSCalendarSource.java | Implements EventKit-backed local calendar source (events + reminders). |
| Ports/iOSPort/nativeSources/IOSNative.m | Implements EventKit bridge and build-flag gating for calendar natives. |
| Ports/CLDC11/src/java/time/format/DateTimeFormatter.java | Adjusts parsing paths to use existing ISO formatter parse methods. |
| Ports/CLDC11/src/java/time/Duration.java | Adds Duration.parse() support needed by calendar/time handling. |
| Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java | Wires Android LocalCalendarSource into the port implementation. |
| Ports/Android/src/com/codename1/impl/android/AndroidCalendarSource.java | Implements Android Calendar Provider local source (events + details). |
| maven/core-unittests/src/test/java/com/codename1/calendar/CalendarIntegrationTest.java | Adds unit coverage for model codecs, iCalendar round-trips, providers, and sync engine. |
| maven/core-unittests/spotbugs-exclude.xml | Adds SpotBugs excludes for calendar package callback patterns. |
| maven/codenameone-maven-plugin/src/test/java/com/codename1/builders/WindowsNativeBuilderArchTest.java | Adds test enforcing explicit opt-in for Windows restricted calendar capability. |
| maven/codenameone-maven-plugin/src/test/java/com/codename1/builders/MacNativeBuilderEntitlementsTest.java | Adds test ensuring macOS calendar entitlement is emitted when privacy hints are present. |
| maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/WindowsNativeBuilder.java | Adds explicit opt-in for MSIX restricted appointments capability. |
| maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/MacNativeBuilder.java | Adds macOS sandbox calendar entitlement emission driven by privacy hints/entitlement override. |
| maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java | Detects calendar usage, injects iOS privacy strings, and enables EventKit native compilation. |
| maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java | Auto-adds Android calendar permissions when LocalCalendarSource is referenced. |
| docs/website/data/port_status.json | Registers the new “calendar-integration” feature for port status reporting. |
| docs/website/data/port_status_reports/windows-x64.json | Adds CalendarApiTest status entry to the Windows x64 report. |
| docs/website/data/port_status_reports/windows-arm64.json | Adds CalendarApiTest status entry to the Windows arm64 report. |
| docs/website/data/port_status_reports/watchos.json | Adds CalendarApiTest status entry to the watchOS report. |
| docs/website/data/port_status_reports/tvos.json | Adds CalendarApiTest status entry to the tvOS report. |
| docs/website/data/port_status_reports/mac-native.json | Adds CalendarApiTest status entry to the mac-native report. |
| docs/website/data/port_status_reports/linux-x64.json | Adds CalendarApiTest status entry to the Linux x64 report. |
| docs/website/data/port_status_reports/linux-arm64.json | Adds CalendarApiTest status entry to the Linux arm64 report. |
| docs/website/data/port_status_reports/javascript.json | Adds CalendarApiTest status entry to the JavaScript report. |
| docs/website/data/port_status_reports/ios-metal.json | Adds CalendarApiTest status entry to the iOS Metal report. |
| docs/website/data/port_status_reports/ios-gl.json | Adds CalendarApiTest status entry to the iOS GL report. |
| docs/website/data/port_status_reports/android.json | Adds CalendarApiTest status entry to the Android report. |
| docs/developer-guide/developer-guide.asciidoc | Adds the new Calendar Integration chapter to the developer guide TOC. |
| docs/developer-guide/Calendar-Integration.asciidoc | Documents the calendar API contract, platform coverage, permissions, and offline sync model. |
| docs/demos/common/src/main/java/com/codenameone/developerguide/calendar/CalendarIntegrationSnippets.java | Adds includable code snippets for the developer guide. |
| CodenameOne/src/com/codename1/ui/Display.java | Exposes getLocalCalendarSource() as a port delegation surface. |
| CodenameOne/src/com/codename1/impl/CodenameOneImplementation.java | Adds getLocalCalendarSource() port hook (default null). |
| CodenameOne/src/com/codename1/calendar/package-info.java | Adds package-level overview for the new calendar API. |
| CodenameOne/src/com/codename1/calendar/CalendarAccess.java | Defines authorization access levels (events read/write/full, tasks full). |
| CodenameOne/src/com/codename1/calendar/CalendarAuthorizationStatus.java | Defines authorization states (denied/write-only/full/etc.). |
| CodenameOne/src/com/codename1/calendar/CalendarAuthToken.java | Defines bearer token + expiry helpers for providers. |
| CodenameOne/src/com/codename1/calendar/CalendarTokenProvider.java | Defines app-owned token provider contract. |
| CodenameOne/src/com/codename1/calendar/CalendarHttpRequest.java | Defines provider request envelope for injected transports. |
| CodenameOne/src/com/codename1/calendar/CalendarHttpResponse.java | Defines provider response envelope + headers. |
| CodenameOne/src/com/codename1/calendar/CalendarHttpTransport.java | Defines transport interface for provider IO. |
| CodenameOne/src/com/codename1/calendar/DefaultCalendarHttpTransport.java | Implements transport using CN1 ConnectionRequest/NetworkManager. |
| CodenameOne/src/com/codename1/calendar/OidcCalendarTokenProvider.java | Adapts OidcClient/OidcTokens into CalendarTokenProvider. |
| CodenameOne/src/com/codename1/calendar/OAuthCalendarSource.java | Adds shared OAuth/HTTP behavior including 401 refresh retry logic. |
| CodenameOne/src/com/codename1/calendar/CalendarError.java | Adds portable calendar error categories. |
| CodenameOne/src/com/codename1/calendar/CalendarException.java | Adds typed exception carrying CalendarError and optional response code. |
| CodenameOne/src/com/codename1/calendar/CalendarCapability.java | Defines granular capability flags for sources/collections. |
| CodenameOne/src/com/codename1/calendar/CalendarCapabilities.java | Immutable capability set wrapper. |
| CodenameOne/src/com/codename1/calendar/CalendarMutationScope.java | Defines recurring mutation scopes (this instance/future/all). |
| CodenameOne/src/com/codename1/calendar/CalendarChangeListener.java | Defines listener contract for local change events. |
| CodenameOne/src/com/codename1/calendar/CalendarChange.java | Defines portable change payload (entity + change type + ids). |
| CodenameOne/src/com/codename1/calendar/CalendarPage.java | Defines page envelope (items + next token + sync token). |
| CodenameOne/src/com/codename1/calendar/CalendarQuery.java | Defines portable query parameters (range, tokens, paging, etc.). |
| CodenameOne/src/com/codename1/calendar/CalendarDateTime.java | Defines “timed vs all-day” date/time wrapper using java.time. |
| CodenameOne/src/com/codename1/calendar/CalendarDateUtil.java | Adds helper parsing/formatting utilities for portable date handling. |
| CodenameOne/src/com/codename1/calendar/FreeBusyInterval.java | Adds busy-interval model. |
| CodenameOne/src/com/codename1/calendar/CalendarAlarm.java | Adds alarm model (relative duration or absolute instant). |
| CodenameOne/src/com/codename1/calendar/CalendarAttendee.java | Adds attendee model with role/response semantics. |
| CodenameOne/src/com/codename1/calendar/CalendarAttachment.java | Adds attachment model for provider integrations. |
| CodenameOne/src/com/codename1/calendar/CalendarConference.java | Adds conferencing metadata model. |
| CodenameOne/src/com/codename1/calendar/CalendarRecurrenceRule.java | Adds portable recurrence rule model. |
| CodenameOne/src/com/codename1/calendar/CalendarInfo.java | Adds calendar/task-list collection model. |
| CodenameOne/src/com/codename1/calendar/CalendarEvent.java | Adds portable calendar event model. |
| CodenameOne/src/com/codename1/calendar/CalendarTask.java | Adds portable task/reminder model. |
| CodenameOne/src/com/codename1/calendar/CalendarModelCodec.java | Adds lossless map encoding/decoding for caching/fixtures. |
| CodenameOne/src/com/codename1/calendar/CalendarConflict.java | Adds conflict model for offline sync resolution. |
| CodenameOne/src/com/codename1/calendar/CalendarSyncResult.java | Adds sync result model (applied/remaining/conflicts). |
| CodenameOne/src/com/codename1/calendar/CalendarCache.java | Adds persistence seam for offline sync state. |
| CodenameOne/src/com/codename1/calendar/MemoryCalendarCache.java | Adds in-memory CalendarCache implementation. |
| CodenameOne/src/com/codename1/calendar/StorageCalendarCache.java | Adds Storage-backed persistent CalendarCache implementation. |
| CodenameOne/src/com/codename1/calendar/CalendarSyncEngine.java | Adds opt-in offline mutation queue with conflict pausing/resolution. |
| CodenameOne/src/com/codename1/calendar/CalendarSource.java | Adds base source contract and EDT-dispatching change notifications. |
| CodenameOne/src/com/codename1/calendar/LocalCalendarSource.java | Adds standard “device local” source entry point with fallback behavior. |
| CodenameOne/src/com/codename1/calendar/CalendarManager.java | Adds registry/entry point for local + app-registered provider sources. |
| CodenameOne/src/com/codename1/calendar/CalDavAuthentication.java | Adds CalDAV auth strategies (Basic/Bearer/Digest). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
✅ ByteCodeTranslator Quality ReportTest & Coverage
Benchmark Results
Static Analysis
Generated automatically by the PR CI workflow. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 90 out of 90 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
Ports/iOSPort/nativeSources/IOSNative.m:102
- The preprocessor guard for importing MFMailComposeViewController is now tied to CN1_USE_CALENDAR, but the surrounding comment (and the rest of the file) indicates MessageUI availability should only depend on watchOS/tvOS. This looks like an accidental coupling to the calendar feature flag and makes the condition inconsistent with the MFMessageComposeViewController import below.
| private static DateTimeException invalidDuration(String value) { | ||
| return new DateTimeException("Invalid duration: " + value); | ||
| } |
| private static DateTimeException invalidDuration(String value) { | ||
| return new DateTimeException("Invalid duration: " + value); | ||
| } |
| for (CalendarEvent e : events.values()) { | ||
| if (query != null && query.getCalendarId() != null && !query.getCalendarId().equals(e.getCalendarId())) continue; | ||
| if (query != null && query.getStartTime() != null && e.getEnd() != null && !e.getEnd().isAllDay() | ||
| && e.getEnd().getDateTime().toInstant().compareTo(query.getStartTime()) < 0) continue; | ||
| if (query != null && query.getEndTime() != null && e.getStart() != null && !e.getStart().isAllDay() | ||
| && e.getStart().getDateTime().toInstant().compareTo(query.getEndTime()) > 0) continue; | ||
| out.add(e); | ||
| } |
| String message = "Calendar provider returned HTTP " + code; | ||
| if (response.getBody() != null && response.getBody().length() > 0) { | ||
| message += ": " + response.getBody(); | ||
| } |

Summary
Notification contract
The cross-platform guarantee is local change listeners plus provider delta/sync tokens. Listeners run on the Codename One EDT,
RESETrequests a re-query, and the API does not promise or register provider webhooks.Developer impact
Applications can detect granular capabilities instead of branching on platform names. Online providers work across ports without adding device-calendar permissions. OAuth credentials and persistence remain application-owned.
Validation
CalendarIntegrationTest: 7 passedMacNativeBuilderEntitlementsTestandWindowsNativeBuilderArchTest: 10 passedThe full Java 8 core suite reached 158 passing tests before the macOS VM aborted in the unrelated
RoundBorderGradientStrokeResourceTest; there were no assertion failures before the VM abort.Companion builder PR
https://github.com/codenameone/BuildDaemon/pull/153