1// Copyright 2014 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package main 6 7import ( 8 "fmt" 9 "log" 10 "net/http" 11 "os" 12 "strings" 13 "time" 14 15 fitness "google.golang.org/api/fitness/v1" 16) 17 18const ( 19 layout = "Jan 2, 2006 at 3:04pm" // for time.Format 20 nanosPerMilli = 1e6 21) 22 23func init() { 24 scopes := []string{ 25 fitness.FitnessActivityReadScope, 26 fitness.FitnessActivityWriteScope, 27 fitness.FitnessBodyReadScope, 28 fitness.FitnessBodyWriteScope, 29 fitness.FitnessLocationReadScope, 30 fitness.FitnessLocationWriteScope, 31 } 32 registerDemo("fitness", strings.Join(scopes, " "), fitnessMain) 33} 34 35// millisToTime converts Unix millis to time.Time. 36func millisToTime(t int64) time.Time { 37 return time.Unix(0, t*nanosPerMilli) 38} 39 40// fitnessMain is an example that demonstrates calling the Fitness API. 41// 42// Example usage: 43// go build -o go-api-demo *.go 44// go-api-demo -clientid="my-clientid" -secret="my-secret" fitness 45func fitnessMain(client *http.Client, argv []string) { 46 if len(argv) != 0 { 47 fmt.Fprintln(os.Stderr, "Usage: fitness") 48 return 49 } 50 51 svc, err := fitness.New(client) 52 if err != nil { 53 log.Fatalf("Unable to create Fitness service: %v", err) 54 } 55 56 us, err := svc.Users.Sessions.List("me").Do() 57 if err != nil { 58 log.Fatalf("Unable to retrieve user's sessions: %v", err) 59 } 60 if len(us.Session) == 0 { 61 log.Fatal("You have no user sessions to explore.") 62 } 63 64 var minTime, maxTime time.Time 65 for _, s := range us.Session { 66 start := millisToTime(s.StartTimeMillis) 67 end := millisToTime(s.EndTimeMillis) 68 if minTime.IsZero() || start.Before(minTime) { 69 minTime = start 70 } 71 if maxTime.IsZero() || end.After(maxTime) { 72 maxTime = end 73 } 74 log.Printf("Session %q, %v - %v, activity type=%v", s.Name, start.Format(layout), end.Format(layout), s.ActivityType) 75 } 76 77 ds, err := svc.Users.DataSources.List("me").Do() 78 if err != nil { 79 log.Fatalf("Unable to retrieve user's data sources: %v", err) 80 } 81 if len(ds.DataSource) == 0 { 82 log.Fatal("You have no data sources to explore.") 83 } 84 for _, d := range ds.DataSource { 85 format := "integer" 86 if d.DataType != nil && len(d.DataType.Field) > 0 { 87 f := d.DataType.Field[0] 88 format = f.Format 89 log.Printf("Data source %q, name %q is of type %q", d.DataStreamName, f.Name, format) 90 } else { 91 log.Printf("Data source %q is of type %q", d.DataStreamName, d.Type) 92 } 93 setID := fmt.Sprintf("%v-%v", minTime.UnixNano(), maxTime.UnixNano()) 94 data, err := svc.Users.DataSources.Datasets.Get("me", d.DataStreamId, setID).Do() 95 if err != nil { 96 log.Fatalf("Unable to retrieve user's data source stream %v, %v: %v", d.DataStreamId, setID, err) 97 } 98 for _, p := range data.Point { 99 for _, v := range p.Value { 100 t := millisToTime(p.ModifiedTimeMillis).Format(layout) 101 if format == "integer" { 102 log.Printf("data at %v = %v", t, v.IntVal) 103 } else { 104 log.Printf("data at %v = %v", t, v.FpVal) 105 } 106 } 107 } 108 } 109} 110