Skip to content

v2.5.0

Latest

Choose a tag to compare

@github-actions github-actions released this 27 Jul 20:36

What's Changed

  • Adds the connectionStatus field to the LTE and NR record messages: a string enum (UNKNOWN, PRIMARY_SERVING, SECONDARY_SERVING, NEIGHBOR) sourced from Android's CellInfo.getCellConnectionStatus() (API 28+). This makes cells the device is actively connected to as a secondary distinguishable from neighbors, which the servingCell boolean cannot express: the 5G NSA (EN-DC) secondary NR cell has servingCell=false even though the device is actively using it. The enum value NEIGHBOR corresponds to Android's CONNECTION_NONE (a measured but unconnected cell). A SECONDARY_SERVING cell whose scan group's PRIMARY_SERVING cell is the same radio technology is a carrier aggregation SCell; where the group's primary is a different radio technology it is a dual connectivity secondary leg (e.g. a SECONDARY_SERVING NR record in a group whose primary is LTE is the 5G NSA data leg). Presence and trust rules: the protobuf enum's zero value never serializes, so an absent field and UNKNOWN are indistinguishable and both mean the device did not report a status; servingCell remains the primary serving-versus-neighbor discriminator, and connectionStatus is a refinement layered on top that is authoritative only for its positive SECONDARY_SERVING assertion. Note that shipping Android devices do not expose LTE carrier aggregation SCells as separate cells, so SECONDARY_SERVING is rare on an LTE record and must not be used as a carrier aggregation indicator; use cellBandwidthsKhz for that.
  • Adds the cellBandwidthsKhz field to the LTE and NR record messages: the per-carrier channel bandwidths, in kHz, of the device's cellular data connection at the time of the scan, from Android's ServiceState.getCellBandwidths() (API 28+). Two or more entries means carrier aggregation was active and the sum is the aggregate downlink bandwidth. The field is device-level connection state stamped only on the records for cells the device was actively using (servingCell=true or SECONDARY_SERVING) and is omitted on neighbor records. The producer filters invalid platform sentinel values, so every entry is a valid bandwidth. An absent or empty array means the device did not report bandwidths and must not be read as "no carrier aggregation": some devices report nothing, or only the primary carrier, while aggregating.

Full Changelog: v2.4.0...v2.5.0