diff --git a/lib/features/smartwatch_health_data/health_provider.dart b/lib/features/smartwatch_health_data/health_provider.dart index 905c8d5a..80a79bb3 100644 --- a/lib/features/smartwatch_health_data/health_provider.dart +++ b/lib/features/smartwatch_health_data/health_provider.dart @@ -66,9 +66,7 @@ class HealthProvider with ChangeNotifier { final startTime = _getStartDate(); final endTime = DateTime.now(); - healthData = await _healthService.getAllHealthData(startTime, endTime); - isLoading = false; notifyListeners(); } catch (e) { diff --git a/lib/features/smartwatch_health_data/watch_connectors/create_watch_helper.dart b/lib/features/smartwatch_health_data/watch_connectors/create_watch_helper.dart index 72f97b69..8abb2136 100644 --- a/lib/features/smartwatch_health_data/watch_connectors/create_watch_helper.dart +++ b/lib/features/smartwatch_health_data/watch_connectors/create_watch_helper.dart @@ -1,10 +1,15 @@ +import 'dart:io'; + import 'package:hmg_patient_app_new/core/common_models/smart_watch.dart'; +import 'package:hmg_patient_app_new/features/smartwatch_health_data/watch_connectors/health_connect_helper.dart'; import 'package:hmg_patient_app_new/features/smartwatch_health_data/watch_connectors/huawei_watch_connecter.dart'; import 'package:hmg_patient_app_new/features/smartwatch_health_data/watch_connectors/samsung_health.dart'; import 'package:hmg_patient_app_new/features/smartwatch_health_data/watch_connectors/watch_helper.dart'; class CreateWatchHelper { static WatchHelper getWatchName(SmartWatchTypes watchType) { + /// if running device is ios + if(Platform.isIOS) return HealthConnectHelper(); switch(watchType){ case SmartWatchTypes.samsung: return SamsungHealth(); diff --git a/lib/features/smartwatch_health_data/watch_connectors/health_connect_helper.dart b/lib/features/smartwatch_health_data/watch_connectors/health_connect_helper.dart new file mode 100644 index 00000000..e7ec35b7 --- /dev/null +++ b/lib/features/smartwatch_health_data/watch_connectors/health_connect_helper.dart @@ -0,0 +1,164 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:async/src/result/result.dart'; +import 'package:health/health.dart'; +import 'package:hmg_patient_app_new/features/smartwatch_health_data/watch_connectors/watch_helper.dart' show WatchHelper; +import 'package:permission_handler/permission_handler.dart'; + +import '../model/Vitals.dart'; + +class HealthConnectHelper extends WatchHelper { + final Health health = Health(); + + final List _healthPermissions = [ + HealthDataType.HEART_RATE, + HealthDataType.STEPS, + HealthDataType.BLOOD_OXYGEN, + HealthDataType.BODY_TEMPERATURE, + HealthDataType.DISTANCE_WALKING_RUNNING, + HealthDataType.TOTAL_CALORIES_BURNED + ]; + + Map> mappedData = {}; + + @override + FutureOr getHeartRate() async { + try { + final types = [HealthDataType.HEART_RATE]; + final endDate = DateTime.now(); + final startDate = endDate.subtract(Duration(days: 365)); + final data = await getData(startDate, endDate, types); + addDataToMap("heartRate",data ); + } catch (e) { + print('Error getting heart rate: $e'); + } + } + + @override + FutureOr getSleep() async { + try { + final types = [HealthDataType.SLEEP_IN_BED]; + final endDate = DateTime.now(); + final startDate = endDate.subtract(Duration(days: 365)); + final data = await getData(startDate, endDate, types); + addDataToMap("sleep",data ); + } catch (e) { + print('Error getting sleep data: $e'); + } + } + + @override + FutureOr getSteps() async { + try { + final types = [HealthDataType.STEPS]; + final endDate = DateTime.now(); + final startDate = endDate.subtract(Duration(days: 365)); + final data = await getData(startDate, endDate, types); + addDataToMap("steps",data ); + print('Steps Data: $data'); + } catch (e) { + print('Error getting steps: $e'); + } + } + + @override + Future getActivity() async { + try { + final types = [HealthDataType.ACTIVE_ENERGY_BURNED]; + final endDate = DateTime.now(); + final startDate = endDate.subtract(Duration(days: 365)); + final data = await getData(startDate, endDate, types); + addDataToMap("activity",data ); + print('Activity Data: $data'); + } catch (e) { + print('Error getting activity: $e'); + } + } + + @override + Future retrieveData() async { + return mappedData; + } + + @override + Future getBloodOxygen() async { + try { + final types = [HealthDataType.BLOOD_OXYGEN]; + final endDate = DateTime.now(); + final startDate = endDate.subtract(Duration(days: 365)); + final data = await getData(startDate, endDate, types); + addDataToMap("bloodOxygen",data ); + } catch (e) { + print('Error getting blood oxygen: $e'); + } + } + + @override + Future getBodyTemperature() async { + try { + final types = [HealthDataType.BODY_TEMPERATURE]; + final endDate = DateTime.now(); + final startDate = endDate.subtract(Duration(days: 365)); + final data = await getData(startDate, endDate, types); + addDataToMap("bodyTemperature",data ); + } catch (e) { + print('Error getting body temp erature: $e'); + } + } + + @override + FutureOr getDistance() async { + try { + final types = [HealthDataType.DISTANCE_WALKING_RUNNING]; + final endDate = DateTime.now(); + final startDate = endDate.subtract(Duration(days: 365)); + final data = await getData(startDate, endDate, types); + addDataToMap("distance",data ); + } catch (e) { + print('Error getting distance: $e'); + } + } + + @override + Future> initDevice() async { + try { + final types = _healthPermissions; + final granted = await health.requestAuthorization(types); + await Permission.activityRecognition.request(); + await Permission.location.request(); + // request access to read historic data + await Health().requestHealthDataHistoryAuthorization(); + // await authorize(); + return Result.value(granted); + } catch (e) { + print('Authorization error: $e'); + return Result.error(false); + } + } + + getData(startTime, endTime,type) async { + return await health.getHealthIntervalDataFromTypes( + startDate: startTime, + endDate: endTime, + types: [type], + interval: 86400, + ); + } + + void addDataToMap(String s, data) { + mappedData[s] = []; + for (var point in data) { + if (point.value is NumericHealthValue) { + final numericValue = (point.value as NumericHealthValue).numericValue; + point.value = NumericHealthValue( + numericValue: numericValue * 100, + ); + Vitals vitals = Vitals( + value: (point.value as NumericHealthValue).numericValue.toStringAsFixed(2), + timestamp: point.dateFrom.toString() + ); + mappedData[s]?.add(vitals); + } + } + } +}