diff --git a/www/android/health.js b/www/android/health.js index cb60d67a..d128742c 100755 --- a/www/android/health.js +++ b/www/android/health.js @@ -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]) },