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
-
-
+
+
+
+