// utility function that gets the basal metabolic rate averaged over a week private async Task <double> GetBasalAvg(DateTime endDate) { float basalAvg = 0; long startDate = endDate.AddDays(-7).ToJavaTimeStamp(); var readRequest = new DataReadRequest.Builder() .Aggregate(DataType.TypeBasalMetabolicRate, DataType.AggregateBasalMetabolicRateSummary) .BucketByTime(1, TimeUnit.Days) .SetTimeRange(startDate, endDate.ToJavaTimeStamp(), TimeUnit.Milliseconds).Build(); var response = await FitnessClass.GetHistoryClient(_currentActivity, GoogleSignIn.GetLastSignedInAccount(_currentActivity)) .ReadDataAsync(readRequest); if (response.Status.IsSuccess) { var avgsN = 0; foreach (var bucket in response.Buckets) { // in the com.google.bmr.summary data type, each data point represents // the average, maximum and minimum basal metabolic rate, in kcal per day, over the time interval of the data point. var dataSet = bucket.GetDataSet(DataType.AggregateBasalMetabolicRateSummary); foreach (var dataPoint in dataSet.DataPoints) { var avg = dataPoint.GetValue(Field.FieldAverage).AsFloat(); if (avg > 0) { basalAvg += avg; avgsN++; } } } // do the average of the averages if (avgsN != 0) { basalAvg /= avgsN; // this a daily average } return(basalAvg); } throw new Exception(response.Status.StatusMessage); }
protected override async Task <IEnumerable <T> > Query <T>(HealthDataType healthDataType, AggregateTime aggregateTime, DateTime startDate, DateTime endDate) { var authorized = _healthService.HasOAuthPermission(_healthService.FitnessReadOptions(new HealthDataType[] { healthDataType })); if (!authorized) { throw new UnauthorizedAccessException($"Not enough permissions to request {healthDataType}"); } var fitData = healthDataType.ToGoogleFit(); long startTime = startDate.ToJavaTimeStamp(); long endTime = endDate.ToJavaTimeStamp(); var readBuilder = new DataReadRequest.Builder() .SetTimeRange(startTime, endTime, TimeUnit.Milliseconds) .EnableServerQueries(); if (aggregateTime != AggregateTime.None) { readBuilder.Aggregate(fitData.TypeIdentifier, fitData.AggregateType); switch (aggregateTime) { case AggregateTime.Year: readBuilder.BucketByTime(365, TimeUnit.Days); break; case AggregateTime.Month: readBuilder.BucketByTime(31, TimeUnit.Days); break; case AggregateTime.Week: readBuilder.BucketByTime(7, TimeUnit.Days); break; case AggregateTime.Day: readBuilder.BucketByTime(1, TimeUnit.Days); break; case AggregateTime.Hour: readBuilder.BucketByTime(1, TimeUnit.Hours); break; } } else { readBuilder.Read(fitData.TypeIdentifier); } var readRequest = readBuilder.Build(); var response = await FitnessClass.GetHistoryClient(_currentActivity, GoogleSignIn.GetLastSignedInAccount(_currentActivity)) .ReadDataAsync(readRequest).ConfigureAwait(false); double valueToSubstract = 0; if (healthDataType == HealthDataType.CaloriesActive) { valueToSubstract = await GetBasalAvg(endDate); } if (response == null) { return(new List <T>()); } if (response.Buckets.Any()) { var output = new List <T>(); foreach (var bucket in response.Buckets) { var dataSet = bucket.GetDataSet(fitData.AggregateType); output.AddRange((IEnumerable <T>)dataSet.DataPoints.Select(result => CreateAggregatedData(result, fitData, valueToSubstract))); if (!dataSet.DataPoints.Any() && healthDataType == HealthDataType.Droid_BasalMetabolicRate) { output.Add( new AggregatedHealthData() { StartDate = bucket.GetStartTime(TimeUnit.Milliseconds).ToDateTime(), EndDate = bucket.GetEndTime(TimeUnit.Milliseconds).ToDateTime(), Sum = valueToSubstract } as T); } } return(output); } return((IEnumerable <T>)response.GetDataSet(fitData.TypeIdentifier)?.DataPoints? .Select(dataPoint => new HealthData { StartDate = dataPoint.GetStartTime(TimeUnit.Milliseconds).ToDateTime(), EndDate = dataPoint.GetEndTime(TimeUnit.Milliseconds).ToDateTime(), Value = ReadValue(dataPoint, fitData.Unit, valueToSubstract) ?? 0, UserEntered = dataPoint.OriginalDataSource?.StreamName == "user_input" }).ToList()); }
public void CreateGoogleFitClient() { if (_activity == null || isWaitingForConnectivity) { return; } if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Q) { if (!_activity.HasActivityRecognition) { _activity.ActivityRecognitionPermissionUpdated += OnActivityRecognitionPermissionUpdated; isWaitingForConnectivity = true; _activity.RequestActivityRecognition(); return; } } if (!_activity.HasAccessFineLocation) { _activity.AccessFineLocationPermissionUpdated += OnAccessFineLocationPermissionUpdated; isWaitingForConnectivity = true; _activity.RequestAccessFineLocation(); return; } if (!_activity.HasGoogleFitnessPermissions) { _activity.GoogleFitnessPermissionsUpdated += OnFitnessPermissionsUpdated; isWaitingForConnectivity = true; _activity.RequestFitnessPermissions(); return; } GoogleSignInAccount googleAccount = GoogleSignIn.GetLastSignedInAccount(_activity); fitnessHistoryClient = FitnessClass.GetHistoryClient(_activity, googleAccount); fitnessRecordingClient = FitnessClass.GetRecordingClient(_activity, googleAccount); if (checkSubscriptionsTask == null) { checkSubscriptionsTask = Task.Run( async() => { bool hasSubscribedToSpeedData = await SubscribeToSpeedData(); if (hasSubscribedToSpeedData) { _isConnected = true; } }); } //create FitnessApi client, needs an activity //_client = new GoogleApiClient.Builder(_activity) // .AddApi(FitnessClass.RECORDING_API) // .AddApi(FitnessClass.HISTORY_API) // .AddScope(FitnessClass.ScopeLocationReadWrite) // .AddScope(FitnessClass.ScopeActivityReadWrite) // .AddConnectionCallbacks( // async bundle => // { // if (Mvx.IoCProvider != null) // { // Mvx.IoCProvider.Resolve<IMissingPermissionService>().ResolvedMissingPermission(MissingPermission.AndroidFitnessAccountLink); // } // var isSubscribed = await SubscribeToSpeedData(); // if (!isSubscribed) // { // Analytics.TrackEvent(TrackingEvents.Error, new TrackingEvents.ErrorArgs(TrackingEvents.ErrorData.SpeedDataSubscriptionFailed)); // } // _isConnected = true; // CrossLocalNotifications.Current.Cancel(Config.NotificationIdConnectivity); // OnConnected(); // await RequestUpdate(); // }, // suspensionReason => // { // if (suspensionReason == GoogleApiClient.ConnectionCallbacks.CauseNetworkLost) // { // Crashes.TrackError(new Exception("Connection to Google Fitness lost due to Network Lost")); // } // else if (suspensionReason == GoogleApiClient.ConnectionCallbacks.CauseServiceDisconnected) // { // Crashes.TrackError(new Exception("Connection to Google Fitness lost due to Service Disconnected")); // } // else // { // Crashes.TrackError(new Exception("Connection to Google Fitness lost: " + suspensionReason)); // } // }) // .AddOnConnectionFailedListener( // async result => // { // _isConnected = false; // if (UpdateService.Current.GetUpdateMode() == UpdateMode.Foreground && !isWaitingForConnectivity) // { // lastConnectionResult = result; // bool canReachGoogle = await CrossConnectivity.Current.IsRemoteReachable("http://www.google.com", 80, 1000); // if (!canReachGoogle) // { // bool hasCellular = CrossConnectivity.Current.ConnectionTypes.Contains(ConnectionType.Cellular); // bool hasWifi = CrossConnectivity.Current.ConnectionTypes.Contains(ConnectionType.WiFi); // CrossConnectivity.Current.ConnectivityTypeChanged += ConnectivityTypeChanged; // isWaitingForConnectivity = true; // await UserDialogs.Instance.AlertAsync( // "Du må ha en internett-forbindelse for å kunne hente ut dine gangdata fra Google Fit", // "Trenger nettforbindelse"); // if (!hasWifi) // { // var intent = new Intent(Android.Provider.Settings.ActionWifiSettings); // intent.SetFlags(ActivityFlags.NewTask); // _activity.StartActivity(intent); // } // else if (!hasCellular) // { // var intent = new Intent(Android.Provider.Settings.ActionDataUsageSettings); // intent.SetFlags(ActivityFlags.NewTask); // _activity.StartActivity(intent); // } // } // else // { // _activity.GoogleFitnessAuthenticationUpdated -= OnGoogleFitnessAuthenticationUpdated; // _activity.GoogleFitnessAuthenticationUpdated += OnGoogleFitnessAuthenticationUpdated; // _activity.RequestGoogleFitnessAuthentication(lastConnectionResult); // } // } // else // { // CrossLocalNotifications.Current.Show(AppText.notification_title, AppText.notification_google_fit_auth_failed, Config.NotificationIdConnectivity); // } // }) // .Build(); //ConnectGoogleFitClient(); }