From 76ec51f075d1e4cadf8af1318b16db2c2f1e1fc4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 8 Jun 2026 18:19:14 +0000 Subject: [PATCH 1/3] Initial plan From 067cf63d720bd352a291d30f4666ef1cf2e4ecc3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 8 Jun 2026 18:36:13 +0000 Subject: [PATCH 2/3] Fix Health Connect records not assignable to IRecord Co-authored-by: jonathanpeppers <840039+jonathanpeppers@users.noreply.github.com> --- config.json | 2 +- .../connect-client/PublicAPI/PublicAPI.Unshipped.txt | 9 +++++++++ .../connect-client/Transforms/Metadata.xml | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/config.json b/config.json index 9dfecfcc6..51b35d224 100644 --- a/config.json +++ b/config.json @@ -1068,7 +1068,7 @@ "groupId": "androidx.health.connect", "artifactId": "connect-client", "version": "1.1.0", - "nugetVersion": "1.1.0.2", + "nugetVersion": "1.1.0.3", "nugetId": "Xamarin.AndroidX.Health.Connect.ConnectClient" }, { diff --git a/source/androidx.health.connect/connect-client/PublicAPI/PublicAPI.Unshipped.txt b/source/androidx.health.connect/connect-client/PublicAPI/PublicAPI.Unshipped.txt index 04cccc6d9..3a1b38043 100644 --- a/source/androidx.health.connect/connect-client/PublicAPI/PublicAPI.Unshipped.txt +++ b/source/androidx.health.connect/connect-client/PublicAPI/PublicAPI.Unshipped.txt @@ -489,9 +489,18 @@ AndroidX.Health.Connect.Client.Records.HydrationRecord.StartTime.get -> Java.Tim AndroidX.Health.Connect.Client.Records.HydrationRecord.StartZoneOffset.get -> Java.Time.ZoneOffset? AndroidX.Health.Connect.Client.Records.HydrationRecord.Volume.get -> AndroidX.Health.Connect.Client.Units.Volume! AndroidX.Health.Connect.Client.Records.IBodyTemperatureMeasurementLocations +AndroidX.Health.Connect.Client.Records.IInstantaneousRecord +AndroidX.Health.Connect.Client.Records.IInstantaneousRecord.Time.get -> Java.Time.Instant! +AndroidX.Health.Connect.Client.Records.IInstantaneousRecord.ZoneOffset.get -> Java.Time.ZoneOffset? +AndroidX.Health.Connect.Client.Records.IIntervalRecord +AndroidX.Health.Connect.Client.Records.IIntervalRecord.EndTime.get -> Java.Time.Instant! +AndroidX.Health.Connect.Client.Records.IIntervalRecord.EndZoneOffset.get -> Java.Time.ZoneOffset? +AndroidX.Health.Connect.Client.Records.IIntervalRecord.StartTime.get -> Java.Time.Instant! +AndroidX.Health.Connect.Client.Records.IIntervalRecord.StartZoneOffset.get -> Java.Time.ZoneOffset? AndroidX.Health.Connect.Client.Records.IMealTypes AndroidX.Health.Connect.Client.Records.IRecord AndroidX.Health.Connect.Client.Records.IRecord.Metadata.get -> AndroidX.Health.Connect.Client.Records.Metadata.Metadata! +AndroidX.Health.Connect.Client.Records.ISeriesRecord AndroidX.Health.Connect.Client.Records.IntermenstrualBleedingRecord AndroidX.Health.Connect.Client.Records.IntermenstrualBleedingRecord.IntermenstrualBleedingRecord(Java.Time.Instant! time, Java.Time.ZoneOffset? zoneOffset, AndroidX.Health.Connect.Client.Records.Metadata.Metadata! metadata) -> void AndroidX.Health.Connect.Client.Records.IntermenstrualBleedingRecord.Metadata.get -> AndroidX.Health.Connect.Client.Records.Metadata.Metadata! diff --git a/source/androidx.health.connect/connect-client/Transforms/Metadata.xml b/source/androidx.health.connect/connect-client/Transforms/Metadata.xml index 11698447c..fadc24320 100644 --- a/source/androidx.health.connect/connect-client/Transforms/Metadata.xml +++ b/source/androidx.health.connect/connect-client/Transforms/Metadata.xml @@ -11,6 +11,15 @@ CreateIntentImpl ParseResultImpl + + public + public + public + + + From a95292a17438657f81539c84c946795c99635353 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Mon, 8 Jun 2026 14:29:44 -0500 Subject: [PATCH 3/3] Re-attach IRecord chain via add-node instead of forcing internal interfaces public IntervalRecord, InstantaneousRecord, and SeriesRecord are `@PublishedApi internal` in upstream Kotlin source. The previous fix forced visibility="public" on them, which both: - Tripped `metadata-verify` ("Preventing exposing/surfacing interfaces with default package accessibility as public"). - Surfaced AndroidX-internal types in the public binding API surface, contradicting upstream's intent. Replace the visibility attrs (and the SeriesRecord/getSamples remove-node, which is no longer needed) with a single `` that injects `implements Record` directly onto every concrete record class that originally implemented one of the three internal intermediaries. This preserves the `SleepSessionRecord : IRecord` (etc.) chain that callers need without republishing the internal interfaces. PublicAPI.Unshipped.txt: drop the IInstantaneousRecord/IIntervalRecord/ ISeriesRecord entries that will no longer be generated; IRecord and the existing concrete record APIs are retained. Also document the pattern in .github/copilot-instructions.md so future changes hit the supported approach first. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/copilot-instructions.md | 24 +++++++++++++++++++ .../PublicAPI/PublicAPI.Unshipped.txt | 9 ------- .../connect-client/Transforms/Metadata.xml | 18 +++++++------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index a00f76c3f..439a0e9d0 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -73,6 +73,30 @@ public partial class ClassName } ``` +### Missing `IRecord`/Interface Chain (Kotlin `@PublishedApi internal`) +When concrete classes lose an `implements` to a public interface because an +intermediate Kotlin interface is `@PublishedApi internal` (or otherwise has +`visibility=""` from class-parse), the binding generator drops the intermediate +type and strips it from every implementer. + +**Do NOT** force `public` on the dropped +interface — `metadata-verify` (build/cake/validations.cake) will fail with +"Preventing exposing/surfacing interfaces with default package accessibility +as public", and it correctly protects against republishing types upstream +explicitly marked internal. + +**Instead**, inject the public ancestor directly onto each concrete implementer +using `` with an XPath that matches by the dropped intermediate(s): +```xml + + + +``` +This preserves the public chain without exposing the internal intermediary. +See `source/GPS.Metadata.Common.xml` (ReflectedParcelable/Parcelable) and +`source/androidx.health.connect/connect-client/Transforms/Metadata.xml` +(IntervalRecord/InstantaneousRecord/SeriesRecord → Record) for examples. + ### Build File Locking Errors (XARLP7024) Transient parallel build issue. Usually resolves on retry. If persistent, may need to reduce build parallelism in `build/cake/build-and-package.cake`. diff --git a/source/androidx.health.connect/connect-client/PublicAPI/PublicAPI.Unshipped.txt b/source/androidx.health.connect/connect-client/PublicAPI/PublicAPI.Unshipped.txt index 3a1b38043..04cccc6d9 100644 --- a/source/androidx.health.connect/connect-client/PublicAPI/PublicAPI.Unshipped.txt +++ b/source/androidx.health.connect/connect-client/PublicAPI/PublicAPI.Unshipped.txt @@ -489,18 +489,9 @@ AndroidX.Health.Connect.Client.Records.HydrationRecord.StartTime.get -> Java.Tim AndroidX.Health.Connect.Client.Records.HydrationRecord.StartZoneOffset.get -> Java.Time.ZoneOffset? AndroidX.Health.Connect.Client.Records.HydrationRecord.Volume.get -> AndroidX.Health.Connect.Client.Units.Volume! AndroidX.Health.Connect.Client.Records.IBodyTemperatureMeasurementLocations -AndroidX.Health.Connect.Client.Records.IInstantaneousRecord -AndroidX.Health.Connect.Client.Records.IInstantaneousRecord.Time.get -> Java.Time.Instant! -AndroidX.Health.Connect.Client.Records.IInstantaneousRecord.ZoneOffset.get -> Java.Time.ZoneOffset? -AndroidX.Health.Connect.Client.Records.IIntervalRecord -AndroidX.Health.Connect.Client.Records.IIntervalRecord.EndTime.get -> Java.Time.Instant! -AndroidX.Health.Connect.Client.Records.IIntervalRecord.EndZoneOffset.get -> Java.Time.ZoneOffset? -AndroidX.Health.Connect.Client.Records.IIntervalRecord.StartTime.get -> Java.Time.Instant! -AndroidX.Health.Connect.Client.Records.IIntervalRecord.StartZoneOffset.get -> Java.Time.ZoneOffset? AndroidX.Health.Connect.Client.Records.IMealTypes AndroidX.Health.Connect.Client.Records.IRecord AndroidX.Health.Connect.Client.Records.IRecord.Metadata.get -> AndroidX.Health.Connect.Client.Records.Metadata.Metadata! -AndroidX.Health.Connect.Client.Records.ISeriesRecord AndroidX.Health.Connect.Client.Records.IntermenstrualBleedingRecord AndroidX.Health.Connect.Client.Records.IntermenstrualBleedingRecord.IntermenstrualBleedingRecord(Java.Time.Instant! time, Java.Time.ZoneOffset? zoneOffset, AndroidX.Health.Connect.Client.Records.Metadata.Metadata! metadata) -> void AndroidX.Health.Connect.Client.Records.IntermenstrualBleedingRecord.Metadata.get -> AndroidX.Health.Connect.Client.Records.Metadata.Metadata! diff --git a/source/androidx.health.connect/connect-client/Transforms/Metadata.xml b/source/androidx.health.connect/connect-client/Transforms/Metadata.xml index fadc24320..c03000c9e 100644 --- a/source/androidx.health.connect/connect-client/Transforms/Metadata.xml +++ b/source/androidx.health.connect/connect-client/Transforms/Metadata.xml @@ -11,14 +11,16 @@ CreateIntentImpl ParseResultImpl - - public - public - public - - + + + +