public AlarmInfo calculateMostImportantAlarm( RouteDataObject ro, Location loc, MetricsConstants mc, boolean showCameras) { boolean direction = true; if (loc.hasBearing()) { double diff = MapUtils.alignAngleDifference( ro.directionRoute(0, true) - loc.getBearing() / (2 * Math.PI)); direction = Math.abs(diff) < Math.PI; } float mxspeed = ro.getMaximumSpeed(direction); float delta = app.getSettings().SPEED_LIMIT_EXCEED.get() / 3.6f; AlarmInfo speedAlarm = createSpeedAlarm(mc, mxspeed, loc, delta); if (speedAlarm != null) { getVoiceRouter().announceSpeedAlarm(); return speedAlarm; } for (int i = 0; i < ro.getPointsLength(); i++) { int[] pointTypes = ro.getPointTypes(i); RouteRegion reg = ro.region; if (pointTypes != null) { for (int r = 0; r < pointTypes.length; r++) { RouteTypeRule typeRule = reg.quickGetEncodingRule(pointTypes[r]); AlarmInfo info = AlarmInfo.createAlarmInfo(typeRule, 0, loc); if (info != null) { if (info.getType() != AlarmInfoType.SPEED_CAMERA || showCameras) { long ms = System.currentTimeMillis(); if (ms - announcedAlarmTime > 50 * 1000) { announcedAlarmTime = ms; getVoiceRouter().announceAlarm(info.getType()); } return info; } } } } } return null; }