What's Changed
- Adds the
connectionStatusfield to the LTE and NR record messages: a string enum (UNKNOWN,PRIMARY_SERVING,SECONDARY_SERVING,NEIGHBOR) sourced from Android'sCellInfo.getCellConnectionStatus()(API 28+). This makes cells the device is actively connected to as a secondary distinguishable from neighbors, which theservingCellboolean cannot express: the 5G NSA (EN-DC) secondary NR cell hasservingCell=falseeven though the device is actively using it. The enum valueNEIGHBORcorresponds to Android'sCONNECTION_NONE(a measured but unconnected cell). ASECONDARY_SERVINGcell whose scan group'sPRIMARY_SERVINGcell 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. aSECONDARY_SERVINGNR 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 andUNKNOWNare indistinguishable and both mean the device did not report a status;servingCellremains the primary serving-versus-neighbor discriminator, andconnectionStatusis a refinement layered on top that is authoritative only for its positiveSECONDARY_SERVINGassertion. Note that shipping Android devices do not expose LTE carrier aggregation SCells as separate cells, soSECONDARY_SERVINGis rare on an LTE record and must not be used as a carrier aggregation indicator; usecellBandwidthsKhzfor that. - Adds the
cellBandwidthsKhzfield 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'sServiceState.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=trueorSECONDARY_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