class HealthConnectManager {
final Health health;
HealthConnectManager(this.health);
Future<HealthConnectSetupResult> initialize() async {
// Step 1: Check availability
final available = await health.isHealthConnectAvailable();
if (!available) {
return HealthConnectSetupResult.notInstalled;
}
// Step 2: Request basic permissions
final types = [
HealthDataType.STEPS,
HealthDataType.HEART_RATE,
HealthDataType.WEIGHT,
];
final authorized = await health.requestAuthorization(types);
if (!authorized) {
return HealthConnectSetupResult.permissionsDenied;
}
// Step 3: Request historical data (optional)
if (await health.isHealthDataHistoryAvailable()) {
await health.requestHealthDataHistoryAuthorization();
}
// Step 4: Request background access (optional)
if (await health.isHealthDataInBackgroundAvailable()) {
await health.requestHealthDataInBackgroundAuthorization();
}
return HealthConnectSetupResult.success;
}
Future<void> promptInstallation(BuildContext context) async {
final result = await showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (context) => AlertDialog(
title: Text('Health Connect Required'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.health_and_safety, size: 64, color: Colors.blue),
SizedBox(height: 16),
Text(
'This app uses Health Connect to access and manage your health data securely.',
textAlign: TextAlign.center,
),
],
),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(false),
child: Text('Cancel'),
),
ElevatedButton(
onPressed: () => Navigator.of(context).pop(true),
child: Text('Install Health Connect'),
),
],
),
);
if (result == true) {
await health.installHealthConnect();
}
}
}
enum HealthConnectSetupResult {
success,
notInstalled,
permissionsDenied,
error,
}