/** Notifies the listener about possible region-based events */
  private void notifyListener() {

    IBeacon newNearestBeacon = null;

    if (_arrOrderedIBeacons.size() > 0) newNearestBeacon = _arrOrderedIBeacons.get(0);

    // Case 1: enter iBeacon region from nowhere
    if (_previousNearestIBeacon == null && newNearestBeacon != null) {
      _listener.enterRegion(newNearestBeacon);
      _previousNearestIBeacon = newNearestBeacon;
    }
    // Case 2: keep in the same iBeacon region, update proximity
    else if (_previousNearestIBeacon != null
        && newNearestBeacon != null
        && _previousNearestIBeacon.equals(newNearestBeacon)) {
      _previousNearestIBeacon = newNearestBeacon;
    }
    // Case 3: enter a different iBeacon region (roaming)
    else if (_previousNearestIBeacon != null
        && newNearestBeacon != null
        && !_previousNearestIBeacon.equals(newNearestBeacon)) {
      _listener.exitRegion(_previousNearestIBeacon);
      _listener.enterRegion(newNearestBeacon);
      _previousNearestIBeacon = newNearestBeacon;
    }
    // Case 4: leave iBeacon region
    else if (_previousNearestIBeacon != null && newNearestBeacon == null) {
      _listener.exitRegion(_previousNearestIBeacon);
      _previousNearestIBeacon = null;
    }
  }