From 18a54e288809787e2136958a8bd23dbb5d99e747 Mon Sep 17 00:00:00 2001 From: Dawit Gulino 20013954 <32634333+DawitG96@users.noreply.github.com> Date: Thu, 28 Jun 2018 16:42:27 +0200 Subject: [PATCH] Added new Class for FitBit and Fixes --- .gitignore | 1 + SeniorAssistant.iml | 1 + src/main/java/Main.java | 12 +-- src/main/java/manage/AuthFITBIT.java | 34 ++++--- src/main/java/manage/FITBITData/FitBit.java | 95 +++++++++++++++++++ .../java/manage/FITBITData/HeartRate.java | 13 ++- src/main/java/manage/FITBITData/Sleep.java | 11 ++- src/main/java/manage/FITBITData/Steps.java | 5 + 8 files changed, 149 insertions(+), 23 deletions(-) create mode 100644 src/main/java/manage/FITBITData/FitBit.java create mode 100644 src/main/java/manage/FITBITData/Steps.java diff --git a/.gitignore b/.gitignore index 2ae46c9..020929a 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ hs_err_pid* .idea/ .idea/*.xml .gradle/ +.iml # eclipse things # .classpath diff --git a/SeniorAssistant.iml b/SeniorAssistant.iml index 601138d..306ea4c 100644 --- a/SeniorAssistant.iml +++ b/SeniorAssistant.iml @@ -5,6 +5,7 @@ + diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 358e118..6878c2b 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -3,12 +3,12 @@ import manage.FITBITData.*; public class Main { public static void main(String[] args) throws Exception { - AuthFITBIT fitbit = new AuthFITBIT(); + FitBit fitBit = new FitBit(); + fitBit.getHoursSleep(); - HeartRate h = fitbit.run("https://api.fitbit.com/1/user/-/activities/heart/date/today/1d/1sec/time/11:00/11:45.json", HeartRate.class); - //Sleep s = fitbit.run("https://api.fitbit.com/1.2/user/-/sleep/date/today.json", Sleep.class); - Device dev = fitbit.run("https://api.fitbit.com/1/user/-/devices.json", Device.class); - - System.out.println(h.dateTime + " " + h.average); + System.out.println("Today's average heart-rate: "+fitBit.getHeartRate()); + System.out.println("Today's hours of sleep: "+fitBit.getHoursSleep()); + System.out.println("Today's steps: "+fitBit.getSteps()); + System.out.println("Fine."); } } diff --git a/src/main/java/manage/AuthFITBIT.java b/src/main/java/manage/AuthFITBIT.java index f5aac7c..df47eac 100644 --- a/src/main/java/manage/AuthFITBIT.java +++ b/src/main/java/manage/AuthFITBIT.java @@ -82,28 +82,36 @@ public class AuthFITBIT { return new AuthorizationCodeInstalledApp(flow, receiver).authorize( "user" ); } - public O run(String url, Class classe) throws IOException { + public O run(String url, Class returnClass) throws IOException { + return run(url, returnClass, false); + } + + public O run(String url, Class returnClass, boolean useAsParse) throws IOException { FITBITUrl fitbitUrl = new FITBITUrl(url); fitbitUrl.setFields(""); - GenericJson json; HttpRequest request = requestFactory.buildGetRequest(fitbitUrl); HttpResponse response = request.execute(); - O ret = null; - if (classe.equals(Device.class)) { - List> arr = response.parseAs(List.class); - Device dev = new Device(); - dev.getLastSyncTime(arr); + /* + GenericJson json = response.parseAs(GenericJson.class); + response.disconnect(); - ret = (O)dev; - } - else { - json = response.parseAs(GenericJson.class); - ret = mapper.readValue(json.toString(), classe); - } + System.out.println(returnClass.getSimpleName()); + System.out.println(url); + System.out.println(json.toPrettyString()); + + return mapper.readValue(json.toString(), returnClass); + */ + + /**/ + O ret = ( useAsParse ? + response.parseAs(returnClass) : + mapper.readValue(response.parseAs(GenericJson.class).toString(), returnClass) + ); response.disconnect(); return ret; + /**/ } } diff --git a/src/main/java/manage/FITBITData/FitBit.java b/src/main/java/manage/FITBITData/FitBit.java new file mode 100644 index 0000000..436e541 --- /dev/null +++ b/src/main/java/manage/FITBITData/FitBit.java @@ -0,0 +1,95 @@ +package manage.FITBITData; + +import manage.AuthFITBIT; + +import java.io.IOException; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +public class FitBit { + + public static final String BASIC_URL = "https://api.fitbit.com/"; + public static final String USER = "/user/-/"; + private static final long MINUTE = 60000; /* 5 minutes in millisec */ + + private final AuthFITBIT auth; + private final Map latestRequest = new HashMap<>(); + private final Calendar calendar = Calendar.getInstance(); + + private HeartRate heart = null; + private Sleep sleep = null; + private Steps steps = null; + + public FitBit() throws Exception { + this(new AuthFITBIT()); + } + + public FitBit(AuthFITBIT auth) { + if(auth == null) + throw new NullPointerException("I must have an Auth for the FitBit"); + this.auth = auth; + } + + /* passi */ + //https://api.fitbit.com/1/user/-/activities/steps/date/today.json + public int getSteps() throws IOException { + if(shouldUpdateFor(Steps.class)) { + long currentMillisec = System.currentTimeMillis(); + + steps = auth.run(BASIC_URL + "1" + USER + "activities/steps/date/today.json", Steps.class); + latestRequest.put(steps.getClass(), currentMillisec); + } + return 0; + } + + /* battito */ + public double getHeartRate() throws IOException { + if(shouldUpdateFor(HeartRate.class)) { + long currentMillisec = System.currentTimeMillis(); + + String now = getHourMinutes(currentMillisec); + String ago = getHourMinutes(currentMillisec-(MINUTE*15)); + + if(now.compareTo(ago) < 0) + ago = "00:00"; + + heart = auth.run(BASIC_URL + "1" + USER + "activities/heart/date/today/1d/1sec/time/"+ago+"/"+now+".json", HeartRate.class); + latestRequest.put(heart.getClass(), currentMillisec); + } + return heart.getAverage(); + } + + /* sonno */ + public Object getHoursSleep() throws IOException { + if(shouldUpdateFor(Sleep.class)) { + long currentMillisec = System.currentTimeMillis(); + + sleep = auth.run(BASIC_URL + "1.2" + USER + "sleep/date/today.json", Sleep.class); + latestRequest.put(sleep.getClass(), currentMillisec); + } + return sleep.getMinutesAsleep(); + } + + private boolean shouldUpdateFor(Class type) { + try { + long current = System.currentTimeMillis(); + long latest = latestRequest.get(type); + + if (current - latest > MINUTE * 5) + return true; + return false; + } catch (NullPointerException e) {} + return true; + } + + private String getHourMinutes(long milliseconds) { + calendar.setTimeInMillis(milliseconds); + + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minu = calendar.get(Calendar.MINUTE); + return String.format("%02d:%02d", hour, minu); + } + + // Device dev = auth.run(BASIC_URL + "devices.json", Device.class); +} diff --git a/src/main/java/manage/FITBITData/HeartRate.java b/src/main/java/manage/FITBITData/HeartRate.java index 0e59062..584544a 100644 --- a/src/main/java/manage/FITBITData/HeartRate.java +++ b/src/main/java/manage/FITBITData/HeartRate.java @@ -9,8 +9,12 @@ import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) public class HeartRate { - public String dateTime; - public double average; + private String dateTime; + private double average; + + public double getAverage() { + return average; + } @JsonProperty("activities-heart") public void quelloCheVoglio(Map[] activities){ @@ -18,12 +22,15 @@ public class HeartRate { } @JsonProperty("activities-heart-intraday") - public void qualcosAltro(Map map) { + public void setAverage(Map map) { List data = (List) map.get("dataset"); int sum = 0; for(Map dat: data) sum += (int)dat.get("value"); average = ((double)sum)/data.size(); + + if(data.size() == 0) + average = 0; } } diff --git a/src/main/java/manage/FITBITData/Sleep.java b/src/main/java/manage/FITBITData/Sleep.java index f7e1191..8e4eecc 100644 --- a/src/main/java/manage/FITBITData/Sleep.java +++ b/src/main/java/manage/FITBITData/Sleep.java @@ -3,10 +3,19 @@ package manage.FITBITData; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Map; + @JsonIgnoreProperties(ignoreUnknown = true) public class Sleep { - public String time; + private int minutesAsleep; + public int getMinutesAsleep() { + return minutesAsleep; + } + @JsonProperty("summary") + public void setMinutesAsleep(Map map) { + minutesAsleep = (int) map.get("totalMinutesAsleep"); + } } diff --git a/src/main/java/manage/FITBITData/Steps.java b/src/main/java/manage/FITBITData/Steps.java new file mode 100644 index 0000000..f71461f --- /dev/null +++ b/src/main/java/manage/FITBITData/Steps.java @@ -0,0 +1,5 @@ +package manage.FITBITData; + +public class Steps { + +}