Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 38 additions & 68 deletions www/android/health.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,79 +34,49 @@ module.exports = {
opts.startDate = opts.startDate.getTime()
if (opts.endDate && (typeof opts.endDate == 'object'))
opts.endDate = opts.endDate.getTime();
const subQuery = (param, startDate, endDate) => {
return new Promise((resolve, reject) => {
this.queryAggregated({
startDate: startDate,
endDate: endDate,
dataType: param
},
(result) => resolve(result.value),
(error) => reject(error));
});
}
exec((data) => {
// here we use a recursive function instead of a simple loop
// this is to deal with additional queries required for the special case
// of activity with calories and/or distance
finalizeResult = (i) => {
if (i >= data.length) {
// completed, return results
onSuccess(data);
} else {
// iterate
// convert timestamps to date
if (data[i].startDate) data[i].startDate = new Date(data[i].startDate)
if (data[i].endDate) data[i].endDate = new Date(data[i].endDate)

if (opts.dataType == 'sleep' && opts.sleepSession) {
// convert start and end dates for single stages
for (let stageI = 0; stageI < data[i].value.length; stageI++) {
data[i].value[stageI].startDate = new Date(data[i].value[stageI].startDate)
data[i].value[stageI].endDate = new Date(data[i].value[stageI].endDate)
}
}

if (opts.dataType == 'activity' && (opts.includeCalories || opts.includeDistance)) {
// we need to also fetch calories and/or distance

// helper function to get aggregated calories for that activity
getCals = (onDone) => {
this.queryAggregated({
startDate: data[i].startDate,
endDate: data[i].endDate,
dataType: 'calories.active'
}, (cals) => {
data[i].calories = cals.value
onDone()
}, onError)
}
// helper function to get aggregated distance for that activity
getDist = (onDone) => {
this.queryAggregated({
startDate: data[i].startDate,
endDate: data[i].endDate,
dataType: 'distance'
}, (dist) => {
data[i].distance = dist.value
onDone()
}, onError)
}

if (opts.includeCalories) {
// calories are needed, fetch them
getCals(() => {
// now get the distance, if needed
if (opts.includeDistance) {
getDist(() => {
finalizeResult(i + 1)
})
} else {
// no distance needed, move on
finalizeResult(i + 1)
}
})
} else {
// distance only is needed
getDist(() => {
finalizeResult(i + 1)
})
data.map(async (item) => {
if (item.startDate) item.startDate = new Date(item.startDate);
if (item.endDate) item.endDate = new Date(item.endDate);

if (opts.dataType == 'sleep' && opts.sleepSession) {
// convert start and end dates for single stages
item.value.map((stage) => {
stage.startDate = new Date(stage.startDate);
stage.endDate = new Date(stage.endDate);
});
}
if (opts.dataType == 'activity' && (opts.includeCalories || opts.includeDistance)) {
// we need to also fetch calories and/or distance
if (opts.includeCalories) {
// calories are needed, fetch them
try {
item.calories = await subQuery('calories.active', item.startDate, item.endDate)
} catch (error) {
onError(error);
}
} else {
finalizeResult(i + 1)
// distance only is needed
try {
item.distance = await subQuery('distance', item.startDate, item.endDate)
} catch (error) {
onError(error);
}
}
}
}
finalizeResult(0);
});
onSuccess(data);
}, onError, "health", "query", [opts])
},

Expand Down