Commit 040960ed012eb6745f19973baa4374df4a76841c

Authored by 权海
1 parent cf671201

feat(ui):增肌日志系统

... ... @@ -14,7 +14,22 @@ final class HealthKitRawDataHostApiImpl: HealthKitRawDataHostApi {
}
func shareFlutterObserverRecord(completion: @escaping (Result<Bool, any Error>) -> Void) {
let timestamp = Int64(Date().timeIntervalSince1970.rounded())
let dataTypes = NativeHealthDataType.allCases
.map(\.rawValue)
.sorted()
DispatchQueue.main.async {
NotificationCenter.default.post(
name: .nativeHealthDataDidUpdate,
object: nil,
userInfo: [
"dataTypes": dataTypes,
"timestamp": timestamp,
]
)
completion(.success(true))
}
}
private let service: HealthKitService
... ...
... ... @@ -22,6 +22,8 @@ class DeveloperOptionsItem {
enum DeveloperOptionsAction {
shareHealthRawDataDatabase,
shareHealthRawUploadLog,
shareNativeAppleHealthObserverRecord,
shareFlutterObserverRecord,
clearHealthRawDataDatabaseAndUploadLog,
}
... ... @@ -58,6 +60,14 @@ class DeveloperOptionsController extends GetxController {
action: DeveloperOptionsAction.shareHealthRawUploadLog,
),
DeveloperOptionsItem(
title: '分享原生AppleHealthObserver记录',
action: DeveloperOptionsAction.shareNativeAppleHealthObserverRecord,
),
DeveloperOptionsItem(
title: '分享Flutter Observer-Caculate记录',
action: DeveloperOptionsAction.shareFlutterObserverRecord,
),
DeveloperOptionsItem(
title: '清除本地数据库、上传日志',
action: DeveloperOptionsAction.clearHealthRawDataDatabaseAndUploadLog,
),
... ... @@ -83,6 +93,12 @@ class DeveloperOptionsController extends GetxController {
case DeveloperOptionsAction.shareHealthRawUploadLog:
await shareHealthRawUploadLog();
break;
case DeveloperOptionsAction.shareNativeAppleHealthObserverRecord:
await shareNativeAppleHealthObserverRecord();
break;
case DeveloperOptionsAction.shareFlutterObserverRecord:
await shareFlutterObserverRecord();
break;
case DeveloperOptionsAction.clearHealthRawDataDatabaseAndUploadLog:
await clearHealthRawDataDatabaseAndUploadLog();
break;
... ... @@ -111,6 +127,32 @@ class DeveloperOptionsController extends GetxController {
}
}
Future<void> shareNativeAppleHealthObserverRecord() async {
try {
await _healthRawDataCoreService.shareNativeAppleHealthObserverRecord();
} catch (error, stackTrace) {
AppLogger.e(
'Share native AppleHealthObserver record failed',
error,
stackTrace,
);
Get.snackbar('Share failed', error.toString());
}
}
Future<void> shareFlutterObserverRecord() async {
try {
await _healthRawDataCoreService.shareFlutterObserverRecord();
} catch (error, stackTrace) {
AppLogger.e(
'Share Flutter Observer-Caculate record failed',
error,
stackTrace,
);
Get.snackbar('Share failed', error.toString());
}
}
Future<void> clearHealthRawDataDatabaseAndUploadLog() async {
try {
await _healthRawDataCoreService.clearLocalDatabaseAndUploadLog();
... ...
... ... @@ -67,10 +67,14 @@ class HomeController extends GetxController {
case FlutterBridgeMethodName.handleFlutterUrl:
return handleFlutterUrl(call.arguments);
case FlutterBridgeMethodName.healthDataUpdated:
final dataTypes = _healthDataTypesFromArguments(call.arguments);
await Get.find<HealthRawDataCoreService>().onHealthDataUpdated(
dataTypes: _healthDataTypesFromArguments(call.arguments),
dataTypes: dataTypes,
);
return true;
// case FlutterBridgeMethodName.uploadHealthData:
// return null;
default:
debugPrint(
'[HomeController] unhandled native method: ${call.method}, '
... ... @@ -209,8 +213,8 @@ class HomeController extends GetxController {
if (paramUserId != null) {
final friendUserId = int.tryParse(paramUserId);
if (friendUserId != null) {
final _friendApi = Get.find<FriendApi>();
_friendApi.getFriendInfo(friendUserId).then((result) {
final friendApi = Get.find<FriendApi>();
friendApi.getFriendInfo(friendUserId).then((result) {
switch (result) {
case AppSuccess(data: final info):
{
... ...
... ... @@ -3,4 +3,5 @@ class FlutterBridgeMethodName {
static const handleFlutterUrl = 'handleFlutterUrl';
static const healthDataUpdated = 'healthDataUpdated';
static const uploadHealthData = 'uploadHealthData';
}
... ...
... ... @@ -78,6 +78,7 @@ class HealthRawDataCoreService {
_healthDataUpdatedController.stream;
Future<void> onHealthDataUpdated({List<int>? dataTypes}) async {
await _saveNativeCallFlutterChange(dataTypes);
if (_healthDataUpdatedCalculation != null) {
_pendingHealthDataUpdatedTypes = _mergeHealthDataTypes(
_pendingHealthDataUpdatedTypes,
... ... @@ -104,8 +105,10 @@ class HealthRawDataCoreService {
Future<void> _calculateAndNotifyHealthDataUpdated() async {
try {
await startCoreCaculate();
final completedDataTypes = _pendingHealthDataUpdatedTypes;
await _saveFlutterCaculateFinished(completedDataTypes);
_healthDataUpdatedController.add(
HealthRawDataUpdatedEvent(dataTypes: _pendingHealthDataUpdatedTypes),
HealthRawDataUpdatedEvent(dataTypes: completedDataTypes),
);
} finally {
_pendingHealthDataUpdatedTypes = const <int>[];
... ... @@ -159,6 +162,16 @@ class HealthRawDataCoreService {
}
}
Future<bool> shareNativeAppleHealthObserverRecord() async {
if (!_isDebug) return false;
return _rawDataApi.shareNativeAppleHealthObserverRecord();
}
Future<bool> shareFlutterObserverRecord() async {
if (!_isDebug) return false;
return _rawDataApi.shareFlutterObserverRecord();
}
Future<HealthRawStressCalculationResult> startCoreCaculate({
int? endTime,
int readChunkDays = defaultReadChunkDays,
... ... @@ -705,6 +718,28 @@ class HealthRawDataCoreService {
await file.writeAsString(line, mode: FileMode.append, flush: true);
}
Future<void> _saveNativeCallFlutterChange(List<int>? dataTypes) async {
if (!_isDebug) return;
try {
await _rawDataApi.saveNativeCallFlutterChange(
relativeDataTypes: dataTypes ?? const <int>[],
);
} catch (error, stackTrace) {
_logError('save native call flutter change failed', error, stackTrace);
}
}
Future<void> _saveFlutterCaculateFinished(List<int> dataTypes) async {
if (!_isDebug) return;
try {
await _rawDataApi.saveFlutterCaculateFinished(
relativeDataTypes: dataTypes,
);
} catch (error, stackTrace) {
_logError('save flutter caculate finished failed', error, stackTrace);
}
}
Future<File> _uploadApiLogFile() async {
final dir = await getApplicationDocumentsDirectory();
return File('${dir.path}/health_raw_upload_debug.log');
... ...
... ... @@ -15,21 +15,22 @@ PlatformException _createConnectionError(String channelName) {
message: 'Unable to establish connection on channel: "$channelName".',
);
}
bool _deepEquals(Object? a, Object? b) {
if (a is List && b is List) {
return a.length == b.length &&
a.indexed
.every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]));
.every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]));
}
if (a is Map && b is Map) {
return a.length == b.length && a.entries.every((MapEntry<Object?, Object?> entry) =>
(b as Map<Object?, Object?>).containsKey(entry.key) &&
_deepEquals(entry.value, b[entry.key]));
return a.length == b.length &&
a.entries.every((MapEntry<Object?, Object?> entry) =>
(b as Map<Object?, Object?>).containsKey(entry.key) &&
_deepEquals(entry.value, b[entry.key]));
}
return a == b;
}
class HealthKitRawDataPoint {
HealthKitRawDataPoint({
required this.dataType,
... ... @@ -60,7 +61,8 @@ class HealthKitRawDataPoint {
}
Object encode() {
return _toList(); }
return _toList();
}
static HealthKitRawDataPoint decode(Object result) {
result as List<Object?>;
... ... @@ -87,8 +89,7 @@ class HealthKitRawDataPoint {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
int get hashCode => Object.hashAll(_toList())
;
int get hashCode => Object.hashAll(_toList());
}
class HealthKitRawSleepDataPoint {
... ... @@ -109,20 +110,23 @@ class HealthKitRawSleepDataPoint {
}
Object encode() {
return _toList(); }
return _toList();
}
static HealthKitRawSleepDataPoint decode(Object result) {
result as List<Object?>;
return HealthKitRawSleepDataPoint(
dataType: result[0]! as int,
sleepDataPoints: (result[1] as List<Object?>?)!.cast<HealthKitRawDataPoint>(),
sleepDataPoints:
(result[1] as List<Object?>?)!.cast<HealthKitRawDataPoint>(),
);
}
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
bool operator ==(Object other) {
if (other is! HealthKitRawSleepDataPoint || other.runtimeType != runtimeType) {
if (other is! HealthKitRawSleepDataPoint ||
other.runtimeType != runtimeType) {
return false;
}
if (identical(this, other)) {
... ... @@ -133,8 +137,7 @@ class HealthKitRawSleepDataPoint {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
int get hashCode => Object.hashAll(_toList())
;
int get hashCode => Object.hashAll(_toList());
}
class HealthKitRawWorkoutDataPoint {
... ... @@ -159,7 +162,8 @@ class HealthKitRawWorkoutDataPoint {
}
Object encode() {
return _toList(); }
return _toList();
}
static HealthKitRawWorkoutDataPoint decode(Object result) {
result as List<Object?>;
... ... @@ -173,7 +177,8 @@ class HealthKitRawWorkoutDataPoint {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
bool operator ==(Object other) {
if (other is! HealthKitRawWorkoutDataPoint || other.runtimeType != runtimeType) {
if (other is! HealthKitRawWorkoutDataPoint ||
other.runtimeType != runtimeType) {
return false;
}
if (identical(this, other)) {
... ... @@ -184,8 +189,7 @@ class HealthKitRawWorkoutDataPoint {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
int get hashCode => Object.hashAll(_toList())
;
int get hashCode => Object.hashAll(_toList());
}
class HealthKitRawMotionDataPoint {
... ... @@ -210,7 +214,8 @@ class HealthKitRawMotionDataPoint {
}
Object encode() {
return _toList(); }
return _toList();
}
static HealthKitRawMotionDataPoint decode(Object result) {
result as List<Object?>;
... ... @@ -224,7 +229,8 @@ class HealthKitRawMotionDataPoint {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
bool operator ==(Object other) {
if (other is! HealthKitRawMotionDataPoint || other.runtimeType != runtimeType) {
if (other is! HealthKitRawMotionDataPoint ||
other.runtimeType != runtimeType) {
return false;
}
if (identical(this, other)) {
... ... @@ -235,8 +241,7 @@ class HealthKitRawMotionDataPoint {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
int get hashCode => Object.hashAll(_toList())
;
int get hashCode => Object.hashAll(_toList());
}
class HealthKitRawActivityDataPoint {
... ... @@ -289,7 +294,8 @@ class HealthKitRawActivityDataPoint {
}
Object encode() {
return _toList(); }
return _toList();
}
static HealthKitRawActivityDataPoint decode(Object result) {
result as List<Object?>;
... ... @@ -310,7 +316,8 @@ class HealthKitRawActivityDataPoint {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
bool operator ==(Object other) {
if (other is! HealthKitRawActivityDataPoint || other.runtimeType != runtimeType) {
if (other is! HealthKitRawActivityDataPoint ||
other.runtimeType != runtimeType) {
return false;
}
if (identical(this, other)) {
... ... @@ -321,11 +328,9 @@ class HealthKitRawActivityDataPoint {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
int get hashCode => Object.hashAll(_toList())
;
int get hashCode => Object.hashAll(_toList());
}
class _PigeonCodec extends StandardMessageCodec {
const _PigeonCodec();
@override
... ... @@ -333,19 +338,19 @@ class _PigeonCodec extends StandardMessageCodec {
if (value is int) {
buffer.putUint8(4);
buffer.putInt64(value);
} else if (value is HealthKitRawDataPoint) {
} else if (value is HealthKitRawDataPoint) {
buffer.putUint8(129);
writeValue(buffer, value.encode());
} else if (value is HealthKitRawSleepDataPoint) {
} else if (value is HealthKitRawSleepDataPoint) {
buffer.putUint8(130);
writeValue(buffer, value.encode());
} else if (value is HealthKitRawWorkoutDataPoint) {
} else if (value is HealthKitRawWorkoutDataPoint) {
buffer.putUint8(131);
writeValue(buffer, value.encode());
} else if (value is HealthKitRawMotionDataPoint) {
} else if (value is HealthKitRawMotionDataPoint) {
buffer.putUint8(132);
writeValue(buffer, value.encode());
} else if (value is HealthKitRawActivityDataPoint) {
} else if (value is HealthKitRawActivityDataPoint) {
buffer.putUint8(133);
writeValue(buffer, value.encode());
} else {
... ... @@ -356,15 +361,15 @@ class _PigeonCodec extends StandardMessageCodec {
@override
Object? readValueOfType(int type, ReadBuffer buffer) {
switch (type) {
case 129:
case 129:
return HealthKitRawDataPoint.decode(readValue(buffer)!);
case 130:
case 130:
return HealthKitRawSleepDataPoint.decode(readValue(buffer)!);
case 131:
case 131:
return HealthKitRawWorkoutDataPoint.decode(readValue(buffer)!);
case 132:
case 132:
return HealthKitRawMotionDataPoint.decode(readValue(buffer)!);
case 133:
case 133:
return HealthKitRawActivityDataPoint.decode(readValue(buffer)!);
default:
return super.readValueOfType(type, buffer);
... ... @@ -376,9 +381,11 @@ class HealthKitRawDataHostApi {
/// Constructor for [HealthKitRawDataHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
HealthKitRawDataHostApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})
HealthKitRawDataHostApi(
{BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})
: pigeonVar_binaryMessenger = binaryMessenger,
pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
pigeonVar_messageChannelSuffix =
messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
final BinaryMessenger? pigeonVar_binaryMessenger;
static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();
... ... @@ -387,8 +394,10 @@ class HealthKitRawDataHostApi {
/// 是否有AppleHealth数据
Future<bool> hasHealthData() async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.hasHealthData$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.hasHealthData$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
... ... @@ -415,14 +424,18 @@ class HealthKitRawDataHostApi {
}
/// 从AppleHealth 中读取原始数据
Future<List<HealthKitRawDataPoint>> getHealthKitRawData(int dataType, int startTime, int endTime) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.getHealthKitRawData$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<List<HealthKitRawDataPoint>> getHealthKitRawData(
int dataType, int startTime, int endTime) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.getHealthKitRawData$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[dataType, startTime, endTime]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[dataType, startTime, endTime]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -439,14 +452,17 @@ class HealthKitRawDataHostApi {
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (pigeonVar_replyList[0] as List<Object?>?)!.cast<HealthKitRawDataPoint>();
return (pigeonVar_replyList[0] as List<Object?>?)!
.cast<HealthKitRawDataPoint>();
}
}
/// 原生数据上传
Future<bool> performHealthDataUpload() async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.performHealthDataUpload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.performHealthDataUpload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
... ... @@ -473,14 +489,27 @@ class HealthKitRawDataHostApi {
}
/// 向原生同步数据库路径
Future<bool> syncDatabase({required String hrDataPath, required String hrvDataPath, required String sleepDataPath, required String avgRealtimeStressDataPath, }) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.syncDatabase$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<bool> syncDatabase({
required String hrDataPath,
required String hrvDataPath,
required String sleepDataPath,
required String avgRealtimeStressDataPath,
}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.syncDatabase$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[hrDataPath, hrvDataPath, sleepDataPath, avgRealtimeStressDataPath]);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel
.send(<Object?>[
hrDataPath,
hrvDataPath,
sleepDataPath,
avgRealtimeStressDataPath
]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -503,13 +532,16 @@ class HealthKitRawDataHostApi {
/// 上传心率 - 实时压力数据, 返回上传截止的时间戳, 方便flutter修改数据库
Future<int> performHRDataUpload({required String sqliteFilePath}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.performHRDataUpload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.performHRDataUpload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[sqliteFilePath]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[sqliteFilePath]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -532,13 +564,16 @@ class HealthKitRawDataHostApi {
/// 上传HRV - HRV压力数据, 返回上传截止的时间戳,方便flutter 修改数据库
Future<int> performHRVDataUpload({required String sqliteFilePath}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.performHRVDataUpload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.performHRVDataUpload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[sqliteFilePath]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[sqliteFilePath]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -560,14 +595,18 @@ class HealthKitRawDataHostApi {
}
/// 上传睡眠统计数据
Future<int> performSleepAnalysisDataUpload({required String sqliteFilePath}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.performSleepAnalysisDataUpload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<int> performSleepAnalysisDataUpload(
{required String sqliteFilePath}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.performSleepAnalysisDataUpload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[sqliteFilePath]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[sqliteFilePath]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -589,14 +628,18 @@ class HealthKitRawDataHostApi {
}
/// 上传当前实时压力(统计维度是当天)
Future<int> performAvgRealtimeStressDataUpload({required String sqliteFilePath}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.performAvgRealtimeStressDataUpload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<int> performAvgRealtimeStressDataUpload(
{required String sqliteFilePath}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.performAvgRealtimeStressDataUpload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[sqliteFilePath]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[sqliteFilePath]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -618,14 +661,18 @@ class HealthKitRawDataHostApi {
}
/// 从从AppleHealth中读取睡眠数据
Future<List<HealthKitRawSleepDataPoint>> getHealthKitRawSleepData(int startTime, int endTime) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.getHealthKitRawSleepData$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<List<HealthKitRawSleepDataPoint>> getHealthKitRawSleepData(
int startTime, int endTime) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.getHealthKitRawSleepData$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[startTime, endTime]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[startTime, endTime]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -642,19 +689,24 @@ class HealthKitRawDataHostApi {
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (pigeonVar_replyList[0] as List<Object?>?)!.cast<HealthKitRawSleepDataPoint>();
return (pigeonVar_replyList[0] as List<Object?>?)!
.cast<HealthKitRawSleepDataPoint>();
}
}
/// 从从AppleHealth中读取活动统计数据
Future<List<HealthKitRawActivityDataPoint>> getHealthKitRawActivityData(int startTime, int endTime) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.getHealthKitRawActivityData$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<List<HealthKitRawActivityDataPoint>> getHealthKitRawActivityData(
int startTime, int endTime) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.getHealthKitRawActivityData$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[startTime, endTime]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[startTime, endTime]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -671,19 +723,24 @@ class HealthKitRawDataHostApi {
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (pigeonVar_replyList[0] as List<Object?>?)!.cast<HealthKitRawActivityDataPoint>();
return (pigeonVar_replyList[0] as List<Object?>?)!
.cast<HealthKitRawActivityDataPoint>();
}
}
/// 从从AppleHealth中读取锻炼数据
Future<List<HealthKitRawWorkoutDataPoint>> getHealthKitRawWorkoutData(int startTime, int endTime) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.getHealthKitRawWorkoutData$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<List<HealthKitRawWorkoutDataPoint>> getHealthKitRawWorkoutData(
int startTime, int endTime) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.getHealthKitRawWorkoutData$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[startTime, endTime]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[startTime, endTime]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -700,20 +757,25 @@ class HealthKitRawDataHostApi {
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (pigeonVar_replyList[0] as List<Object?>?)!.cast<HealthKitRawWorkoutDataPoint>();
return (pigeonVar_replyList[0] as List<Object?>?)!
.cast<HealthKitRawWorkoutDataPoint>();
}
}
/// 原生是否通知了flutter ,apple health数据变化,让native 记录这次调用记录
/// 需要保存引起此次计算的数据变化类型列表、当前时间
Future<bool> saveNativeCallFlutterChange({List<int> relativeDataTypes}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.saveNativeCallFlutterChange$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<bool> saveNativeCallFlutterChange(
{required List<int> relativeDataTypes}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.saveNativeCallFlutterChange$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[relativeDataTypes]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[relativeDataTypes]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -736,14 +798,18 @@ class HealthKitRawDataHostApi {
/// caculate 一旦完成,让native 存储这次的计算记录
/// 需要保存引起此次计算的数据变化类型列表、当前时间
Future<bool> saveFlutterCaculateFinished({List<int> relativeDataTypes}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.saveFlutterCaculateFinished$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<bool> saveFlutterCaculateFinished(
{required List<int> relativeDataTypes}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.saveFlutterCaculateFinished$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[relativeDataTypes]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[relativeDataTypes]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
... ... @@ -766,8 +832,10 @@ class HealthKitRawDataHostApi {
/// 让原生分享出来本地的记录文件
Future<bool> shareNativeAppleHealthObserverRecord() async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.shareNativeAppleHealthObserverRecord$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.shareNativeAppleHealthObserverRecord$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
... ... @@ -795,8 +863,10 @@ class HealthKitRawDataHostApi {
/// 让原生分享出来flutter的记录文件
Future<bool> shareFlutterObserverRecord() async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.shareFlutterObserverRecord$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
final String pigeonVar_channelName =
'dev.flutter.pigeon.doublefeel_flutter.HealthKitRawDataHostApi.shareFlutterObserverRecord$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
... ...