public void onSignaling(String imsi, long time, String loc, String cell) { boolean isInside = KbUtils.getInstance().isInside(loc, cell); for (MetricsDetector detector : detectors) { if (isInside) { detector.in(imsi, time); } else { detector.out(imsi, time); } } if (workers.contains(imsi)) { if (tourists.contains(imsi)) { tourists.remove(imsi); listener.removeTourist(imsi, time); } } else { OrderedTimeWindow.Event<StayTimeDetector.Status> lastEvent = null; for (MetricsDetector detector : detectors) { OrderedTimeWindow.Event<StayTimeDetector.Status> event = detector.getLastEvent(imsi); if (lastEvent == null || (event != null && lastEvent.time < event.time)) { lastEvent = event; } } if (lastEvent != null && lastEvent.data == StayTimeDetector.Status.IN) { if (!workers.contains(imsi)) { if (!tourists.contains(imsi)) { tourists.add(imsi); listener.addTourist(imsi, time); } } } else { if (!workers.contains(imsi)) { if (tourists.contains(imsi)) { tourists.remove(imsi); listener.removeTourist(imsi, time); } } } } }