+func (c *Client) Steps(ctx context.Context, startTime, endTime time.Time) (int, time.Time, error) {
+ dataSourceID := DataStreamID(&fitness.DataSource{
+ Type: "raw",
+ DataType: &fitness.DataType{
+ Name: dataTypeNameSteps,
+ },
+ })
+ datasetID := fmt.Sprintf("%d-%d", startTime.UnixNano(), endTime.UnixNano())
+
+ res, err := c.Service.Users.DataSources.Datasets.Get(userID, dataSourceID, datasetID).Context(ctx).Do()
+ if err != nil {
+ log.Errorf(ctx, "c.Service.Users.DataSources.Datasets.Get(%q, %q) = %v",
+ dataSourceID, datasetID, err)
+ return 0, time.Time{}, err
+ }
+
+ if len(res.Point) == 0 {
+ return 0, startTime, nil
+ }
+
+ steps := 0
+ maxEndTime := startTime
+ for _, p := range res.Point {
+ pointEndTime := time.Unix(0, p.EndTimeNanos).In(startTime.Location())
+ value := p.Value[0].IntVal
+
+ steps += int(value)
+ if maxEndTime.Before(pointEndTime) {
+ maxEndTime = pointEndTime
+ }
+ }
+
+ log.Debugf(ctx, "Google Fit has data points until %v: %d steps", maxEndTime, steps)
+ return steps, maxEndTime, nil
+}
+
+func (c *Client) SetSteps(ctx context.Context, totalSteps int, startOfDay time.Time) error {
+ if totalSteps == 0 {
+ return nil
+ }