1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.internal.telephony.metrics; 18 19 import static com.android.internal.telephony.TelephonyStatsLog.CARRIER_ID_TABLE_VERSION; 20 import static com.android.internal.telephony.TelephonyStatsLog.CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS; 21 import static com.android.internal.telephony.TelephonyStatsLog.CARRIER_ROAMING_SATELLITE_SESSION; 22 import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_DATA_SERVICE_SWITCH; 23 import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_SERVICE_STATE; 24 import static com.android.internal.telephony.TelephonyStatsLog.DATA_CALL_SESSION; 25 import static com.android.internal.telephony.TelephonyStatsLog.DATA_NETWORK_VALIDATION; 26 import static com.android.internal.telephony.TelephonyStatsLog.DEVICE_TELEPHONY_PROPERTIES; 27 import static com.android.internal.telephony.TelephonyStatsLog.EMERGENCY_NUMBERS_INFO; 28 import static com.android.internal.telephony.TelephonyStatsLog.GBA_EVENT; 29 import static com.android.internal.telephony.TelephonyStatsLog.IMS_DEDICATED_BEARER_EVENT; 30 import static com.android.internal.telephony.TelephonyStatsLog.IMS_DEDICATED_BEARER_LISTENER_EVENT; 31 import static com.android.internal.telephony.TelephonyStatsLog.IMS_REGISTRATION_FEATURE_TAG_STATS; 32 import static com.android.internal.telephony.TelephonyStatsLog.IMS_REGISTRATION_SERVICE_DESC_STATS; 33 import static com.android.internal.telephony.TelephonyStatsLog.IMS_REGISTRATION_STATS; 34 import static com.android.internal.telephony.TelephonyStatsLog.IMS_REGISTRATION_TERMINATION; 35 import static com.android.internal.telephony.TelephonyStatsLog.INCOMING_SMS; 36 import static com.android.internal.telephony.TelephonyStatsLog.OUTGOING_SHORT_CODE_SMS; 37 import static com.android.internal.telephony.TelephonyStatsLog.OUTGOING_SMS; 38 import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS; 39 import static com.android.internal.telephony.TelephonyStatsLog.PRESENCE_NOTIFY_EVENT; 40 import static com.android.internal.telephony.TelephonyStatsLog.RCS_ACS_PROVISIONING_STATS; 41 import static com.android.internal.telephony.TelephonyStatsLog.RCS_CLIENT_PROVISIONING_STATS; 42 import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_ACCESS_CONTROLLER; 43 import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_CONFIG_UPDATER; 44 import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_CONTROLLER; 45 import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_ENTITLEMENT; 46 import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_INCOMING_DATAGRAM; 47 import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_OUTGOING_DATAGRAM; 48 import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_PROVISION; 49 import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_SESSION; 50 import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_SOS_MESSAGE_RECOMMENDER; 51 import static com.android.internal.telephony.TelephonyStatsLog.SIM_SLOT_STATE; 52 import static com.android.internal.telephony.TelephonyStatsLog.SIP_DELEGATE_STATS; 53 import static com.android.internal.telephony.TelephonyStatsLog.SIP_MESSAGE_RESPONSE; 54 import static com.android.internal.telephony.TelephonyStatsLog.SIP_TRANSPORT_FEATURE_TAG_STATS; 55 import static com.android.internal.telephony.TelephonyStatsLog.SIP_TRANSPORT_SESSION; 56 import static com.android.internal.telephony.TelephonyStatsLog.SUPPORTED_RADIO_ACCESS_FAMILY; 57 import static com.android.internal.telephony.TelephonyStatsLog.TELEPHONY_NETWORK_REQUESTS_V2; 58 import static com.android.internal.telephony.TelephonyStatsLog.UCE_EVENT_STATS; 59 import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_RAT_USAGE; 60 import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION; 61 import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN; 62 import static com.android.internal.telephony.util.TelephonyUtils.IS_DEBUGGABLE; 63 64 import android.annotation.NonNull; 65 import android.app.StatsManager; 66 import android.content.Context; 67 import android.telephony.SubscriptionManager; 68 import android.telephony.TelephonyManager; 69 import android.util.StatsEvent; 70 71 import com.android.internal.annotations.VisibleForTesting; 72 import com.android.internal.telephony.Phone; 73 import com.android.internal.telephony.PhoneFactory; 74 import com.android.internal.telephony.TelephonyStatsLog; 75 import com.android.internal.telephony.emergency.EmergencyNumberTracker; 76 import com.android.internal.telephony.flags.FeatureFlags; 77 import com.android.internal.telephony.imsphone.ImsPhone; 78 import com.android.internal.telephony.nano.PersistAtomsProto.CarrierRoamingSatelliteControllerStats; 79 import com.android.internal.telephony.nano.PersistAtomsProto.CarrierRoamingSatelliteSession; 80 import com.android.internal.telephony.nano.PersistAtomsProto.CellularDataServiceSwitch; 81 import com.android.internal.telephony.nano.PersistAtomsProto.CellularServiceState; 82 import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession; 83 import com.android.internal.telephony.nano.PersistAtomsProto.DataNetworkValidation; 84 import com.android.internal.telephony.nano.PersistAtomsProto.EmergencyNumbersInfo; 85 import com.android.internal.telephony.nano.PersistAtomsProto.GbaEvent; 86 import com.android.internal.telephony.nano.PersistAtomsProto.ImsDedicatedBearerEvent; 87 import com.android.internal.telephony.nano.PersistAtomsProto.ImsDedicatedBearerListenerEvent; 88 import com.android.internal.telephony.nano.PersistAtomsProto.ImsRegistrationFeatureTagStats; 89 import com.android.internal.telephony.nano.PersistAtomsProto.ImsRegistrationServiceDescStats; 90 import com.android.internal.telephony.nano.PersistAtomsProto.ImsRegistrationStats; 91 import com.android.internal.telephony.nano.PersistAtomsProto.ImsRegistrationTermination; 92 import com.android.internal.telephony.nano.PersistAtomsProto.IncomingSms; 93 import com.android.internal.telephony.nano.PersistAtomsProto.NetworkRequestsV2; 94 import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingShortCodeSms; 95 import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms; 96 import com.android.internal.telephony.nano.PersistAtomsProto.PresenceNotifyEvent; 97 import com.android.internal.telephony.nano.PersistAtomsProto.RcsAcsProvisioningStats; 98 import com.android.internal.telephony.nano.PersistAtomsProto.RcsClientProvisioningStats; 99 import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteAccessController; 100 import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteConfigUpdater; 101 import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteController; 102 import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteEntitlement; 103 import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteIncomingDatagram; 104 import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteOutgoingDatagram; 105 import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteProvision; 106 import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteSession; 107 import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteSosMessageRecommender; 108 import com.android.internal.telephony.nano.PersistAtomsProto.SipDelegateStats; 109 import com.android.internal.telephony.nano.PersistAtomsProto.SipMessageResponse; 110 import com.android.internal.telephony.nano.PersistAtomsProto.SipTransportFeatureTagStats; 111 import com.android.internal.telephony.nano.PersistAtomsProto.SipTransportSession; 112 import com.android.internal.telephony.nano.PersistAtomsProto.UceEventStats; 113 import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallRatUsage; 114 import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession; 115 import com.android.internal.telephony.uicc.UiccController; 116 import com.android.internal.telephony.uicc.UiccSlot; 117 import com.android.internal.util.ConcurrentUtils; 118 import com.android.telephony.Rlog; 119 120 import java.time.Duration; 121 import java.util.Arrays; 122 import java.util.Comparator; 123 import java.util.List; 124 import java.util.Random; 125 import java.util.Set; 126 import java.util.concurrent.ConcurrentHashMap; 127 128 /** 129 * Implements statsd pullers for Telephony. 130 * 131 * <p>This class registers pullers to statsd, which will be called once a day to obtain telephony 132 * statistics that cannot be sent to statsd in real time. 133 */ 134 public class MetricsCollector implements StatsManager.StatsPullAtomCallback { 135 private static final String TAG = MetricsCollector.class.getSimpleName(); 136 137 /** Disables various restrictions to ease debugging during development. */ 138 private static final boolean DBG = false; // STOPSHIP if true 139 140 private static final long MILLIS_PER_HOUR = Duration.ofHours(1).toMillis(); 141 private static final long MILLIS_PER_MINUTE = Duration.ofMinutes(1).toMillis(); 142 private static final long MILLIS_PER_SECOND = Duration.ofSeconds(1).toMillis(); 143 144 /** 145 * Sets atom pull cool down to 23 hours to help enforcing privacy requirement. 146 * 147 * <p>Applies to certain atoms. The interval of 23 hours leaves some margin for pull operations 148 * that occur once a day. 149 */ 150 private static final long MIN_COOLDOWN_MILLIS = 151 DBG ? 10L * MILLIS_PER_SECOND : 23L * MILLIS_PER_HOUR; 152 153 154 /** 155 * Buckets with less than these many calls will be dropped. 156 * 157 * <p>Applies to metrics with duration fields. Currently used by voice call RAT usages. 158 */ 159 private static final long MIN_CALLS_PER_BUCKET = DBG ? 0L : 5L; 160 161 /** Bucket size in milliseconds to round call durations info. */ 162 private static final long DURATION_BUCKET_MILLIS = 163 DBG ? 2L * MILLIS_PER_SECOND : 5L * MILLIS_PER_MINUTE; 164 165 /** 166 * Sets smaller bucket size to round call durations for userdebug build. 167 * 168 * <p>Applies to certain atoms: CellularServiceState. 169 */ 170 private static final long CELL_SERVICE_DURATION_BUCKET_MILLIS = 171 DBG || IS_DEBUGGABLE ? 2L * MILLIS_PER_SECOND : 5L * MILLIS_PER_MINUTE; 172 173 /** 174 * Sets atom pull cool down to 4 minutes for userdebug build, 5 hours for user build. 175 * 176 * <p>Applies to certain atoms: CellularServiceState, DataCallSession, 177 * ImsRegistrationTermination. 178 */ 179 private final long mPowerCorrelatedMinCooldownMillis; 180 private final PersistAtomsStorage mStorage; 181 private final DeviceStateHelper mDeviceStateHelper; 182 private final StatsManager mStatsManager; 183 private final VonrHelper mVonrHelper; 184 private final AirplaneModeStats mAirplaneModeStats; 185 private final DefaultNetworkMonitor mDefaultNetworkMonitor; 186 private final Set<DataCallSessionStats> mOngoingDataCallStats = ConcurrentHashMap.newKeySet(); 187 private static final Random sRandom = new Random(); 188 MetricsCollector(Context context, @NonNull FeatureFlags featureFlags)189 public MetricsCollector(Context context, @NonNull FeatureFlags featureFlags) { 190 this(context, new PersistAtomsStorage(context), 191 new DeviceStateHelper(context), new VonrHelper(featureFlags), 192 new DefaultNetworkMonitor(context, featureFlags), featureFlags); 193 } 194 195 /** Allows dependency injection. Used during unit tests. */ 196 @VisibleForTesting MetricsCollector(Context context, PersistAtomsStorage storage, DeviceStateHelper deviceStateHelper, VonrHelper vonrHelper, DefaultNetworkMonitor defaultNetworkMonitor, @NonNull FeatureFlags featureFlags)197 public MetricsCollector(Context context, PersistAtomsStorage storage, 198 DeviceStateHelper deviceStateHelper, VonrHelper vonrHelper, 199 DefaultNetworkMonitor defaultNetworkMonitor, @NonNull FeatureFlags featureFlags) { 200 mStorage = storage; 201 mDeviceStateHelper = deviceStateHelper; 202 mStatsManager = (StatsManager) context.getSystemService(Context.STATS_MANAGER); 203 mVonrHelper = vonrHelper; 204 if (mStatsManager != null) { 205 // Most (but not all) of these are subject to cooldown specified by MIN_COOLDOWN_MILLIS. 206 registerAtom(CELLULAR_DATA_SERVICE_SWITCH); 207 registerAtom(CELLULAR_SERVICE_STATE); 208 registerAtom(SIM_SLOT_STATE); 209 registerAtom(SUPPORTED_RADIO_ACCESS_FAMILY); 210 registerAtom(VOICE_CALL_RAT_USAGE); 211 registerAtom(VOICE_CALL_SESSION); 212 registerAtom(INCOMING_SMS); 213 registerAtom(OUTGOING_SMS); 214 registerAtom(CARRIER_ID_TABLE_VERSION); 215 registerAtom(DATA_CALL_SESSION); 216 registerAtom(IMS_REGISTRATION_STATS); 217 registerAtom(IMS_REGISTRATION_TERMINATION); 218 registerAtom(TELEPHONY_NETWORK_REQUESTS_V2); 219 registerAtom(IMS_REGISTRATION_FEATURE_TAG_STATS); 220 registerAtom(RCS_CLIENT_PROVISIONING_STATS); 221 registerAtom(RCS_ACS_PROVISIONING_STATS); 222 registerAtom(SIP_DELEGATE_STATS); 223 registerAtom(SIP_TRANSPORT_FEATURE_TAG_STATS); 224 registerAtom(SIP_MESSAGE_RESPONSE); 225 registerAtom(SIP_TRANSPORT_SESSION); 226 registerAtom(DEVICE_TELEPHONY_PROPERTIES); 227 registerAtom(IMS_DEDICATED_BEARER_LISTENER_EVENT); 228 registerAtom(IMS_DEDICATED_BEARER_EVENT); 229 registerAtom(IMS_REGISTRATION_SERVICE_DESC_STATS); 230 registerAtom(UCE_EVENT_STATS); 231 registerAtom(PRESENCE_NOTIFY_EVENT); 232 registerAtom(GBA_EVENT); 233 registerAtom(PER_SIM_STATUS); 234 registerAtom(OUTGOING_SHORT_CODE_SMS); 235 registerAtom(EMERGENCY_NUMBERS_INFO); 236 registerAtom(SATELLITE_CONTROLLER); 237 registerAtom(SATELLITE_SESSION); 238 registerAtom(SATELLITE_INCOMING_DATAGRAM); 239 registerAtom(SATELLITE_OUTGOING_DATAGRAM); 240 registerAtom(SATELLITE_PROVISION); 241 registerAtom(SATELLITE_SOS_MESSAGE_RECOMMENDER); 242 registerAtom(DATA_NETWORK_VALIDATION); 243 registerAtom(CARRIER_ROAMING_SATELLITE_SESSION); 244 registerAtom(CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS); 245 registerAtom(SATELLITE_ENTITLEMENT); 246 registerAtom(SATELLITE_CONFIG_UPDATER); 247 registerAtom(SATELLITE_ACCESS_CONTROLLER); 248 Rlog.d(TAG, "registered"); 249 } else { 250 Rlog.e(TAG, "could not get StatsManager, atoms not registered"); 251 } 252 253 mAirplaneModeStats = new AirplaneModeStats(context); 254 mDefaultNetworkMonitor = new DefaultNetworkMonitor(context, featureFlags); 255 mPowerCorrelatedMinCooldownMillis = DBG ? 10L * MILLIS_PER_SECOND : 256 IS_DEBUGGABLE ? 4L * MILLIS_PER_MINUTE : (long) context.getResources().getInteger( 257 com.android.internal.R.integer.config_metrics_pull_cooldown_millis); 258 } 259 260 /** 261 * {@inheritDoc} 262 * 263 * @return {@link StatsManager#PULL_SUCCESS} with list of atoms (potentially empty) if pull 264 * succeeded, {@link StatsManager#PULL_SKIP} if pull was too frequent or atom ID is 265 * unexpected. 266 */ 267 @Override onPullAtom(int atomTag, List<StatsEvent> data)268 public int onPullAtom(int atomTag, List<StatsEvent> data) { 269 switch (atomTag) { 270 case CELLULAR_DATA_SERVICE_SWITCH: 271 return pullCellularDataServiceSwitch(data); 272 case CELLULAR_SERVICE_STATE: 273 return pullCellularServiceState(data); 274 case SIM_SLOT_STATE: 275 return pullSimSlotState(data); 276 case SUPPORTED_RADIO_ACCESS_FAMILY: 277 return pullSupportedRadioAccessFamily(data); 278 case VOICE_CALL_RAT_USAGE: 279 return pullVoiceCallRatUsages(data); 280 case VOICE_CALL_SESSION: 281 return pullVoiceCallSessions(data); 282 case INCOMING_SMS: 283 return pullIncomingSms(data); 284 case OUTGOING_SMS: 285 return pullOutgoingSms(data); 286 case CARRIER_ID_TABLE_VERSION: 287 return pullCarrierIdTableVersion(data); 288 case DATA_CALL_SESSION: 289 return pullDataCallSession(data); 290 case IMS_REGISTRATION_STATS: 291 return pullImsRegistrationStats(data); 292 case IMS_REGISTRATION_TERMINATION: 293 return pullImsRegistrationTermination(data); 294 case TELEPHONY_NETWORK_REQUESTS_V2: 295 return pullTelephonyNetworkRequestsV2(data); 296 case DEVICE_TELEPHONY_PROPERTIES: 297 return pullDeviceTelephonyProperties(data); 298 case IMS_REGISTRATION_FEATURE_TAG_STATS: 299 return pullImsRegistrationFeatureTagStats(data); 300 case RCS_CLIENT_PROVISIONING_STATS: 301 return pullRcsClientProvisioningStats(data); 302 case RCS_ACS_PROVISIONING_STATS: 303 return pullRcsAcsProvisioningStats(data); 304 case SIP_DELEGATE_STATS: 305 return pullSipDelegateStats(data); 306 case SIP_TRANSPORT_FEATURE_TAG_STATS: 307 return pullSipTransportFeatureTagStats(data); 308 case SIP_MESSAGE_RESPONSE: 309 return pullSipMessageResponse(data); 310 case SIP_TRANSPORT_SESSION: 311 return pullSipTransportSession(data); 312 case IMS_DEDICATED_BEARER_LISTENER_EVENT: 313 return pullImsDedicatedBearerListenerEvent(data); 314 case IMS_DEDICATED_BEARER_EVENT: 315 return pullImsDedicatedBearerEvent(data); 316 case IMS_REGISTRATION_SERVICE_DESC_STATS: 317 return pullImsRegistrationServiceDescStats(data); 318 case UCE_EVENT_STATS: 319 return pullUceEventStats(data); 320 case PRESENCE_NOTIFY_EVENT: 321 return pullPresenceNotifyEvent(data); 322 case GBA_EVENT: 323 return pullGbaEvent(data); 324 case PER_SIM_STATUS: 325 return pullPerSimStatus(data); 326 case OUTGOING_SHORT_CODE_SMS: 327 return pullOutgoingShortCodeSms(data); 328 case EMERGENCY_NUMBERS_INFO: 329 return pullEmergencyNumbersInfo(data); 330 case SATELLITE_CONTROLLER: 331 return pullSatelliteController(data); 332 case SATELLITE_SESSION: 333 return pullSatelliteSession(data); 334 case SATELLITE_INCOMING_DATAGRAM: 335 return pullSatelliteIncomingDatagram(data); 336 case SATELLITE_OUTGOING_DATAGRAM: 337 return pullSatelliteOutgoingDatagram(data); 338 case SATELLITE_PROVISION: 339 return pullSatelliteProvision(data); 340 case SATELLITE_SOS_MESSAGE_RECOMMENDER: 341 return pullSatelliteSosMessageRecommender(data); 342 case DATA_NETWORK_VALIDATION: 343 return pullDataNetworkValidation(data); 344 case CARRIER_ROAMING_SATELLITE_SESSION: 345 return pullCarrierRoamingSatelliteSession(data); 346 case CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS: 347 return pullCarrierRoamingSatelliteControllerStats(data); 348 case SATELLITE_ENTITLEMENT: 349 return pullSatelliteEntitlement(data); 350 case SATELLITE_CONFIG_UPDATER: 351 return pullSatelliteConfigUpdater(data); 352 case SATELLITE_ACCESS_CONTROLLER: 353 return pullSatelliteAccessController(data); 354 default: 355 Rlog.e(TAG, String.format("unexpected atom ID %d", atomTag)); 356 return StatsManager.PULL_SKIP; 357 } 358 } 359 360 /** Returns the {@link PersistAtomsStorage} backing the puller. */ getAtomsStorage()361 public PersistAtomsStorage getAtomsStorage() { 362 return mStorage; 363 } 364 365 /** Returns the {@link DeviceStateHelper}. */ getDeviceStateHelper()366 public DeviceStateHelper getDeviceStateHelper() { 367 return mDeviceStateHelper; 368 } 369 370 /** Returns the {@link VonrHelper}. */ getVonrHelper()371 public VonrHelper getVonrHelper() { 372 return mVonrHelper; 373 } 374 375 /** Updates duration segments and calls {@link PersistAtomsStorage#flushAtoms()}. */ flushAtomsStorage()376 public void flushAtomsStorage() { 377 concludeAll(); 378 mStorage.flushAtoms(); 379 } 380 381 /** Updates duration segments and calls {@link PersistAtomsStorage#clearAtoms()}. */ clearAtomsStorage()382 public void clearAtomsStorage() { 383 concludeAll(); 384 mStorage.clearAtoms(); 385 } 386 387 /** 388 * Registers a {@link DataCallSessionStats} which will be pinged for on-going data calls when 389 * data call atoms are pulled. 390 */ registerOngoingDataCallStat(DataCallSessionStats call)391 public void registerOngoingDataCallStat(DataCallSessionStats call) { 392 mOngoingDataCallStats.add(call); 393 } 394 395 /** Unregisters a {@link DataCallSessionStats} when it no longer handles an active data call. */ unregisterOngoingDataCallStat(DataCallSessionStats call)396 public void unregisterOngoingDataCallStat(DataCallSessionStats call) { 397 mOngoingDataCallStats.remove(call); 398 } 399 getDefaultNetworkMonitor()400 public DefaultNetworkMonitor getDefaultNetworkMonitor() { 401 return mDefaultNetworkMonitor; 402 } 403 concludeDataCallSessionStats()404 private void concludeDataCallSessionStats() { 405 for (DataCallSessionStats stats : mOngoingDataCallStats) { 406 stats.conclude(); 407 } 408 } 409 concludeImsStats()410 private void concludeImsStats() { 411 for (Phone phone : getPhonesIfAny()) { 412 ImsPhone imsPhone = (ImsPhone) phone.getImsPhone(); 413 if (imsPhone != null) { 414 imsPhone.getImsStats().conclude(); 415 } 416 } 417 } 418 concludeServiceStateStats()419 private void concludeServiceStateStats() { 420 for (Phone phone : getPhonesIfAny()) { 421 phone.getServiceStateTracker().getServiceStateStats().conclude(); 422 } 423 } 424 concludeRcsStats()425 private void concludeRcsStats() { 426 RcsStats rcsStats = RcsStats.getInstance(); 427 if (rcsStats != null) { 428 rcsStats.concludeSipTransportFeatureTagsStat(); 429 rcsStats.onFlushIncompleteRcsAcsProvisioningStats(); 430 rcsStats.onFlushIncompleteImsRegistrationServiceDescStats(); 431 rcsStats.onFlushIncompleteImsRegistrationFeatureTagStats(); 432 } 433 } 434 concludeAll()435 private void concludeAll() { 436 concludeDataCallSessionStats(); 437 concludeImsStats(); 438 concludeServiceStateStats(); 439 concludeRcsStats(); 440 } 441 pullSimSlotState(List<StatsEvent> data)442 private static int pullSimSlotState(List<StatsEvent> data) { 443 SimSlotState state; 444 try { 445 state = SimSlotState.getCurrentState(); 446 } catch (RuntimeException e) { 447 // UiccController has not been made yet 448 return StatsManager.PULL_SKIP; 449 } 450 451 data.add( 452 TelephonyStatsLog.buildStatsEvent( 453 SIM_SLOT_STATE, 454 state.numActiveSlots, 455 state.numActiveSims, 456 state.numActiveEsims, 457 state.numActiveEsimSlots, 458 state.numActiveMepSlots)); 459 return StatsManager.PULL_SUCCESS; 460 } 461 pullSupportedRadioAccessFamily(List<StatsEvent> data)462 private static int pullSupportedRadioAccessFamily(List<StatsEvent> data) { 463 Phone[] phones = getPhonesIfAny(); 464 if (phones.length == 0) { 465 return StatsManager.PULL_SKIP; 466 } 467 468 // The bitmask is defined in android.telephony.TelephonyManager.NetworkTypeBitMask 469 long rafSupported = 0L; 470 for (Phone phone : PhoneFactory.getPhones()) { 471 rafSupported |= phone.getRadioAccessFamily(); 472 } 473 474 data.add(TelephonyStatsLog.buildStatsEvent(SUPPORTED_RADIO_ACCESS_FAMILY, rafSupported)); 475 return StatsManager.PULL_SUCCESS; 476 } 477 pullCarrierIdTableVersion(List<StatsEvent> data)478 private static int pullCarrierIdTableVersion(List<StatsEvent> data) { 479 Phone[] phones = getPhonesIfAny(); 480 if (phones.length == 0) { 481 return StatsManager.PULL_SKIP; 482 } else { 483 // All phones should have the same version of the carrier ID table, so only query the 484 // first one. 485 int version = phones[0].getCarrierIdListVersion(); 486 data.add(TelephonyStatsLog.buildStatsEvent(CARRIER_ID_TABLE_VERSION, version)); 487 return StatsManager.PULL_SUCCESS; 488 } 489 } 490 pullVoiceCallRatUsages(List<StatsEvent> data)491 private int pullVoiceCallRatUsages(List<StatsEvent> data) { 492 VoiceCallRatUsage[] usages = mStorage.getVoiceCallRatUsages(MIN_COOLDOWN_MILLIS); 493 if (usages != null) { 494 // sort by carrier/RAT and remove buckets with insufficient number of calls 495 Arrays.stream(usages) 496 .sorted( 497 Comparator.comparingLong( 498 usage -> ((long) usage.carrierId << 32) | usage.rat)) 499 .filter(usage -> usage.callCount >= MIN_CALLS_PER_BUCKET) 500 .forEach(usage -> data.add(buildStatsEvent(usage))); 501 Rlog.d( 502 TAG, 503 String.format( 504 "%d out of %d VOICE_CALL_RAT_USAGE pulled", 505 data.size(), usages.length)); 506 return StatsManager.PULL_SUCCESS; 507 } else { 508 Rlog.w(TAG, "VOICE_CALL_RAT_USAGE pull too frequent, skipping"); 509 return StatsManager.PULL_SKIP; 510 } 511 } 512 pullVoiceCallSessions(List<StatsEvent> data)513 private int pullVoiceCallSessions(List<StatsEvent> data) { 514 VoiceCallSession[] calls = mStorage.getVoiceCallSessions(MIN_COOLDOWN_MILLIS); 515 if (calls != null) { 516 // call session list is already shuffled when calls were inserted 517 Arrays.stream(calls).forEach(call -> data.add(buildStatsEvent(call))); 518 return StatsManager.PULL_SUCCESS; 519 } else { 520 Rlog.w(TAG, "VOICE_CALL_SESSION pull too frequent, skipping"); 521 return StatsManager.PULL_SKIP; 522 } 523 } 524 pullIncomingSms(List<StatsEvent> data)525 private int pullIncomingSms(List<StatsEvent> data) { 526 IncomingSms[] smsList = mStorage.getIncomingSms(MIN_COOLDOWN_MILLIS); 527 if (smsList != null) { 528 // SMS list is already shuffled when SMS were inserted 529 Arrays.stream(smsList).forEach(sms -> data.add(buildStatsEvent(sms))); 530 return StatsManager.PULL_SUCCESS; 531 } else { 532 Rlog.w(TAG, "INCOMING_SMS pull too frequent, skipping"); 533 return StatsManager.PULL_SKIP; 534 } 535 } 536 pullOutgoingSms(List<StatsEvent> data)537 private int pullOutgoingSms(List<StatsEvent> data) { 538 OutgoingSms[] smsList = mStorage.getOutgoingSms(MIN_COOLDOWN_MILLIS); 539 if (smsList != null) { 540 // SMS list is already shuffled when SMS were inserted 541 Arrays.stream(smsList).forEach(sms -> data.add(buildStatsEvent(sms))); 542 return StatsManager.PULL_SUCCESS; 543 } else { 544 Rlog.w(TAG, "OUTGOING_SMS pull too frequent, skipping"); 545 return StatsManager.PULL_SKIP; 546 } 547 } 548 pullDataCallSession(List<StatsEvent> data)549 private int pullDataCallSession(List<StatsEvent> data) { 550 // Include ongoing data call segments 551 concludeDataCallSessionStats(); 552 DataCallSession[] dataCallSessions = mStorage.getDataCallSessions( 553 mPowerCorrelatedMinCooldownMillis); 554 if (dataCallSessions != null) { 555 Arrays.stream(dataCallSessions) 556 .forEach(dataCall -> data.add(buildStatsEvent(dataCall))); 557 return StatsManager.PULL_SUCCESS; 558 } else { 559 Rlog.w(TAG, "DATA_CALL_SESSION pull too frequent, skipping"); 560 return StatsManager.PULL_SKIP; 561 } 562 } 563 pullCellularDataServiceSwitch(List<StatsEvent> data)564 private int pullCellularDataServiceSwitch(List<StatsEvent> data) { 565 CellularDataServiceSwitch[] persistAtoms = 566 mStorage.getCellularDataServiceSwitches(MIN_COOLDOWN_MILLIS); 567 if (persistAtoms != null) { 568 // list is already shuffled when instances were inserted 569 Arrays.stream(persistAtoms) 570 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 571 return StatsManager.PULL_SUCCESS; 572 } else { 573 Rlog.w(TAG, "CELLULAR_DATA_SERVICE_SWITCH pull too frequent, skipping"); 574 return StatsManager.PULL_SKIP; 575 } 576 } 577 pullCellularServiceState(List<StatsEvent> data)578 private int pullCellularServiceState(List<StatsEvent> data) { 579 // Include the latest durations 580 concludeServiceStateStats(); 581 CellularServiceState[] persistAtoms = mStorage.getCellularServiceStates( 582 mPowerCorrelatedMinCooldownMillis); 583 if (persistAtoms != null) { 584 // list is already shuffled when instances were inserted 585 Arrays.stream(persistAtoms) 586 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 587 return StatsManager.PULL_SUCCESS; 588 } else { 589 Rlog.w(TAG, "CELLULAR_SERVICE_STATE pull too frequent, skipping"); 590 return StatsManager.PULL_SKIP; 591 } 592 } 593 pullImsRegistrationStats(List<StatsEvent> data)594 private int pullImsRegistrationStats(List<StatsEvent> data) { 595 // Include the latest durations 596 concludeImsStats(); 597 ImsRegistrationStats[] persistAtoms = mStorage.getImsRegistrationStats(MIN_COOLDOWN_MILLIS); 598 if (persistAtoms != null) { 599 // list is already shuffled when instances were inserted 600 Arrays.stream(persistAtoms) 601 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 602 return StatsManager.PULL_SUCCESS; 603 } else { 604 Rlog.w(TAG, "IMS_REGISTRATION_STATS pull too frequent, skipping"); 605 return StatsManager.PULL_SKIP; 606 } 607 } 608 pullImsRegistrationTermination(List<StatsEvent> data)609 private int pullImsRegistrationTermination(List<StatsEvent> data) { 610 ImsRegistrationTermination[] persistAtoms = mStorage.getImsRegistrationTerminations( 611 mPowerCorrelatedMinCooldownMillis); 612 if (persistAtoms != null) { 613 // list is already shuffled when instances were inserted 614 Arrays.stream(persistAtoms) 615 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 616 return StatsManager.PULL_SUCCESS; 617 } else { 618 Rlog.w(TAG, "IMS_REGISTRATION_TERMINATION pull too frequent, skipping"); 619 return StatsManager.PULL_SKIP; 620 } 621 } 622 pullTelephonyNetworkRequestsV2(List<StatsEvent> data)623 private int pullTelephonyNetworkRequestsV2(List<StatsEvent> data) { 624 NetworkRequestsV2[] persistAtoms = mStorage.getNetworkRequestsV2(MIN_COOLDOWN_MILLIS); 625 if (persistAtoms != null) { 626 Arrays.stream(persistAtoms) 627 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 628 return StatsManager.PULL_SUCCESS; 629 } else { 630 Rlog.w(TAG, "TELEPHONY_NETWORK_REQUESTS_V2 pull too frequent, skipping"); 631 return StatsManager.PULL_SKIP; 632 } 633 } 634 pullDeviceTelephonyProperties(List<StatsEvent> data)635 private int pullDeviceTelephonyProperties(List<StatsEvent> data) { 636 Phone[] phones = getPhonesIfAny(); 637 if (phones.length == 0) { 638 return StatsManager.PULL_SKIP; 639 } 640 boolean isAutoDataSwitchOn = Arrays.stream(phones) 641 .anyMatch(phone -> 642 phone.getSubId() != SubscriptionManager.getDefaultDataSubscriptionId() 643 && phone.getDataSettingsManager().isMobileDataPolicyEnabled( 644 TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH)); 645 boolean hasDedicatedManagedProfileSub = Arrays.stream(phones) 646 .anyMatch(Phone::isManagedProfile); 647 648 UiccSlot[] slots = UiccController.getInstance().getUiccSlots(); 649 int mepSupportedSlotCount = (int) Arrays.stream(slots) 650 .filter(UiccSlot::isMultipleEnabledProfileSupported) 651 .count(); 652 653 data.add(TelephonyStatsLog.buildStatsEvent(DEVICE_TELEPHONY_PROPERTIES, true, 654 isAutoDataSwitchOn, mStorage.getAutoDataSwitchToggleCount(), 655 hasDedicatedManagedProfileSub, mepSupportedSlotCount)); 656 return StatsManager.PULL_SUCCESS; 657 } 658 pullImsRegistrationFeatureTagStats(List<StatsEvent> data)659 private int pullImsRegistrationFeatureTagStats(List<StatsEvent> data) { 660 RcsStats.getInstance().onFlushIncompleteImsRegistrationFeatureTagStats(); 661 662 ImsRegistrationFeatureTagStats[] persistAtoms = 663 mStorage.getImsRegistrationFeatureTagStats(MIN_COOLDOWN_MILLIS); 664 if (persistAtoms != null) { 665 Arrays.stream(persistAtoms) 666 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 667 return StatsManager.PULL_SUCCESS; 668 } else { 669 Rlog.w(TAG, "IMS_REGISTRATION_FEATURE_TAG_STATS pull too frequent, skipping"); 670 return StatsManager.PULL_SKIP; 671 } 672 } 673 pullRcsClientProvisioningStats(List<StatsEvent> data)674 private int pullRcsClientProvisioningStats(List<StatsEvent> data) { 675 RcsClientProvisioningStats[] persistAtoms = 676 mStorage.getRcsClientProvisioningStats(MIN_COOLDOWN_MILLIS); 677 if (persistAtoms != null) { 678 Arrays.stream(persistAtoms) 679 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 680 return StatsManager.PULL_SUCCESS; 681 } else { 682 Rlog.w(TAG, "RCS_CLIENT_PROVISIONING_STATS pull too frequent, skipping"); 683 return StatsManager.PULL_SKIP; 684 } 685 } 686 pullRcsAcsProvisioningStats(List<StatsEvent> data)687 private int pullRcsAcsProvisioningStats(List<StatsEvent> data) { 688 RcsStats.getInstance().onFlushIncompleteRcsAcsProvisioningStats(); 689 690 RcsAcsProvisioningStats[] persistAtoms = 691 mStorage.getRcsAcsProvisioningStats(MIN_COOLDOWN_MILLIS); 692 if (persistAtoms != null) { 693 Arrays.stream(persistAtoms) 694 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 695 return StatsManager.PULL_SUCCESS; 696 } else { 697 Rlog.w(TAG, "RCS_ACS_PROVISIONING_STATS pull too frequent, skipping"); 698 return StatsManager.PULL_SKIP; 699 } 700 } 701 pullSipDelegateStats(List<StatsEvent> data)702 private int pullSipDelegateStats(List<StatsEvent> data) { 703 SipDelegateStats[] persisAtoms = 704 mStorage.getSipDelegateStats(MIN_COOLDOWN_MILLIS); 705 if (persisAtoms != null) { 706 Arrays.stream(persisAtoms) 707 .forEach(persisAtom -> data.add(buildStatsEvent(persisAtom))); 708 return StatsManager.PULL_SUCCESS; 709 } else { 710 Rlog.w(TAG, "SIP_DELEGATE_STATS pull too frequent, skipping"); 711 return StatsManager.PULL_SKIP; 712 } 713 } 714 pullSipTransportFeatureTagStats(List<StatsEvent> data)715 private int pullSipTransportFeatureTagStats(List<StatsEvent> data) { 716 RcsStats.getInstance().concludeSipTransportFeatureTagsStat(); 717 718 SipTransportFeatureTagStats[] persisAtoms = 719 mStorage.getSipTransportFeatureTagStats(MIN_COOLDOWN_MILLIS); 720 if (persisAtoms != null) { 721 Arrays.stream(persisAtoms) 722 .forEach(persisAtom -> data.add(buildStatsEvent(persisAtom))); 723 return StatsManager.PULL_SUCCESS; 724 } else { 725 Rlog.w(TAG, "SIP_DELEGATE_STATS pull too frequent, skipping"); 726 return StatsManager.PULL_SKIP; 727 } 728 } 729 pullSipMessageResponse(List<StatsEvent> data)730 private int pullSipMessageResponse(List<StatsEvent> data) { 731 SipMessageResponse[] persistAtoms = 732 mStorage.getSipMessageResponse(MIN_COOLDOWN_MILLIS); 733 if (persistAtoms != null) { 734 Arrays.stream(persistAtoms) 735 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 736 return StatsManager.PULL_SUCCESS; 737 } else { 738 Rlog.w(TAG, "RCS_SIP_MESSAGE_RESPONSE pull too frequent, skipping"); 739 return StatsManager.PULL_SKIP; 740 } 741 } 742 pullSipTransportSession(List<StatsEvent> data)743 private int pullSipTransportSession(List<StatsEvent> data) { 744 SipTransportSession[] persistAtoms = 745 mStorage.getSipTransportSession(MIN_COOLDOWN_MILLIS); 746 if (persistAtoms != null) { 747 Arrays.stream(persistAtoms) 748 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 749 return StatsManager.PULL_SUCCESS; 750 } else { 751 Rlog.w(TAG, "RCS_SIP_TRANSPORT_SESSION pull too frequent, skipping"); 752 return StatsManager.PULL_SKIP; 753 } 754 } 755 pullImsDedicatedBearerListenerEvent(List<StatsEvent> data)756 private int pullImsDedicatedBearerListenerEvent(List<StatsEvent> data) { 757 ImsDedicatedBearerListenerEvent[] persistAtoms = 758 mStorage.getImsDedicatedBearerListenerEvent(MIN_COOLDOWN_MILLIS); 759 if (persistAtoms != null) { 760 Arrays.stream(persistAtoms) 761 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 762 return StatsManager.PULL_SUCCESS; 763 } else { 764 Rlog.w(TAG, "IMS_DEDICATED_BEARER_LISTENER_EVENT pull too frequent, skipping"); 765 return StatsManager.PULL_SKIP; 766 } 767 } 768 pullImsDedicatedBearerEvent(List<StatsEvent> data)769 private int pullImsDedicatedBearerEvent(List<StatsEvent> data) { 770 ImsDedicatedBearerEvent[] persistAtoms = 771 mStorage.getImsDedicatedBearerEvent(MIN_COOLDOWN_MILLIS); 772 if (persistAtoms != null) { 773 Arrays.stream(persistAtoms) 774 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 775 return StatsManager.PULL_SUCCESS; 776 } else { 777 Rlog.w(TAG, "IMS_DEDICATED_BEARER_EVENT pull too frequent, skipping"); 778 return StatsManager.PULL_SKIP; 779 } 780 } 781 pullImsRegistrationServiceDescStats(List<StatsEvent> data)782 private int pullImsRegistrationServiceDescStats(List<StatsEvent> data) { 783 RcsStats.getInstance().onFlushIncompleteImsRegistrationServiceDescStats(); 784 ImsRegistrationServiceDescStats[] persistAtoms = 785 mStorage.getImsRegistrationServiceDescStats(MIN_COOLDOWN_MILLIS); 786 if (persistAtoms != null) { 787 Arrays.stream(persistAtoms) 788 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 789 return StatsManager.PULL_SUCCESS; 790 } else { 791 Rlog.w(TAG, "IMS_REGISTRATION_SERVICE_DESC_STATS pull too frequent, skipping"); 792 return StatsManager.PULL_SKIP; 793 } 794 } 795 pullUceEventStats(List<StatsEvent> data)796 private int pullUceEventStats(List<StatsEvent> data) { 797 UceEventStats[] persistAtoms = mStorage.getUceEventStats(MIN_COOLDOWN_MILLIS); 798 if (persistAtoms != null) { 799 Arrays.stream(persistAtoms) 800 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 801 return StatsManager.PULL_SUCCESS; 802 } else { 803 Rlog.w(TAG, "UCE_EVENT_STATS pull too frequent, skipping"); 804 return StatsManager.PULL_SKIP; 805 } 806 } 807 pullPresenceNotifyEvent(List<StatsEvent> data)808 private int pullPresenceNotifyEvent(List<StatsEvent> data) { 809 PresenceNotifyEvent[] persistAtoms = mStorage.getPresenceNotifyEvent(MIN_COOLDOWN_MILLIS); 810 if (persistAtoms != null) { 811 Arrays.stream(persistAtoms) 812 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 813 return StatsManager.PULL_SUCCESS; 814 } else { 815 Rlog.w(TAG, "PRESENCE_NOTIFY_EVENT pull too frequent, skipping"); 816 return StatsManager.PULL_SKIP; 817 } 818 } 819 pullGbaEvent(List<StatsEvent> data)820 private int pullGbaEvent(List<StatsEvent> data) { 821 GbaEvent[] persistAtoms = mStorage.getGbaEvent(MIN_COOLDOWN_MILLIS); 822 if (persistAtoms != null) { 823 Arrays.stream(persistAtoms) 824 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 825 return StatsManager.PULL_SUCCESS; 826 } else { 827 Rlog.w(TAG, "GBA_EVENT pull too frequent, skipping"); 828 return StatsManager.PULL_SKIP; 829 } 830 } 831 pullPerSimStatus(List<StatsEvent> data)832 private int pullPerSimStatus(List<StatsEvent> data) { 833 int result = StatsManager.PULL_SKIP; 834 for (Phone phone : getPhonesIfAny()) { 835 PerSimStatus perSimStatus = PerSimStatus.getCurrentState(phone); 836 if (perSimStatus == null) { 837 continue; 838 } 839 StatsEvent statsEvent = TelephonyStatsLog.buildStatsEvent( 840 PER_SIM_STATUS, 841 phone.getPhoneId(), // simSlotIndex 842 perSimStatus.carrierId, // carrierId 843 perSimStatus.phoneNumberSourceUicc, // phoneNumberSourceUicc 844 perSimStatus.phoneNumberSourceCarrier, // phoneNumberSourceCarrier 845 perSimStatus.phoneNumberSourceIms, // phoneNumberSourceIms 846 perSimStatus.advancedCallingSettingEnabled, // volteEnabled 847 perSimStatus.voWiFiSettingEnabled, // wfcEnabled 848 perSimStatus.voWiFiModeSetting, // wfcMode 849 perSimStatus.voWiFiRoamingModeSetting, // wfcRoamingMode 850 perSimStatus.vtSettingEnabled, // videoCallingEnabled 851 perSimStatus.dataRoamingEnabled, // dataRoamingEnabled 852 perSimStatus.preferredNetworkType, // allowedNetworksByUser 853 perSimStatus.disabled2g, // is2gDisabled 854 perSimStatus.pin1Enabled, // isPin1Enabled 855 perSimStatus.minimumVoltageClass, // simVoltageClass 856 perSimStatus.userModifiedApnTypes, // userModifiedApnTypeBitmask 857 perSimStatus.unmeteredNetworks, // unmeteredNetworks 858 perSimStatus.vonrEnabled, // vonrEnabled 859 perSimStatus.crossSimCallingEnabled); // crossSimCallingEnabled 860 data.add(statsEvent); 861 result = StatsManager.PULL_SUCCESS; 862 } 863 return result; 864 } 865 pullOutgoingShortCodeSms(List<StatsEvent> data)866 private int pullOutgoingShortCodeSms(List<StatsEvent> data) { 867 OutgoingShortCodeSms[] outgoingShortCodeSmsList = mStorage 868 .getOutgoingShortCodeSms(MIN_COOLDOWN_MILLIS); 869 if (outgoingShortCodeSmsList != null) { 870 // Outgoing short code SMS list is already shuffled when SMS were inserted 871 Arrays.stream(outgoingShortCodeSmsList).forEach(sms -> data.add(buildStatsEvent(sms))); 872 return StatsManager.PULL_SUCCESS; 873 } else { 874 Rlog.w(TAG, "OUTGOING_SHORT_CODE_SMS pull too frequent, skipping"); 875 return StatsManager.PULL_SKIP; 876 } 877 } 878 pullEmergencyNumbersInfo(List<StatsEvent> data)879 private int pullEmergencyNumbersInfo(List<StatsEvent> data) { 880 boolean isDataLogged = false; 881 for (Phone phone : getPhonesIfAny()) { 882 if (phone != null) { 883 EmergencyNumberTracker tracker = phone.getEmergencyNumberTracker(); 884 if (tracker != null) { 885 EmergencyNumbersInfo[] numList = tracker.getEmergencyNumbersProtoArray(); 886 Arrays.stream(numList).forEach(number -> data.add(buildStatsEvent(number))); 887 isDataLogged = true; 888 } 889 } 890 } 891 return isDataLogged ? StatsManager.PULL_SUCCESS : StatsManager.PULL_SKIP; 892 } 893 pullSatelliteController(List<StatsEvent> data)894 private int pullSatelliteController(List<StatsEvent> data) { 895 SatelliteController[] controllerAtoms = 896 mStorage.getSatelliteControllerStats(MIN_COOLDOWN_MILLIS); 897 if (controllerAtoms != null) { 898 Arrays.stream(controllerAtoms) 899 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 900 return StatsManager.PULL_SUCCESS; 901 } else { 902 Rlog.w(TAG, "SATELLITE_CONTROLLER pull too frequent, skipping"); 903 return StatsManager.PULL_SKIP; 904 } 905 } 906 pullSatelliteSession(List<StatsEvent> data)907 private int pullSatelliteSession(List<StatsEvent> data) { 908 SatelliteSession[] sessionAtoms = 909 mStorage.getSatelliteSessionStats(MIN_COOLDOWN_MILLIS); 910 if (sessionAtoms != null) { 911 Arrays.stream(sessionAtoms) 912 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 913 return StatsManager.PULL_SUCCESS; 914 } else { 915 Rlog.w(TAG, "SATELLITE_SESSION pull too frequent, skipping"); 916 return StatsManager.PULL_SKIP; 917 } 918 } 919 pullSatelliteIncomingDatagram(List<StatsEvent> data)920 private int pullSatelliteIncomingDatagram(List<StatsEvent> data) { 921 SatelliteIncomingDatagram[] incomingDatagramAtoms = 922 mStorage.getSatelliteIncomingDatagramStats(MIN_COOLDOWN_MILLIS); 923 if (incomingDatagramAtoms != null) { 924 Arrays.stream(incomingDatagramAtoms) 925 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 926 return StatsManager.PULL_SUCCESS; 927 } else { 928 Rlog.w(TAG, "SATELLITE_INCOMING_DATAGRAM pull too frequent, skipping"); 929 return StatsManager.PULL_SKIP; 930 } 931 } 932 933 pullSatelliteOutgoingDatagram(List<StatsEvent> data)934 private int pullSatelliteOutgoingDatagram(List<StatsEvent> data) { 935 SatelliteOutgoingDatagram[] outgoingDatagramAtoms = 936 mStorage.getSatelliteOutgoingDatagramStats(MIN_COOLDOWN_MILLIS); 937 if (outgoingDatagramAtoms != null) { 938 Arrays.stream(outgoingDatagramAtoms) 939 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 940 return StatsManager.PULL_SUCCESS; 941 } else { 942 Rlog.w(TAG, "SATELLITE_OUTGOING_DATAGRAM pull too frequent, skipping"); 943 return StatsManager.PULL_SKIP; 944 } 945 } 946 947 pullSatelliteProvision(List<StatsEvent> data)948 private int pullSatelliteProvision(List<StatsEvent> data) { 949 SatelliteProvision[] provisionAtoms = 950 mStorage.getSatelliteProvisionStats(MIN_COOLDOWN_MILLIS); 951 if (provisionAtoms != null) { 952 Arrays.stream(provisionAtoms) 953 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 954 return StatsManager.PULL_SUCCESS; 955 } else { 956 Rlog.w(TAG, "SATELLITE_PROVISION pull too frequent, skipping"); 957 return StatsManager.PULL_SKIP; 958 } 959 } 960 pullSatelliteSosMessageRecommender(List<StatsEvent> data)961 private int pullSatelliteSosMessageRecommender(List<StatsEvent> data) { 962 SatelliteSosMessageRecommender[] sosMessageRecommenderAtoms = 963 mStorage.getSatelliteSosMessageRecommenderStats(MIN_COOLDOWN_MILLIS); 964 if (sosMessageRecommenderAtoms != null) { 965 Arrays.stream(sosMessageRecommenderAtoms) 966 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 967 return StatsManager.PULL_SUCCESS; 968 } else { 969 Rlog.w(TAG, "SATELLITE_SOS_MESSAGE_RECOMMENDER pull too frequent, skipping"); 970 return StatsManager.PULL_SKIP; 971 } 972 } 973 pullDataNetworkValidation(@onNull List<StatsEvent> data)974 private int pullDataNetworkValidation(@NonNull List<StatsEvent> data) { 975 DataNetworkValidation[] dataNetworkValidations = 976 mStorage.getDataNetworkValidation(mPowerCorrelatedMinCooldownMillis); 977 if (dataNetworkValidations != null) { 978 Arrays.stream(dataNetworkValidations) 979 .forEach(d -> data.add(buildStatsEvent(d))); 980 return StatsManager.PULL_SUCCESS; 981 } else { 982 Rlog.w(TAG, "DATA_NETWORK_VALIDATION pull too frequent, skipping"); 983 return StatsManager.PULL_SKIP; 984 } 985 } 986 pullCarrierRoamingSatelliteSession(List<StatsEvent> data)987 private int pullCarrierRoamingSatelliteSession(List<StatsEvent> data) { 988 CarrierRoamingSatelliteSession[] carrierRoamingSatelliteSessionAtoms = 989 mStorage.getCarrierRoamingSatelliteSessionStats(MIN_COOLDOWN_MILLIS); 990 if (carrierRoamingSatelliteSessionAtoms != null) { 991 Arrays.stream(carrierRoamingSatelliteSessionAtoms) 992 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 993 return StatsManager.PULL_SUCCESS; 994 } else { 995 Rlog.w(TAG, "CARRIER_ROAMING_SATELLITE_SESSION pull too frequent, skipping"); 996 return StatsManager.PULL_SKIP; 997 } 998 } 999 pullCarrierRoamingSatelliteControllerStats(List<StatsEvent> data)1000 private int pullCarrierRoamingSatelliteControllerStats(List<StatsEvent> data) { 1001 CarrierRoamingSatelliteControllerStats[] carrierRoamingSatelliteControllerStatsAtoms = 1002 mStorage.getCarrierRoamingSatelliteControllerStats(MIN_COOLDOWN_MILLIS); 1003 if (carrierRoamingSatelliteControllerStatsAtoms != null) { 1004 Arrays.stream(carrierRoamingSatelliteControllerStatsAtoms) 1005 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 1006 return StatsManager.PULL_SUCCESS; 1007 } else { 1008 Rlog.w(TAG, "CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS " 1009 + "pull too frequent, skipping"); 1010 return StatsManager.PULL_SKIP; 1011 } 1012 } 1013 pullSatelliteEntitlement(List<StatsEvent> data)1014 private int pullSatelliteEntitlement(List<StatsEvent> data) { 1015 SatelliteEntitlement[] satelliteEntitlementAtoms = 1016 mStorage.getSatelliteEntitlementStats(MIN_COOLDOWN_MILLIS); 1017 if (satelliteEntitlementAtoms != null) { 1018 Arrays.stream(satelliteEntitlementAtoms) 1019 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 1020 return StatsManager.PULL_SUCCESS; 1021 } else { 1022 Rlog.w(TAG, "SATELLITE_ENTITLEMENT pull too frequent, skipping"); 1023 return StatsManager.PULL_SKIP; 1024 } 1025 } 1026 pullSatelliteConfigUpdater(List<StatsEvent> data)1027 private int pullSatelliteConfigUpdater(List<StatsEvent> data) { 1028 SatelliteConfigUpdater[] satelliteConfigUpdaterAtoms = 1029 mStorage.getSatelliteConfigUpdaterStats(MIN_COOLDOWN_MILLIS); 1030 if (satelliteConfigUpdaterAtoms != null) { 1031 Arrays.stream(satelliteConfigUpdaterAtoms) 1032 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 1033 return StatsManager.PULL_SUCCESS; 1034 } else { 1035 Rlog.w(TAG, "SATELLITE_CONFIG_UPDATER pull too frequent, skipping"); 1036 return StatsManager.PULL_SKIP; 1037 } 1038 } 1039 pullSatelliteAccessController(List<StatsEvent> data)1040 private int pullSatelliteAccessController(List<StatsEvent> data) { 1041 SatelliteAccessController[] satelliteAccessControllerAtoms = 1042 mStorage.getSatelliteAccessControllerStats(MIN_COOLDOWN_MILLIS); 1043 if (satelliteAccessControllerAtoms != null) { 1044 Arrays.stream(satelliteAccessControllerAtoms) 1045 .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom))); 1046 return StatsManager.PULL_SUCCESS; 1047 } else { 1048 Rlog.w(TAG, "SATELLITE_ACCESS_CONTROLLER pull too frequent, skipping"); 1049 return StatsManager.PULL_SKIP; 1050 } 1051 } 1052 1053 /** Registers a pulled atom ID {@code atomId}. */ registerAtom(int atomId)1054 private void registerAtom(int atomId) { 1055 mStatsManager.setPullAtomCallback(atomId, /* metadata= */ null, 1056 ConcurrentUtils.DIRECT_EXECUTOR, this); 1057 } 1058 buildStatsEvent(CellularDataServiceSwitch serviceSwitch)1059 private static StatsEvent buildStatsEvent(CellularDataServiceSwitch serviceSwitch) { 1060 return TelephonyStatsLog.buildStatsEvent( 1061 CELLULAR_DATA_SERVICE_SWITCH, 1062 serviceSwitch.ratFrom, 1063 serviceSwitch.ratTo, 1064 serviceSwitch.simSlotIndex, 1065 serviceSwitch.isMultiSim, 1066 serviceSwitch.carrierId, 1067 serviceSwitch.switchCount, 1068 serviceSwitch.isOpportunistic); 1069 } 1070 buildStatsEvent(CellularServiceState state)1071 private static StatsEvent buildStatsEvent(CellularServiceState state) { 1072 return TelephonyStatsLog.buildStatsEvent( 1073 CELLULAR_SERVICE_STATE, 1074 state.voiceRat, 1075 state.dataRat, 1076 state.voiceRoamingType, 1077 state.dataRoamingType, 1078 state.isEndc, 1079 state.simSlotIndex, 1080 state.isMultiSim, 1081 state.carrierId, 1082 roundAndConvertMillisToSeconds(state.totalTimeMillis, 1083 CELL_SERVICE_DURATION_BUCKET_MILLIS), 1084 state.isEmergencyOnly, 1085 state.isInternetPdnUp, 1086 state.foldState, 1087 state.overrideVoiceService, 1088 state.isDataEnabled, 1089 state.isIwlanCrossSim, 1090 state.isNtn, 1091 state.isNbIotNtn, 1092 state.isOpportunistic); 1093 } 1094 buildStatsEvent(VoiceCallRatUsage usage)1095 private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) { 1096 return TelephonyStatsLog.buildStatsEvent( 1097 VOICE_CALL_RAT_USAGE, 1098 usage.carrierId, 1099 usage.rat, 1100 roundAndConvertMillisToSeconds(usage.totalDurationMillis), 1101 usage.callCount); 1102 } 1103 buildStatsEvent(VoiceCallSession session)1104 private static StatsEvent buildStatsEvent(VoiceCallSession session) { 1105 return TelephonyStatsLog.buildStatsEvent( 1106 VOICE_CALL_SESSION, 1107 session.bearerAtStart, 1108 session.bearerAtEnd, 1109 session.direction, 1110 // deprecated and replaced by setupDurationMillis 1111 VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN, 1112 session.setupFailed, 1113 session.disconnectReasonCode, 1114 session.disconnectExtraCode, 1115 session.disconnectExtraMessage, 1116 session.ratAtStart, 1117 session.ratAtEnd, 1118 session.ratSwitchCount, 1119 session.codecBitmask, 1120 session.concurrentCallCountAtStart, 1121 session.concurrentCallCountAtEnd, 1122 session.simSlotIndex, 1123 session.isMultiSim, 1124 session.isEsim, 1125 session.carrierId, 1126 session.srvccCompleted, 1127 session.srvccFailureCount, 1128 session.srvccCancellationCount, 1129 session.rttEnabled, 1130 session.isEmergency, 1131 session.isRoaming, 1132 // workaround: dimension required for keeping multiple pulled atoms 1133 sRandom.nextInt(), 1134 // New fields introduced in Android S 1135 session.signalStrengthAtEnd, 1136 session.bandAtEnd, 1137 session.setupDurationMillis, 1138 session.mainCodecQuality, 1139 session.videoEnabled, 1140 session.ratAtConnected, 1141 session.isMultiparty, 1142 session.callDuration, 1143 session.lastKnownRat, 1144 session.foldState, 1145 session.ratSwitchCountAfterConnected, 1146 session.handoverInProgress, 1147 session.isIwlanCrossSimAtStart, 1148 session.isIwlanCrossSimAtEnd, 1149 session.isIwlanCrossSimAtConnected, 1150 session.vonrEnabled, 1151 session.isNtn, 1152 session.supportsBusinessCallComposer, 1153 session.callComposerStatus, 1154 session.preciseCallStateOnSetup); 1155 1156 } 1157 buildStatsEvent(IncomingSms sms)1158 private static StatsEvent buildStatsEvent(IncomingSms sms) { 1159 return TelephonyStatsLog.buildStatsEvent( 1160 INCOMING_SMS, 1161 sms.smsFormat, 1162 sms.smsTech, 1163 sms.rat, 1164 sms.smsType, 1165 sms.totalParts, 1166 sms.receivedParts, 1167 sms.blocked, 1168 sms.error, 1169 sms.isRoaming, 1170 sms.simSlotIndex, 1171 sms.isMultiSim, 1172 sms.isEsim, 1173 sms.carrierId, 1174 sms.messageId, 1175 sms.count, 1176 sms.isManagedProfile, 1177 sms.isNtn, 1178 sms.isEmergency, 1179 sms.isNbIotNtn); 1180 } 1181 buildStatsEvent(OutgoingSms sms)1182 private static StatsEvent buildStatsEvent(OutgoingSms sms) { 1183 return TelephonyStatsLog.buildStatsEvent( 1184 OUTGOING_SMS, 1185 sms.smsFormat, 1186 sms.smsTech, 1187 sms.rat, 1188 sms.sendResult, 1189 sms.errorCode, 1190 sms.isRoaming, 1191 sms.isFromDefaultApp, 1192 sms.simSlotIndex, 1193 sms.isMultiSim, 1194 sms.isEsim, 1195 sms.carrierId, 1196 sms.messageId, 1197 sms.retryId, 1198 sms.intervalMillis, 1199 sms.count, 1200 sms.sendErrorCode, 1201 sms.networkErrorCode, 1202 sms.isManagedProfile, 1203 sms.isEmergency, 1204 sms.isNtn, 1205 sms.isMtSmsPolling, 1206 sms.isNbIotNtn); 1207 } 1208 buildStatsEvent(DataCallSession dataCallSession)1209 private static StatsEvent buildStatsEvent(DataCallSession dataCallSession) { 1210 return TelephonyStatsLog.buildStatsEvent( 1211 DATA_CALL_SESSION, 1212 dataCallSession.dimension, 1213 dataCallSession.isMultiSim, 1214 dataCallSession.isEsim, 1215 0, // profile is deprecated, so we default to 0 1216 dataCallSession.apnTypeBitmask, 1217 dataCallSession.carrierId, 1218 dataCallSession.isRoaming, 1219 dataCallSession.ratAtEnd, 1220 dataCallSession.oosAtEnd, 1221 dataCallSession.ratSwitchCount, 1222 dataCallSession.isOpportunistic, 1223 dataCallSession.ipType, 1224 dataCallSession.setupFailed, 1225 dataCallSession.failureCause, 1226 dataCallSession.suggestedRetryMillis, 1227 dataCallSession.deactivateReason, 1228 roundAndConvertMillisToMinutes( 1229 dataCallSession.durationMinutes * MILLIS_PER_MINUTE), 1230 dataCallSession.ongoing, 1231 dataCallSession.bandAtEnd, 1232 dataCallSession.handoverFailureCauses, 1233 dataCallSession.handoverFailureRat, 1234 dataCallSession.isNonDds, 1235 dataCallSession.isIwlanCrossSim, 1236 dataCallSession.isNtn, 1237 dataCallSession.isSatelliteTransport, 1238 dataCallSession.isProvisioningProfile, 1239 dataCallSession.isNbIotNtn); 1240 } 1241 buildStatsEvent(ImsRegistrationStats stats)1242 private static StatsEvent buildStatsEvent(ImsRegistrationStats stats) { 1243 return TelephonyStatsLog.buildStatsEvent( 1244 IMS_REGISTRATION_STATS, 1245 stats.carrierId, 1246 stats.simSlotIndex, 1247 stats.rat, 1248 roundAndConvertMillisToSeconds(stats.registeredMillis), 1249 roundAndConvertMillisToSeconds(stats.voiceCapableMillis), 1250 roundAndConvertMillisToSeconds(stats.voiceAvailableMillis), 1251 roundAndConvertMillisToSeconds(stats.smsCapableMillis), 1252 roundAndConvertMillisToSeconds(stats.smsAvailableMillis), 1253 roundAndConvertMillisToSeconds(stats.videoCapableMillis), 1254 roundAndConvertMillisToSeconds(stats.videoAvailableMillis), 1255 roundAndConvertMillisToSeconds(stats.utCapableMillis), 1256 roundAndConvertMillisToSeconds(stats.utAvailableMillis), 1257 roundAndConvertMillisToSeconds(stats.registeringMillis), 1258 roundAndConvertMillisToSeconds(stats.unregisteredMillis), 1259 stats.isIwlanCrossSim, 1260 stats.registeredTimes); 1261 } 1262 buildStatsEvent(ImsRegistrationTermination termination)1263 private static StatsEvent buildStatsEvent(ImsRegistrationTermination termination) { 1264 return TelephonyStatsLog.buildStatsEvent( 1265 IMS_REGISTRATION_TERMINATION, 1266 termination.carrierId, 1267 termination.isMultiSim, 1268 termination.ratAtEnd, 1269 termination.setupFailed, 1270 termination.reasonCode, 1271 termination.extraCode, 1272 termination.extraMessage, 1273 termination.count, 1274 termination.isIwlanCrossSim); 1275 } 1276 buildStatsEvent(NetworkRequestsV2 networkRequests)1277 private static StatsEvent buildStatsEvent(NetworkRequestsV2 networkRequests) { 1278 return TelephonyStatsLog.buildStatsEvent( 1279 TELEPHONY_NETWORK_REQUESTS_V2, 1280 networkRequests.carrierId, 1281 networkRequests.capability, 1282 networkRequests.requestCount); 1283 } 1284 buildStatsEvent(ImsRegistrationFeatureTagStats stats)1285 private static StatsEvent buildStatsEvent(ImsRegistrationFeatureTagStats stats) { 1286 return TelephonyStatsLog.buildStatsEvent( 1287 IMS_REGISTRATION_FEATURE_TAG_STATS, 1288 stats.carrierId, 1289 stats.slotId, 1290 stats.featureTagName, 1291 stats.registrationTech, 1292 roundAndConvertMillisToSeconds(stats.registeredMillis)); 1293 } 1294 buildStatsEvent(RcsClientProvisioningStats stats)1295 private static StatsEvent buildStatsEvent(RcsClientProvisioningStats stats) { 1296 return TelephonyStatsLog.buildStatsEvent( 1297 RCS_CLIENT_PROVISIONING_STATS, 1298 stats.carrierId, 1299 stats.slotId, 1300 stats.event, 1301 stats.count); 1302 } 1303 buildStatsEvent(RcsAcsProvisioningStats stats)1304 private static StatsEvent buildStatsEvent(RcsAcsProvisioningStats stats) { 1305 return TelephonyStatsLog.buildStatsEvent( 1306 RCS_ACS_PROVISIONING_STATS, 1307 stats.carrierId, 1308 stats.slotId, 1309 stats.responseCode, 1310 stats.responseType, 1311 stats.isSingleRegistrationEnabled, 1312 stats.count, 1313 roundAndConvertMillisToSeconds(stats.stateTimerMillis)); 1314 } 1315 buildStatsEvent(SipDelegateStats stats)1316 private static StatsEvent buildStatsEvent(SipDelegateStats stats) { 1317 return TelephonyStatsLog.buildStatsEvent( 1318 SIP_DELEGATE_STATS, 1319 stats.dimension, 1320 stats.carrierId, 1321 stats.slotId, 1322 roundAndConvertMillisToSeconds(stats.uptimeMillis), 1323 stats.destroyReason); 1324 } 1325 buildStatsEvent(SipTransportFeatureTagStats stats)1326 private static StatsEvent buildStatsEvent(SipTransportFeatureTagStats stats) { 1327 return TelephonyStatsLog.buildStatsEvent( 1328 SIP_TRANSPORT_FEATURE_TAG_STATS, 1329 stats.carrierId, 1330 stats.slotId, 1331 stats.featureTagName, 1332 stats.sipTransportDeniedReason, 1333 stats.sipTransportDeregisteredReason, 1334 roundAndConvertMillisToSeconds(stats.associatedMillis)); 1335 } 1336 buildStatsEvent(SipMessageResponse stats)1337 private static StatsEvent buildStatsEvent(SipMessageResponse stats) { 1338 return TelephonyStatsLog.buildStatsEvent( 1339 SIP_MESSAGE_RESPONSE, 1340 stats.carrierId, 1341 stats.slotId, 1342 stats.sipMessageMethod, 1343 stats.sipMessageResponse, 1344 stats.sipMessageDirection, 1345 stats.messageError, 1346 stats.count); 1347 } 1348 buildStatsEvent(SipTransportSession stats)1349 private static StatsEvent buildStatsEvent(SipTransportSession stats) { 1350 return TelephonyStatsLog.buildStatsEvent( 1351 SIP_TRANSPORT_SESSION, 1352 stats.carrierId, 1353 stats.slotId, 1354 stats.sessionMethod, 1355 stats.sipMessageDirection, 1356 stats.sipResponse, 1357 stats.sessionCount, 1358 stats.endedGracefullyCount); 1359 } 1360 buildStatsEvent(ImsDedicatedBearerListenerEvent stats)1361 private static StatsEvent buildStatsEvent(ImsDedicatedBearerListenerEvent stats) { 1362 return TelephonyStatsLog.buildStatsEvent( 1363 IMS_DEDICATED_BEARER_LISTENER_EVENT, 1364 stats.carrierId, 1365 stats.slotId, 1366 stats.ratAtEnd, 1367 stats.qci, 1368 stats.dedicatedBearerEstablished, 1369 stats.eventCount); 1370 } 1371 buildStatsEvent(ImsDedicatedBearerEvent stats)1372 private static StatsEvent buildStatsEvent(ImsDedicatedBearerEvent stats) { 1373 return TelephonyStatsLog.buildStatsEvent( 1374 IMS_DEDICATED_BEARER_EVENT, 1375 stats.carrierId, 1376 stats.slotId, 1377 stats.ratAtEnd, 1378 stats.qci, 1379 stats.bearerState, 1380 stats.localConnectionInfoReceived, 1381 stats.remoteConnectionInfoReceived, 1382 stats.hasListeners, 1383 stats.count); 1384 } 1385 buildStatsEvent(ImsRegistrationServiceDescStats stats)1386 private static StatsEvent buildStatsEvent(ImsRegistrationServiceDescStats stats) { 1387 return TelephonyStatsLog.buildStatsEvent( 1388 IMS_REGISTRATION_SERVICE_DESC_STATS, 1389 stats.carrierId, 1390 stats.slotId, 1391 stats.serviceIdName, 1392 stats.serviceIdVersion, 1393 stats.registrationTech, 1394 roundAndConvertMillisToSeconds(stats.publishedMillis)); 1395 } 1396 buildStatsEvent(UceEventStats stats)1397 private static StatsEvent buildStatsEvent(UceEventStats stats) { 1398 return TelephonyStatsLog.buildStatsEvent( 1399 UCE_EVENT_STATS, 1400 stats.carrierId, 1401 stats.slotId, 1402 stats.type, 1403 stats.successful, 1404 stats.commandCode, 1405 stats.networkResponse, 1406 stats.count); 1407 } 1408 buildStatsEvent(PresenceNotifyEvent stats)1409 private static StatsEvent buildStatsEvent(PresenceNotifyEvent stats) { 1410 return TelephonyStatsLog.buildStatsEvent( 1411 PRESENCE_NOTIFY_EVENT, 1412 stats.carrierId, 1413 stats.slotId, 1414 stats.reason, 1415 stats.contentBodyReceived, 1416 stats.rcsCapsCount, 1417 stats.mmtelCapsCount, 1418 stats.noCapsCount, 1419 stats.count); 1420 } 1421 buildStatsEvent(GbaEvent stats)1422 private static StatsEvent buildStatsEvent(GbaEvent stats) { 1423 return TelephonyStatsLog.buildStatsEvent( 1424 GBA_EVENT, 1425 stats.carrierId, 1426 stats.slotId, 1427 stats.successful, 1428 stats.failedReason, 1429 stats.count); 1430 } 1431 buildStatsEvent(OutgoingShortCodeSms shortCodeSms)1432 private static StatsEvent buildStatsEvent(OutgoingShortCodeSms shortCodeSms) { 1433 return TelephonyStatsLog.buildStatsEvent( 1434 OUTGOING_SHORT_CODE_SMS, 1435 shortCodeSms.category, 1436 shortCodeSms.xmlVersion, 1437 shortCodeSms.shortCodeSmsCount); 1438 } 1439 buildStatsEvent(EmergencyNumbersInfo emergencyNumber)1440 private static StatsEvent buildStatsEvent(EmergencyNumbersInfo emergencyNumber) { 1441 return TelephonyStatsLog.buildStatsEvent( 1442 EMERGENCY_NUMBERS_INFO, 1443 emergencyNumber.isDbVersionIgnored, 1444 emergencyNumber.assetVersion, 1445 emergencyNumber.otaVersion, 1446 emergencyNumber.number, 1447 emergencyNumber.countryIso, 1448 emergencyNumber.mnc, 1449 emergencyNumber.route, 1450 emergencyNumber.urns, 1451 emergencyNumber.serviceCategories, 1452 emergencyNumber.sources); 1453 } 1454 buildStatsEvent(SatelliteController satelliteController)1455 private static StatsEvent buildStatsEvent(SatelliteController satelliteController) { 1456 return TelephonyStatsLog.buildStatsEvent( 1457 SATELLITE_CONTROLLER, 1458 satelliteController.countOfSatelliteServiceEnablementsSuccess, 1459 satelliteController.countOfSatelliteServiceEnablementsFail, 1460 satelliteController.countOfOutgoingDatagramSuccess, 1461 satelliteController.countOfOutgoingDatagramFail, 1462 satelliteController.countOfIncomingDatagramSuccess, 1463 satelliteController.countOfIncomingDatagramFail, 1464 satelliteController.countOfDatagramTypeSosSmsSuccess, 1465 satelliteController.countOfDatagramTypeSosSmsFail, 1466 satelliteController.countOfDatagramTypeLocationSharingSuccess, 1467 satelliteController.countOfDatagramTypeLocationSharingFail, 1468 satelliteController.countOfProvisionSuccess, 1469 satelliteController.countOfProvisionFail, 1470 satelliteController.countOfDeprovisionSuccess, 1471 satelliteController.countOfDeprovisionFail, 1472 satelliteController.totalServiceUptimeSec, 1473 satelliteController.totalBatteryConsumptionPercent, 1474 satelliteController.totalBatteryChargedTimeSec, 1475 satelliteController.countOfDemoModeSatelliteServiceEnablementsSuccess, 1476 satelliteController.countOfDemoModeSatelliteServiceEnablementsFail, 1477 satelliteController.countOfDemoModeOutgoingDatagramSuccess, 1478 satelliteController.countOfDemoModeOutgoingDatagramFail, 1479 satelliteController.countOfDemoModeIncomingDatagramSuccess, 1480 satelliteController.countOfDemoModeIncomingDatagramFail, 1481 satelliteController.countOfDatagramTypeKeepAliveSuccess, 1482 satelliteController.countOfDatagramTypeKeepAliveFail, 1483 satelliteController.countOfAllowedSatelliteAccess, 1484 satelliteController.countOfDisallowedSatelliteAccess, 1485 satelliteController.countOfSatelliteAccessCheckFail, 1486 satelliteController.isProvisioned, 1487 satelliteController.carrierId, 1488 satelliteController.countOfSatelliteAllowedStateChangedEvents, 1489 satelliteController.countOfSuccessfulLocationQueries, 1490 satelliteController.countOfFailedLocationQueries, 1491 satelliteController.countOfP2PSmsAvailableNotificationShown, 1492 satelliteController.countOfP2PSmsAvailableNotificationRemoved, 1493 satelliteController.isNtnOnlyCarrier, 1494 satelliteController.versionOfSatelliteAccessConfig, 1495 satelliteController.countOfIncomingDatagramTypeSosSmsSuccess, 1496 satelliteController.countOfIncomingDatagramTypeSosSmsFail, 1497 satelliteController.countOfOutgoingDatagramTypeSmsSuccess, 1498 satelliteController.countOfOutgoingDatagramTypeSmsFail, 1499 satelliteController.countOfIncomingDatagramTypeSmsSuccess, 1500 satelliteController.countOfIncomingDatagramTypeSmsFail); 1501 } 1502 buildStatsEvent(SatelliteSession satelliteSession)1503 private static StatsEvent buildStatsEvent(SatelliteSession satelliteSession) { 1504 return TelephonyStatsLog.buildStatsEvent( 1505 SATELLITE_SESSION, 1506 satelliteSession.satelliteServiceInitializationResult, 1507 satelliteSession.satelliteTechnology, 1508 satelliteSession.count, 1509 satelliteSession.satelliteServiceTerminationResult, 1510 satelliteSession.initializationProcessingTimeMillis, 1511 satelliteSession.terminationProcessingTimeMillis, 1512 satelliteSession.sessionDurationSeconds, 1513 satelliteSession.countOfOutgoingDatagramSuccess, 1514 satelliteSession.countOfOutgoingDatagramFailed, 1515 satelliteSession.countOfIncomingDatagramSuccess, 1516 satelliteSession.countOfIncomingDatagramFailed, 1517 satelliteSession.isDemoMode, 1518 satelliteSession.maxNtnSignalStrengthLevel, 1519 satelliteSession.carrierId, 1520 satelliteSession.countOfSatelliteNotificationDisplayed, 1521 satelliteSession.countOfAutoExitDueToScreenOff, 1522 satelliteSession.countOfAutoExitDueToTnNetwork, 1523 satelliteSession.isEmergency, 1524 satelliteSession.isNtnOnlyCarrier, 1525 satelliteSession.maxInactivityDurationSec); 1526 } 1527 buildStatsEvent(SatelliteIncomingDatagram stats)1528 private static StatsEvent buildStatsEvent(SatelliteIncomingDatagram stats) { 1529 return TelephonyStatsLog.buildStatsEvent( 1530 SATELLITE_INCOMING_DATAGRAM, 1531 stats.resultCode, 1532 stats.datagramSizeBytes, 1533 stats.datagramTransferTimeMillis, 1534 stats.isDemoMode, 1535 stats.carrierId, 1536 stats.isNtnOnlyCarrier); 1537 } 1538 buildStatsEvent(SatelliteOutgoingDatagram stats)1539 private static StatsEvent buildStatsEvent(SatelliteOutgoingDatagram stats) { 1540 return TelephonyStatsLog.buildStatsEvent( 1541 SATELLITE_OUTGOING_DATAGRAM, 1542 stats.datagramType, 1543 stats.resultCode, 1544 stats.datagramSizeBytes, 1545 stats.datagramTransferTimeMillis, 1546 stats.isDemoMode, 1547 stats.carrierId, 1548 stats.isNtnOnlyCarrier); 1549 } 1550 buildStatsEvent(SatelliteProvision stats)1551 private static StatsEvent buildStatsEvent(SatelliteProvision stats) { 1552 return TelephonyStatsLog.buildStatsEvent( 1553 SATELLITE_PROVISION, 1554 stats.resultCode, 1555 stats.provisioningTimeSec, 1556 stats.isProvisionRequest, 1557 stats.isCanceled, 1558 stats.carrierId, 1559 stats.isNtnOnlyCarrier); 1560 } 1561 buildStatsEvent(SatelliteSosMessageRecommender stats)1562 private static StatsEvent buildStatsEvent(SatelliteSosMessageRecommender stats) { 1563 return TelephonyStatsLog.buildStatsEvent( 1564 SATELLITE_SOS_MESSAGE_RECOMMENDER, 1565 stats.isDisplaySosMessageSent, 1566 stats.countOfTimerStarted, 1567 stats.isImsRegistered, 1568 stats.cellularServiceState, 1569 stats.count, 1570 stats.isMultiSim, 1571 stats.recommendingHandoverType, 1572 stats.isSatelliteAllowedInCurrentLocation, 1573 stats.isWifiConnected, 1574 stats.carrierId, 1575 stats.isNtnOnlyCarrier); 1576 } 1577 buildStatsEvent(DataNetworkValidation stats)1578 private static StatsEvent buildStatsEvent(DataNetworkValidation stats) { 1579 return TelephonyStatsLog.buildStatsEvent( 1580 DATA_NETWORK_VALIDATION, 1581 stats.networkType, 1582 stats.apnTypeBitmask, 1583 stats.signalStrength, 1584 stats.validationResult, 1585 stats.elapsedTimeInMillis, 1586 stats.handoverAttempted, 1587 stats.networkValidationCount); 1588 } 1589 buildStatsEvent(CarrierRoamingSatelliteSession stats)1590 private static StatsEvent buildStatsEvent(CarrierRoamingSatelliteSession stats) { 1591 return TelephonyStatsLog.buildStatsEvent( 1592 CARRIER_ROAMING_SATELLITE_SESSION, 1593 stats.carrierId, 1594 stats.isNtnRoamingInHomeCountry, 1595 stats.totalSatelliteModeTimeSec, 1596 stats.numberOfSatelliteConnections, 1597 stats.avgDurationOfSatelliteConnectionSec, 1598 stats.satelliteConnectionGapMinSec, 1599 stats.satelliteConnectionGapAvgSec, 1600 stats.satelliteConnectionGapMaxSec, 1601 stats.rsrpAvg, 1602 stats.rsrpMedian, 1603 stats.rssnrAvg, 1604 stats.rssnrMedian, 1605 stats.countOfIncomingSms, 1606 stats.countOfOutgoingSms, 1607 stats.countOfIncomingMms, 1608 stats.countOfOutgoingMms, 1609 stats.supportedSatelliteServices, 1610 stats.serviceDataPolicy, 1611 stats.satelliteDataConsumedBytes, 1612 stats.isMultiSim, 1613 stats.isNbIotNtn); 1614 } 1615 buildStatsEvent(CarrierRoamingSatelliteControllerStats stats)1616 private static StatsEvent buildStatsEvent(CarrierRoamingSatelliteControllerStats stats) { 1617 return TelephonyStatsLog.buildStatsEvent( 1618 CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS, 1619 stats.configDataSource, 1620 stats.countOfEntitlementStatusQueryRequest, 1621 stats.countOfSatelliteConfigUpdateRequest, 1622 stats.countOfSatelliteNotificationDisplayed, 1623 stats.satelliteSessionGapMinSec, 1624 stats.satelliteSessionGapAvgSec, 1625 stats.satelliteSessionGapMaxSec, 1626 stats.carrierId, 1627 stats.isDeviceEntitled, 1628 stats.isMultiSim, 1629 stats.countOfSatelliteSessions, 1630 stats.isNbIotNtn); 1631 } 1632 buildStatsEvent(SatelliteEntitlement stats)1633 private static StatsEvent buildStatsEvent(SatelliteEntitlement stats) { 1634 return TelephonyStatsLog.buildStatsEvent( 1635 SATELLITE_ENTITLEMENT, 1636 stats.carrierId, 1637 stats.result, 1638 stats.entitlementStatus, 1639 stats.isRetry, 1640 stats.count, 1641 stats.isAllowedServiceEntitlement, 1642 stats.entitlementServiceType, 1643 stats.entitlementDataPolicy); 1644 } 1645 buildStatsEvent(SatelliteConfigUpdater stats)1646 private static StatsEvent buildStatsEvent(SatelliteConfigUpdater stats) { 1647 return TelephonyStatsLog.buildStatsEvent(SATELLITE_CONFIG_UPDATER, 1648 stats.configVersion, 1649 stats.oemConfigResult, 1650 stats.carrierConfigResult, 1651 stats.count); 1652 } 1653 buildStatsEvent(SatelliteAccessController stats)1654 private static StatsEvent buildStatsEvent(SatelliteAccessController stats) { 1655 return TelephonyStatsLog.buildStatsEvent( 1656 SATELLITE_ACCESS_CONTROLLER, 1657 stats.accessControlType, 1658 stats.locationQueryTimeMillis, 1659 stats.onDeviceLookupTimeMillis, 1660 stats.totalCheckingTimeMillis, 1661 stats.isAllowed, 1662 stats.isEmergency, 1663 stats.resultCode, 1664 stats.countryCodes, 1665 stats.configDataSource, 1666 stats.carrierId, 1667 stats.triggeringEvent, 1668 stats.isNtnOnlyCarrier); 1669 } 1670 1671 /** Returns all phones in {@link PhoneFactory}, or an empty array if phones not made yet. */ getPhonesIfAny()1672 static Phone[] getPhonesIfAny() { 1673 try { 1674 return PhoneFactory.getPhones(); 1675 } catch (IllegalStateException e) { 1676 // Phones have not been made yet 1677 return new Phone[0]; 1678 } 1679 } 1680 1681 /** 1682 * Rounds the duration and converts it from milliseconds to seconds. 1683 */ roundAndConvertMillisToSeconds(long valueMillis)1684 private static int roundAndConvertMillisToSeconds(long valueMillis) { 1685 return roundAndConvertMillisToSeconds(valueMillis, DURATION_BUCKET_MILLIS); 1686 } 1687 1688 /** 1689 * Rounds the duration and converts it from milliseconds to seconds. 1690 */ roundAndConvertMillisToSeconds(long valueMillis, long durationBucketSize)1691 private static int roundAndConvertMillisToSeconds(long valueMillis, long durationBucketSize) { 1692 long roundedValueMillis = Math.round((double) valueMillis / durationBucketSize) 1693 * durationBucketSize; 1694 return (int) (roundedValueMillis / MILLIS_PER_SECOND); 1695 } 1696 1697 /** 1698 * Rounds the duration and converts it from milliseconds to minutes. 1699 */ roundAndConvertMillisToMinutes(long valueMillis)1700 private static int roundAndConvertMillisToMinutes(long valueMillis) { 1701 long roundedValueMillis = Math.round((double) valueMillis / DURATION_BUCKET_MILLIS) 1702 * DURATION_BUCKET_MILLIS; 1703 return (int) (roundedValueMillis / MILLIS_PER_MINUTE); 1704 } 1705 } 1706