ReviewOS

also looking at this

craft-native/craft

fix(native): preserve workspace sources and native overlay lifecycle

#384
Merged chris wants to merge codex/windows-zig-cache-diagnostics into main
20 files +500 -227

Review threads live on the whole diff, not on one commit, so none are shown here - a thread's line means something in the branch's final form, and painting it into an intermediate step would put it on code it is not about.

packages/android/src/index.test.tsmodified+15-0
Changes to packages/android/src/index.test.ts
@@ -2597,6 +2597,21 @@ it('emits native Bluetooth GATT support and versioned permissions only when enab
25972597 finally { rmSync(output, { recursive: true, force: true }) }
25982598})
25992599
2600it('declares location once when Bluetooth overlaps unrestricted location capabilities', () => {
2601 for (const bluetooth of ['enableBluetooth', 'enableHeartRate'] as const) {
2602 for (const location of ['enableGeolocation', 'enableBackgroundLocation', 'enableHealthServices'] as const) {
2603 const permissions = renderAndroidPermissions({
2604 appName: 'Combined capabilities',
2605 packageName: 'dev.craft.combined',
2606 [bluetooth]: true,
2607 [location]: true,
2608 })
2609 const fineLocation = permissions.split('\n').filter(line => line.includes('"android.permission.ACCESS_FINE_LOCATION"'))
2610 expect(fineLocation).toEqual([' <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />'])
2611 }
2612 }
2613})
2614
26002615it('reads a heart-rate strap on the page and on native screens alike, declared only when enabled', async () => {
26012616 for (const renderer of ['native', 'web'] as const) {
26022617 const output = createTempDir(`craft-android-heart-rate-${renderer}-`)
packages/android/src/index.tsmodified+1-1
Changes to packages/android/src/index.ts
@@ -727,7 +727,7 @@ export function renderAndroidPermissions(config: CraftAndroidConfig): string {
727727 ' <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />',
728728 ' <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />',
729729 ' <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />',
730 ...(config.enableGeolocation ? [] : [' <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />']),
730 ...(permissions.has('android.permission.ACCESS_FINE_LOCATION') ? [] : [' <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />']),
731731 ].join('\n') : ''
732732 return [bluetooth, ...[...permissions].map(permission => ` <uses-permission android:name="${permission}" />`)].filter(Boolean).join('\n')
733733}