1
2
3
4
5 package main
6
7 import (
8 "fmt"
9 "log"
10 "net/http"
11 "os"
12 "strings"
13 "time"
14
15 fitness "google.golang.org/api/fitness/v1"
16 )
17
18 const (
19 layout = "Jan 2, 2006 at 3:04pm"
20 nanosPerMilli = 1e6
21 )
22
23 func 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
36 func millisToTime(t int64) time.Time {
37 return time.Unix(0, t*nanosPerMilli)
38 }
39
40
41
42
43
44
45
46 func fitnessMain(client *http.Client, argv []string) {
47 if len(argv) != 0 {
48 fmt.Fprintln(os.Stderr, "Usage: fitness")
49 return
50 }
51
52 svc, err := fitness.New(client)
53 if err != nil {
54 log.Fatalf("Unable to create Fitness service: %v", err)
55 }
56
57 us, err := svc.Users.Sessions.List("me").Do()
58 if err != nil {
59 log.Fatalf("Unable to retrieve user's sessions: %v", err)
60 }
61 if len(us.Session) == 0 {
62 log.Fatal("You have no user sessions to explore.")
63 }
64
65 var minTime, maxTime time.Time
66 for _, s := range us.Session {
67 start := millisToTime(s.StartTimeMillis)
68 end := millisToTime(s.EndTimeMillis)
69 if minTime.IsZero() || start.Before(minTime) {
70 minTime = start
71 }
72 if maxTime.IsZero() || end.After(maxTime) {
73 maxTime = end
74 }
75 log.Printf("Session %q, %v - %v, activity type=%v", s.Name, start.Format(layout), end.Format(layout), s.ActivityType)
76 }
77
78 ds, err := svc.Users.DataSources.List("me").Do()
79 if err != nil {
80 log.Fatalf("Unable to retrieve user's data sources: %v", err)
81 }
82 if len(ds.DataSource) == 0 {
83 log.Fatal("You have no data sources to explore.")
84 }
85 for _, d := range ds.DataSource {
86 format := "integer"
87 if d.DataType != nil && len(d.DataType.Field) > 0 {
88 f := d.DataType.Field[0]
89 format = f.Format
90 log.Printf("Data source %q, name %q is of type %q", d.DataStreamName, f.Name, format)
91 } else {
92 log.Printf("Data source %q is of type %q", d.DataStreamName, d.Type)
93 }
94 setID := fmt.Sprintf("%v-%v", minTime.UnixNano(), maxTime.UnixNano())
95 data, err := svc.Users.DataSources.Datasets.Get("me", d.DataStreamId, setID).Do()
96 if err != nil {
97 log.Fatalf("Unable to retrieve user's data source stream %v, %v: %v", d.DataStreamId, setID, err)
98 }
99 for _, p := range data.Point {
100 for _, v := range p.Value {
101 t := millisToTime(p.ModifiedTimeMillis).Format(layout)
102 if format == "integer" {
103 log.Printf("data at %v = %v", t, v.IntVal)
104 } else {
105 log.Printf("data at %v = %v", t, v.FpVal)
106 }
107 }
108 }
109 }
110 }
111
View as plain text