// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main import ( "fmt" "log" "net/http" "os" "strings" "time" fitness "google.golang.org/api/fitness/v1" ) const ( layout = "Jan 2, 2006 at 3:04pm" // for time.Format nanosPerMilli = 1e6 ) func init() { scopes := []string{ fitness.FitnessActivityReadScope, fitness.FitnessActivityWriteScope, fitness.FitnessBodyReadScope, fitness.FitnessBodyWriteScope, fitness.FitnessLocationReadScope, fitness.FitnessLocationWriteScope, } registerDemo("fitness", strings.Join(scopes, " "), fitnessMain) } // millisToTime converts Unix millis to time.Time. func millisToTime(t int64) time.Time { return time.Unix(0, t*nanosPerMilli) } // fitnessMain is an example that demonstrates calling the Fitness API. // // Example usage: // go build -o go-api-demo *.go // go-api-demo -clientid="my-clientid" -secret="my-secret" fitness func fitnessMain(client *http.Client, argv []string) { if len(argv) != 0 { fmt.Fprintln(os.Stderr, "Usage: fitness") return } svc, err := fitness.New(client) if err != nil { log.Fatalf("Unable to create Fitness service: %v", err) } us, err := svc.Users.Sessions.List("me").Do() if err != nil { log.Fatalf("Unable to retrieve user's sessions: %v", err) } if len(us.Session) == 0 { log.Fatal("You have no user sessions to explore.") } var minTime, maxTime time.Time for _, s := range us.Session { start := millisToTime(s.StartTimeMillis) end := millisToTime(s.EndTimeMillis) if minTime.IsZero() || start.Before(minTime) { minTime = start } if maxTime.IsZero() || end.After(maxTime) { maxTime = end } log.Printf("Session %q, %v - %v, activity type=%v", s.Name, start.Format(layout), end.Format(layout), s.ActivityType) } ds, err := svc.Users.DataSources.List("me").Do() if err != nil { log.Fatalf("Unable to retrieve user's data sources: %v", err) } if len(ds.DataSource) == 0 { log.Fatal("You have no data sources to explore.") } for _, d := range ds.DataSource { format := "integer" if d.DataType != nil && len(d.DataType.Field) > 0 { f := d.DataType.Field[0] format = f.Format log.Printf("Data source %q, name %q is of type %q", d.DataStreamName, f.Name, format) } else { log.Printf("Data source %q is of type %q", d.DataStreamName, d.Type) } setID := fmt.Sprintf("%v-%v", minTime.UnixNano(), maxTime.UnixNano()) data, err := svc.Users.DataSources.Datasets.Get("me", d.DataStreamId, setID).Do() if err != nil { log.Fatalf("Unable to retrieve user's data source stream %v, %v: %v", d.DataStreamId, setID, err) } for _, p := range data.Point { for _, v := range p.Value { t := millisToTime(p.ModifiedTimeMillis).Format(layout) if format == "integer" { log.Printf("data at %v = %v", t, v.IntVal) } else { log.Printf("data at %v = %v", t, v.FpVal) } } } } }