code: @WorkerThread
      private void processBeaconFromScan(@NonNull Beacon beacon) {
          if (Stats.getInstance().isEnabled()) {
              Stats.getInstance().log(beacon);
          }
          if (LogManager.isVerboseLoggingEnabled()) {
              LogManager.d(TAG,
                      "beacon detected : %s", beacon.toString());
          }
  
          beacon = mExtraDataBeaconTracker.track(beacon);
          // If this is a Gatt beacon that should be ignored, it will be set to null as a result of
          // the above
          if (beacon == null) {
              if (LogManager.isVerboseLoggingEnabled()) {
                  LogManager.d(TAG,
                          "not processing detections for GATT extra data beacon");
              }
          } else {
  
              mMonitoringStatus.updateNewlyInsideInRegionsContaining(beacon);
  
              List<Region> matchedRegions;
              Iterator<Region> matchedRegionIterator;
              LogManager.d(TAG, "looking for ranging region matches for this beacon");
              synchronized (mRangedRegionState) {
                  matchedRegions = matchingRegions(beacon, mRangedRegionState.keySet());
                  matchedRegionIterator = matchedRegions.iterator();
                  while (matchedRegionIterator.hasNext()) {
                      Region region = matchedRegionIterator.next();
                      LogManager.d(TAG, "matches ranging region: %s", region);
                      RangeState rangeState = mRangedRegionState.get(region);
                      if (rangeState != null) {
                          rangeState.addBeacon(beacon);
                      }
                  }
              }
          }
      }
docs: Helper for processing BLE beacons. This has been extracted from {@link ScanHelper.ScanProcessor} to
  support simulated scan data for test and debug environments.
  <p>
  Processing beacons is a frequent and expensive operation. It should not be run on the main
  thread to avoid UI contention.