1 package org.robolectric.shadows; 2 3 import android.net.wifi.WifiUsabilityStatsEntry; 4 import android.net.wifi.WifiUsabilityStatsEntry.ContentionTimeStats; 5 import android.net.wifi.WifiUsabilityStatsEntry.RadioStats; 6 import android.net.wifi.WifiUsabilityStatsEntry.RateStats; 7 import android.os.Build.VERSION_CODES; 8 import android.util.SparseArray; 9 import org.robolectric.RuntimeEnvironment; 10 import org.robolectric.util.ReflectionHelpers; 11 import org.robolectric.util.ReflectionHelpers.ClassParameter; 12 import org.robolectric.versioning.AndroidVersions.Baklava; 13 14 /** Builder for {@link WifiUsabilityStatsEntry}. */ 15 public class WifiUsabilityStatsEntryBuilder { 16 private long timeStampMillis; 17 private int rssi; 18 private int linkSpeedMbps; 19 private long totalTxSuccess; 20 private long totalTxRetries; 21 private long totalTxBad; 22 private long totalRxSuccess; 23 private long totalRadioOnTimeMillis; 24 private long totalRadioTxTimeMillis; 25 private long totalRadioRxTimeMillis; 26 private long totalScanTimeMillis; 27 private long totalNanScanTimeMillis; 28 private long totalBackgroundScanTimeMillis; 29 private long totalRoamScanTimeMillis; 30 private long totalPnoScanTimeMillis; 31 private long totalHotspot2ScanTimeMillis; 32 private long totalCcaBusyFreqTimeMillis; 33 private long totalRadioOnFreqTimeMillis; 34 private long totalBeaconRx; 35 private int probeStatusSinceLastUpdate; 36 private int probeElapsedTimeSinceLastUpdateMillis; 37 private int probeMcsRateSinceLastUpdate; 38 private int rxLinkSpeedMbps; 39 private int timeSliceDutyCycleInPercent; 40 private static final int CHANNEL_UTILIZATION_RATIO = 0; 41 private boolean isThroughputSufficient = true; 42 private boolean isWifiScoringEnabled = true; 43 private boolean isCellularDataAvailable = true; 44 private int cellularDataNetworkType; 45 private int cellularSignalStrengthDbm; 46 private int cellularSignalStrengthDb; 47 private boolean isSameRegisteredCell; 48 build()49 public WifiUsabilityStatsEntry build() { 50 if (RuntimeEnvironment.getApiLevel() <= VERSION_CODES.R) { 51 return ReflectionHelpers.callConstructor( 52 WifiUsabilityStatsEntry.class, 53 ClassParameter.from(long.class, timeStampMillis), 54 ClassParameter.from(int.class, rssi), 55 ClassParameter.from(int.class, linkSpeedMbps), 56 ClassParameter.from(long.class, totalTxSuccess), 57 ClassParameter.from(long.class, totalTxRetries), 58 ClassParameter.from(long.class, totalTxBad), 59 ClassParameter.from(long.class, totalRxSuccess), 60 ClassParameter.from(long.class, totalRadioOnTimeMillis), 61 ClassParameter.from(long.class, totalRadioTxTimeMillis), 62 ClassParameter.from(long.class, totalRadioRxTimeMillis), 63 ClassParameter.from(long.class, totalScanTimeMillis), 64 ClassParameter.from(long.class, totalNanScanTimeMillis), 65 ClassParameter.from(long.class, totalBackgroundScanTimeMillis), 66 ClassParameter.from(long.class, totalRoamScanTimeMillis), 67 ClassParameter.from(long.class, totalPnoScanTimeMillis), 68 ClassParameter.from(long.class, totalHotspot2ScanTimeMillis), 69 ClassParameter.from(long.class, totalCcaBusyFreqTimeMillis), 70 ClassParameter.from(long.class, totalRadioOnFreqTimeMillis), 71 ClassParameter.from(long.class, totalBeaconRx), 72 ClassParameter.from(int.class, probeStatusSinceLastUpdate), 73 ClassParameter.from(int.class, probeElapsedTimeSinceLastUpdateMillis), 74 ClassParameter.from(int.class, probeMcsRateSinceLastUpdate), 75 ClassParameter.from(int.class, rxLinkSpeedMbps), 76 ClassParameter.from(int.class, cellularDataNetworkType), 77 ClassParameter.from(int.class, cellularSignalStrengthDbm), 78 ClassParameter.from(int.class, cellularSignalStrengthDb), 79 ClassParameter.from(boolean.class, isSameRegisteredCell)); 80 } else if (RuntimeEnvironment.getApiLevel() >= Baklava.SDK_INT) { 81 return ReflectionHelpers.callConstructor( 82 WifiUsabilityStatsEntry.class, 83 ClassParameter.from(long.class, timeStampMillis), 84 ClassParameter.from(int.class, rssi), 85 ClassParameter.from(int.class, linkSpeedMbps), 86 ClassParameter.from(long.class, totalTxSuccess), 87 ClassParameter.from(long.class, totalTxRetries), 88 ClassParameter.from(long.class, totalTxBad), 89 ClassParameter.from(long.class, totalRxSuccess), 90 ClassParameter.from(long.class, totalRadioOnTimeMillis), 91 ClassParameter.from(long.class, totalRadioTxTimeMillis), 92 ClassParameter.from(long.class, totalRadioRxTimeMillis), 93 ClassParameter.from(long.class, totalScanTimeMillis), 94 ClassParameter.from(long.class, totalNanScanTimeMillis), 95 ClassParameter.from(long.class, totalBackgroundScanTimeMillis), 96 ClassParameter.from(long.class, totalRoamScanTimeMillis), 97 ClassParameter.from(long.class, totalPnoScanTimeMillis), 98 ClassParameter.from(long.class, totalHotspot2ScanTimeMillis), 99 ClassParameter.from(long.class, totalCcaBusyFreqTimeMillis), 100 ClassParameter.from(long.class, totalRadioOnFreqTimeMillis), 101 ClassParameter.from(long.class, totalBeaconRx), 102 ClassParameter.from(int.class, probeStatusSinceLastUpdate), 103 ClassParameter.from(int.class, probeElapsedTimeSinceLastUpdateMillis), 104 ClassParameter.from(int.class, probeMcsRateSinceLastUpdate), 105 ClassParameter.from(int.class, rxLinkSpeedMbps), 106 ClassParameter.from(int.class, timeSliceDutyCycleInPercent), 107 ClassParameter.from(ContentionTimeStats[].class, new ContentionTimeStats[] {}), 108 ClassParameter.from(RateStats[].class, new RateStats[] {}), 109 ClassParameter.from(RadioStats[].class, new RadioStats[] {}), 110 ClassParameter.from(int.class, CHANNEL_UTILIZATION_RATIO), 111 ClassParameter.from(boolean.class, isThroughputSufficient), 112 ClassParameter.from(boolean.class, isWifiScoringEnabled), 113 ClassParameter.from(boolean.class, isCellularDataAvailable), 114 ClassParameter.from(int.class, cellularDataNetworkType), 115 ClassParameter.from(int.class, cellularSignalStrengthDbm), 116 ClassParameter.from(int.class, cellularSignalStrengthDb), 117 ClassParameter.from(boolean.class, isSameRegisteredCell), 118 ClassParameter.from(SparseArray.class, new SparseArray<>()), 119 /* new in post V */ 120 ClassParameter.from(int.class, 0), 121 ClassParameter.from(int.class, 0), 122 ClassParameter.from(long.class, 0), 123 ClassParameter.from(long.class, 0), 124 ClassParameter.from(int.class, 0), 125 ClassParameter.from(int.class, 0), 126 ClassParameter.from(int.class, 0), 127 ClassParameter.from(int.class, 0), 128 ClassParameter.from(int.class, 0), 129 ClassParameter.from(int.class, 0), 130 ClassParameter.from(boolean.class, false), 131 ClassParameter.from(int.class, 0), 132 ClassParameter.from(boolean.class, false), 133 ClassParameter.from(int.class, 0), 134 ClassParameter.from(int.class, 0), 135 ClassParameter.from(int.class, 0), 136 ClassParameter.from(int.class, 0), 137 ClassParameter.from(int.class, 0) 138 /* end new in post V */ 139 ); 140 } else if (RuntimeEnvironment.getApiLevel() > VERSION_CODES.TIRAMISU) { 141 return ReflectionHelpers.callConstructor( 142 WifiUsabilityStatsEntry.class, 143 ClassParameter.from(long.class, timeStampMillis), 144 ClassParameter.from(int.class, rssi), 145 ClassParameter.from(int.class, linkSpeedMbps), 146 ClassParameter.from(long.class, totalTxSuccess), 147 ClassParameter.from(long.class, totalTxRetries), 148 ClassParameter.from(long.class, totalTxBad), 149 ClassParameter.from(long.class, totalRxSuccess), 150 ClassParameter.from(long.class, totalRadioOnTimeMillis), 151 ClassParameter.from(long.class, totalRadioTxTimeMillis), 152 ClassParameter.from(long.class, totalRadioRxTimeMillis), 153 ClassParameter.from(long.class, totalScanTimeMillis), 154 ClassParameter.from(long.class, totalNanScanTimeMillis), 155 ClassParameter.from(long.class, totalBackgroundScanTimeMillis), 156 ClassParameter.from(long.class, totalRoamScanTimeMillis), 157 ClassParameter.from(long.class, totalPnoScanTimeMillis), 158 ClassParameter.from(long.class, totalHotspot2ScanTimeMillis), 159 ClassParameter.from(long.class, totalCcaBusyFreqTimeMillis), 160 ClassParameter.from(long.class, totalRadioOnFreqTimeMillis), 161 ClassParameter.from(long.class, totalBeaconRx), 162 ClassParameter.from(int.class, probeStatusSinceLastUpdate), 163 ClassParameter.from(int.class, probeElapsedTimeSinceLastUpdateMillis), 164 ClassParameter.from(int.class, probeMcsRateSinceLastUpdate), 165 ClassParameter.from(int.class, rxLinkSpeedMbps), 166 ClassParameter.from(int.class, timeSliceDutyCycleInPercent), // new in T 167 ClassParameter.from( 168 ContentionTimeStats[].class, new ContentionTimeStats[] {}), // new in T 169 ClassParameter.from(RateStats[].class, new RateStats[] {}), // new in T 170 ClassParameter.from(RadioStats[].class, new RadioStats[] {}), // new in T 171 ClassParameter.from(int.class, CHANNEL_UTILIZATION_RATIO), // new in T 172 ClassParameter.from(boolean.class, isThroughputSufficient), // new in T 173 ClassParameter.from(boolean.class, isWifiScoringEnabled), // new in T 174 ClassParameter.from(boolean.class, isCellularDataAvailable), // new in T 175 ClassParameter.from(int.class, cellularDataNetworkType), 176 ClassParameter.from(int.class, cellularSignalStrengthDbm), 177 ClassParameter.from(int.class, cellularSignalStrengthDb), 178 ClassParameter.from(boolean.class, isSameRegisteredCell), 179 ClassParameter.from(SparseArray.class, new SparseArray<>())); // new in >T 180 } else { 181 return ReflectionHelpers.callConstructor( 182 WifiUsabilityStatsEntry.class, 183 ClassParameter.from(long.class, timeStampMillis), 184 ClassParameter.from(int.class, rssi), 185 ClassParameter.from(int.class, linkSpeedMbps), 186 ClassParameter.from(long.class, totalTxSuccess), 187 ClassParameter.from(long.class, totalTxRetries), 188 ClassParameter.from(long.class, totalTxBad), 189 ClassParameter.from(long.class, totalRxSuccess), 190 ClassParameter.from(long.class, totalRadioOnTimeMillis), 191 ClassParameter.from(long.class, totalRadioTxTimeMillis), 192 ClassParameter.from(long.class, totalRadioRxTimeMillis), 193 ClassParameter.from(long.class, totalScanTimeMillis), 194 ClassParameter.from(long.class, totalNanScanTimeMillis), 195 ClassParameter.from(long.class, totalBackgroundScanTimeMillis), 196 ClassParameter.from(long.class, totalRoamScanTimeMillis), 197 ClassParameter.from(long.class, totalPnoScanTimeMillis), 198 ClassParameter.from(long.class, totalHotspot2ScanTimeMillis), 199 ClassParameter.from(long.class, totalCcaBusyFreqTimeMillis), 200 ClassParameter.from(long.class, totalRadioOnFreqTimeMillis), 201 ClassParameter.from(long.class, totalBeaconRx), 202 ClassParameter.from(int.class, probeStatusSinceLastUpdate), 203 ClassParameter.from(int.class, probeElapsedTimeSinceLastUpdateMillis), 204 ClassParameter.from(int.class, probeMcsRateSinceLastUpdate), 205 ClassParameter.from(int.class, rxLinkSpeedMbps), 206 ClassParameter.from(int.class, timeSliceDutyCycleInPercent), // new in T 207 ClassParameter.from( 208 ContentionTimeStats[].class, new ContentionTimeStats[] {}), // new in T 209 ClassParameter.from(RateStats[].class, new RateStats[] {}), // new in T 210 ClassParameter.from(RadioStats[].class, new RadioStats[] {}), // new in T 211 ClassParameter.from(int.class, CHANNEL_UTILIZATION_RATIO), // new in T 212 ClassParameter.from(boolean.class, isThroughputSufficient), // new in T 213 ClassParameter.from(boolean.class, isWifiScoringEnabled), // new in T 214 ClassParameter.from(boolean.class, isCellularDataAvailable), // new in T 215 ClassParameter.from(int.class, cellularDataNetworkType), 216 ClassParameter.from(int.class, cellularSignalStrengthDbm), 217 ClassParameter.from(int.class, cellularSignalStrengthDb), 218 ClassParameter.from(boolean.class, isSameRegisteredCell)); 219 } 220 } 221 setTimeStampMillis(long timeStampMillis)222 public WifiUsabilityStatsEntryBuilder setTimeStampMillis(long timeStampMillis) { 223 this.timeStampMillis = timeStampMillis; 224 return this; 225 } 226 setRssi(int rssi)227 public WifiUsabilityStatsEntryBuilder setRssi(int rssi) { 228 this.rssi = rssi; 229 return this; 230 } 231 setLinkSpeedMbps(int linkSpeedMbps)232 public WifiUsabilityStatsEntryBuilder setLinkSpeedMbps(int linkSpeedMbps) { 233 this.linkSpeedMbps = linkSpeedMbps; 234 return this; 235 } 236 setTotalTxSuccess(long totalTxSuccess)237 public WifiUsabilityStatsEntryBuilder setTotalTxSuccess(long totalTxSuccess) { 238 this.totalTxSuccess = totalTxSuccess; 239 return this; 240 } 241 setTotalTxRetries(long totalTxRetries)242 public WifiUsabilityStatsEntryBuilder setTotalTxRetries(long totalTxRetries) { 243 this.totalTxRetries = totalTxRetries; 244 return this; 245 } 246 setTotalTxBad(long totalTxBad)247 public WifiUsabilityStatsEntryBuilder setTotalTxBad(long totalTxBad) { 248 this.totalTxBad = totalTxBad; 249 return this; 250 } 251 setTotalRxSuccess(long totalRxSuccess)252 public WifiUsabilityStatsEntryBuilder setTotalRxSuccess(long totalRxSuccess) { 253 this.totalRxSuccess = totalRxSuccess; 254 return this; 255 } 256 setTotalRadioOnTimeMillis(long totalRadioOnTimeMillis)257 public WifiUsabilityStatsEntryBuilder setTotalRadioOnTimeMillis(long totalRadioOnTimeMillis) { 258 this.totalRadioOnTimeMillis = totalRadioOnTimeMillis; 259 return this; 260 } 261 setTotalRadioTxTimeMillis(long totalRadioTxTimeMillis)262 public WifiUsabilityStatsEntryBuilder setTotalRadioTxTimeMillis(long totalRadioTxTimeMillis) { 263 this.totalRadioTxTimeMillis = totalRadioTxTimeMillis; 264 return this; 265 } 266 setTotalRadioRxTimeMillis(long totalRadioRxTimeMillis)267 public WifiUsabilityStatsEntryBuilder setTotalRadioRxTimeMillis(long totalRadioRxTimeMillis) { 268 this.totalRadioRxTimeMillis = totalRadioRxTimeMillis; 269 return this; 270 } 271 setTotalScanTimeMillis(long totalScanTimeMillis)272 public WifiUsabilityStatsEntryBuilder setTotalScanTimeMillis(long totalScanTimeMillis) { 273 this.totalScanTimeMillis = totalScanTimeMillis; 274 return this; 275 } 276 setTotalNanScanTimeMillis(long totalNanScanTimeMillis)277 public WifiUsabilityStatsEntryBuilder setTotalNanScanTimeMillis(long totalNanScanTimeMillis) { 278 this.totalNanScanTimeMillis = totalNanScanTimeMillis; 279 return this; 280 } 281 setTotalBackgroundScanTimeMillis( long totalBackgroundScanTimeMillis)282 public WifiUsabilityStatsEntryBuilder setTotalBackgroundScanTimeMillis( 283 long totalBackgroundScanTimeMillis) { 284 this.totalBackgroundScanTimeMillis = totalBackgroundScanTimeMillis; 285 return this; 286 } 287 setTotalRoamScanTimeMillis(long totalRoamScanTimeMillis)288 public WifiUsabilityStatsEntryBuilder setTotalRoamScanTimeMillis(long totalRoamScanTimeMillis) { 289 this.totalRoamScanTimeMillis = totalRoamScanTimeMillis; 290 return this; 291 } 292 setTotalPnoScanTimeMillis(long totalPnoScanTimeMillis)293 public WifiUsabilityStatsEntryBuilder setTotalPnoScanTimeMillis(long totalPnoScanTimeMillis) { 294 this.totalPnoScanTimeMillis = totalPnoScanTimeMillis; 295 return this; 296 } 297 setTotalHotspot2ScanTimeMillis( long totalHotspot2ScanTimeMillis)298 public WifiUsabilityStatsEntryBuilder setTotalHotspot2ScanTimeMillis( 299 long totalHotspot2ScanTimeMillis) { 300 this.totalHotspot2ScanTimeMillis = totalHotspot2ScanTimeMillis; 301 return this; 302 } 303 setTotalCcaBusyFreqTimeMillis( long totalCcaBusyFreqTimeMillis)304 public WifiUsabilityStatsEntryBuilder setTotalCcaBusyFreqTimeMillis( 305 long totalCcaBusyFreqTimeMillis) { 306 this.totalCcaBusyFreqTimeMillis = totalCcaBusyFreqTimeMillis; 307 return this; 308 } 309 setTotalRadioOnFreqTimeMillis( long totalRadioOnFreqTimeMillis)310 public WifiUsabilityStatsEntryBuilder setTotalRadioOnFreqTimeMillis( 311 long totalRadioOnFreqTimeMillis) { 312 this.totalRadioOnFreqTimeMillis = totalRadioOnFreqTimeMillis; 313 return this; 314 } 315 setTotalBeaconRx(long totalBeaconRx)316 public WifiUsabilityStatsEntryBuilder setTotalBeaconRx(long totalBeaconRx) { 317 this.totalBeaconRx = totalBeaconRx; 318 return this; 319 } 320 setProbeStatusSinceLastUpdate( int probeStatusSinceLastUpdate)321 public WifiUsabilityStatsEntryBuilder setProbeStatusSinceLastUpdate( 322 int probeStatusSinceLastUpdate) { 323 this.probeStatusSinceLastUpdate = probeStatusSinceLastUpdate; 324 return this; 325 } 326 setProbeElapsedTimeSinceLastUpdateMillis( int probeElapsedTimeSinceLastUpdateMillis)327 public WifiUsabilityStatsEntryBuilder setProbeElapsedTimeSinceLastUpdateMillis( 328 int probeElapsedTimeSinceLastUpdateMillis) { 329 this.probeElapsedTimeSinceLastUpdateMillis = probeElapsedTimeSinceLastUpdateMillis; 330 return this; 331 } 332 setProbeMcsRateSinceLastUpdate( int probeMcsRateSinceLastUpdate)333 public WifiUsabilityStatsEntryBuilder setProbeMcsRateSinceLastUpdate( 334 int probeMcsRateSinceLastUpdate) { 335 this.probeMcsRateSinceLastUpdate = probeMcsRateSinceLastUpdate; 336 return this; 337 } 338 setRxLinkSpeedMbps(int rxLinkSpeedMbps)339 public WifiUsabilityStatsEntryBuilder setRxLinkSpeedMbps(int rxLinkSpeedMbps) { 340 this.rxLinkSpeedMbps = rxLinkSpeedMbps; 341 return this; 342 } 343 setCellularDataNetworkType(int cellularDataNetworkType)344 public WifiUsabilityStatsEntryBuilder setCellularDataNetworkType(int cellularDataNetworkType) { 345 this.cellularDataNetworkType = cellularDataNetworkType; 346 return this; 347 } 348 setCellularSignalStrengthDbm( int cellularSignalStrengthDbm)349 public WifiUsabilityStatsEntryBuilder setCellularSignalStrengthDbm( 350 int cellularSignalStrengthDbm) { 351 this.cellularSignalStrengthDbm = cellularSignalStrengthDbm; 352 return this; 353 } 354 setCellularSignalStrengthDb(int cellularSignalStrengthDb)355 public WifiUsabilityStatsEntryBuilder setCellularSignalStrengthDb(int cellularSignalStrengthDb) { 356 this.cellularSignalStrengthDb = cellularSignalStrengthDb; 357 return this; 358 } 359 setSameRegisteredCell(boolean sameRegisteredCell)360 public WifiUsabilityStatsEntryBuilder setSameRegisteredCell(boolean sameRegisteredCell) { 361 isSameRegisteredCell = sameRegisteredCell; 362 return this; 363 } 364 setTimeSliceDutyCycleInPercent(int percent)365 public WifiUsabilityStatsEntryBuilder setTimeSliceDutyCycleInPercent(int percent) { 366 this.timeSliceDutyCycleInPercent = percent; 367 return this; 368 } 369 setIsCellularDataAvailable(boolean avail)370 public WifiUsabilityStatsEntryBuilder setIsCellularDataAvailable(boolean avail) { 371 this.isCellularDataAvailable = avail; 372 return this; 373 } 374 setIsThroughputSufficient(boolean sufficient)375 public WifiUsabilityStatsEntryBuilder setIsThroughputSufficient(boolean sufficient) { 376 this.isThroughputSufficient = sufficient; 377 return this; 378 } 379 setIsWifiScoringEnabled(boolean enabled)380 public WifiUsabilityStatsEntryBuilder setIsWifiScoringEnabled(boolean enabled) { 381 this.isWifiScoringEnabled = enabled; 382 return this; 383 } 384 } 385