package com.jakehilborn.speedr.heremaps; import com.jakehilborn.speedr.StatsCalculator; import com.jakehilborn.speedr.heremaps.deserial.HereMapsResponse; import com.jakehilborn.speedr.utils.UnitUtils; public class HereMapsManager { private final StatsCalculator statsCalculator; private String prevRoadName; private boolean prevLimitMissing; public HereMapsManager(StatsCalculator statsCalculator) { this.statsCalculator = statsCalculator; } public void handleResponse(HereMapsResponse hereMapsResponse, Double lat, Double lon, boolean isUseKph) { String roadName = hereMapsResponse.getResponse().getLink()[0].getRoadName(); if (roadName == null) roadName = ""; Double limit = parseLimit(hereMapsResponse.getResponse().getLink()[0].getSpeedLimit(), isUseKph); if (limit == null) limit = 0D; if (limit == 0) { if (prevLimitMissing) { //Two responses in a row with no speed limit data, set limit to missing. statsCalculator.setLimit(0D, lat, lon); } else { //Don't set limit to missing just yet, wait for the next retry. prevLimitMissing = true; statsCalculator.setLimit(null, lat, lon); } } else if (prevRoadName == null || roadName.equals(prevRoadName) || prevLimitMissing) { //Normal case, user is on the same road. prevRoadName = roadName; prevLimitMissing = false; statsCalculator.setLimit(limit, lat, lon); } else { //User changed roads, is currently in intersection, or at an overpass. Since HERE only returns the limit of //the one road it thinks you're on we will force a refetch. Don't set limit to missing in case we're only in an //intersection or near an overpass. prevRoadName = roadName; prevLimitMissing = false; statsCalculator.setForceLimitStale(true); } } private Double parseLimit(Double limit, boolean isUseKph) { //Round Here maps slightly inaccurate speed limit data to nearest 5mph or 5kmh increment. if (isUseKph) { Integer roundedLimit = UnitUtils.msToKphRoundToFive(limit); return UnitUtils.kphToMs(roundedLimit); } else { //mph Integer roundedLimit = UnitUtils.msToMphRoundToFive(limit); return UnitUtils.mphToMs(roundedLimit); } } }