Field-reported on the alpha APK: the Samsung/Pixel row failed with
'Health permissions were denied' without ever showing a dialog, and the
Google Health connect reported the same error despite a successful OAuth.
- MainActivity now extends FlutterFragmentActivity: package:health v13
casts the host activity to androidx ComponentActivity to call
registerForActivityResult, so with plain FlutterActivity the permission
launcher stayed null and requestAuthorization() silently returned false
(HealthPlugin.kt:317 'Permission launcher not found')
- add the androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE intent-filter
required by the health package README on the main activity
- drop STEPS / READ_STEPS from the Android permission set: steps are never
fetched anywhere and the README ties step access to ACTIVITY_RECOGNITION,
which this app does not declare (weight, total + active calories, blood
glucose remain, all declared in the manifest)
- syncFromHealth treats a native permission denial as fatal only when no
cloud partner holds a grant, so a Google Health-connected sync proceeds
without the OS permission (native reads degrade to empty)
- tests: biometric controller covers native-denial + cloud-ready sync
(cloudReady fake override); suite 185/185, analyze clean, debug APK
builds (also clears the standing flutter build apk --debug gate)
- BUILD_STATE: record both fixes, check off the Android OAuth client and
connect gates, add the Health Connect on-device verification gate