aboutsummaryrefslogtreecommitdiff
path: root/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/android/internal/telephony/metrics/MetricsCollector.java')
-rw-r--r--src/java/com/android/internal/telephony/metrics/MetricsCollector.java161
1 files changed, 111 insertions, 50 deletions
diff --git a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
index 3e49139cce..8bd25475b0 100644
--- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
+++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
@@ -53,7 +53,9 @@ import static com.android.internal.telephony.TelephonyStatsLog.UCE_EVENT_STATS;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_RAT_USAGE;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN;
+import static com.android.internal.telephony.util.TelephonyUtils.IS_DEBUGGABLE;
+import android.annotation.NonNull;
import android.app.StatsManager;
import android.content.Context;
import android.telephony.SubscriptionManager;
@@ -65,6 +67,7 @@ import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyStatsLog;
import com.android.internal.telephony.emergency.EmergencyNumberTracker;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.internal.telephony.nano.PersistAtomsProto.CellularDataServiceSwitch;
import com.android.internal.telephony.nano.PersistAtomsProto.CellularServiceState;
@@ -97,6 +100,8 @@ import com.android.internal.telephony.nano.PersistAtomsProto.SipTransportSession
import com.android.internal.telephony.nano.PersistAtomsProto.UceEventStats;
import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallRatUsage;
import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession;
+import com.android.internal.telephony.uicc.UiccController;
+import com.android.internal.telephony.uicc.UiccSlot;
import com.android.internal.util.ConcurrentUtils;
import com.android.telephony.Rlog;
@@ -134,34 +139,55 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
DBG ? 10L * MILLIS_PER_SECOND : 23L * MILLIS_PER_HOUR;
/**
+ * Sets atom pull cool down to 4 minutes for userdebug build.
+ *
+ * <p>Applies to certain atoms: CellularServiceState.
+ */
+ private static final long CELL_SERVICE_MIN_COOLDOWN_MILLIS =
+ DBG ? 10L * MILLIS_PER_SECOND :
+ IS_DEBUGGABLE ? 4L * MILLIS_PER_MINUTE : 23L * MILLIS_PER_HOUR;
+
+ /**
* Buckets with less than these many calls will be dropped.
*
* <p>Applies to metrics with duration fields. Currently used by voice call RAT usages.
*/
private static final long MIN_CALLS_PER_BUCKET = DBG ? 0L : 5L;
- /** Bucket size in milliseconds to round call durations into. */
+ /** Bucket size in milliseconds to round call durations info. */
private static final long DURATION_BUCKET_MILLIS =
DBG ? 2L * MILLIS_PER_SECOND : 5L * MILLIS_PER_MINUTE;
+ /**
+ * Sets smaller bucket size to round call durations for userdebug build.
+ *
+ * <p>Applies to certain atoms: CellularServiceState.
+ */
+ private static final long CELL_SERVICE_DURATION_BUCKET_MILLIS =
+ DBG || IS_DEBUGGABLE ? 2L * MILLIS_PER_SECOND : 5L * MILLIS_PER_MINUTE;
+
private final PersistAtomsStorage mStorage;
private final DeviceStateHelper mDeviceStateHelper;
private final StatsManager mStatsManager;
+ private final VonrHelper mVonrHelper;
private final AirplaneModeStats mAirplaneModeStats;
private final Set<DataCallSessionStats> mOngoingDataCallStats = ConcurrentHashMap.newKeySet();
private static final Random sRandom = new Random();
- public MetricsCollector(Context context) {
- this(context, new PersistAtomsStorage(context), new DeviceStateHelper(context));
+ public MetricsCollector(Context context, @NonNull FeatureFlags featureFlags) {
+ this(context, new PersistAtomsStorage(context),
+ new DeviceStateHelper(context), new VonrHelper(featureFlags));
}
/** Allows dependency injection. Used during unit tests. */
@VisibleForTesting
public MetricsCollector(
- Context context, PersistAtomsStorage storage, DeviceStateHelper deviceStateHelper) {
+ Context context, PersistAtomsStorage storage, DeviceStateHelper deviceStateHelper,
+ VonrHelper vonrHelper) {
mStorage = storage;
mDeviceStateHelper = deviceStateHelper;
mStatsManager = (StatsManager) context.getSystemService(Context.STATS_MANAGER);
+ mVonrHelper = vonrHelper;
if (mStatsManager != null) {
// Most (but not all) of these are subject to cooldown specified by MIN_COOLDOWN_MILLIS.
registerAtom(CELLULAR_DATA_SERVICE_SWITCH);
@@ -193,13 +219,13 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
registerAtom(GBA_EVENT);
registerAtom(PER_SIM_STATUS);
registerAtom(OUTGOING_SHORT_CODE_SMS);
+ registerAtom(EMERGENCY_NUMBERS_INFO);
registerAtom(SATELLITE_CONTROLLER);
registerAtom(SATELLITE_SESSION);
registerAtom(SATELLITE_INCOMING_DATAGRAM);
registerAtom(SATELLITE_OUTGOING_DATAGRAM);
registerAtom(SATELLITE_PROVISION);
registerAtom(SATELLITE_SOS_MESSAGE_RECOMMENDER);
- registerAtom(EMERGENCY_NUMBERS_INFO);
Rlog.d(TAG, "registered");
} else {
Rlog.e(TAG, "could not get StatsManager, atoms not registered");
@@ -276,6 +302,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
return pullPerSimStatus(data);
case OUTGOING_SHORT_CODE_SMS:
return pullOutgoingShortCodeSms(data);
+ case EMERGENCY_NUMBERS_INFO:
+ return pullEmergencyNumbersInfo(data);
case SATELLITE_CONTROLLER:
return pullSatelliteController(data);
case SATELLITE_SESSION:
@@ -288,8 +316,6 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
return pullSatelliteProvision(data);
case SATELLITE_SOS_MESSAGE_RECOMMENDER:
return pullSatelliteSosMessageRecommender(data);
- case EMERGENCY_NUMBERS_INFO:
- return pullEmergencyNumbersInfo(data);
default:
Rlog.e(TAG, String.format("unexpected atom ID %d", atomTag));
return StatsManager.PULL_SKIP;
@@ -306,6 +332,11 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
return mDeviceStateHelper;
}
+ /** Returns the {@link VonrHelper}. */
+ public VonrHelper getVonrHelper() {
+ return mVonrHelper;
+ }
+
/** Updates duration segments and calls {@link PersistAtomsStorage#flushAtoms()}. */
public void flushAtomsStorage() {
concludeAll();
@@ -383,7 +414,9 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
SIM_SLOT_STATE,
state.numActiveSlots,
state.numActiveSims,
- state.numActiveEsims));
+ state.numActiveEsims,
+ state.numActiveEsimSlots,
+ state.numActiveMepSlots));
return StatsManager.PULL_SUCCESS;
}
@@ -506,7 +539,7 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
// Include the latest durations
concludeServiceStateStats();
CellularServiceState[] persistAtoms =
- mStorage.getCellularServiceStates(MIN_COOLDOWN_MILLIS);
+ mStorage.getCellularServiceStates(CELL_SERVICE_MIN_COOLDOWN_MILLIS);
if (persistAtoms != null) {
// list is already shuffled when instances were inserted
Arrays.stream(persistAtoms)
@@ -572,9 +605,14 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
boolean hasDedicatedManagedProfileSub = Arrays.stream(phones)
.anyMatch(Phone::isManagedProfile);
+ UiccSlot[] slots = UiccController.getInstance().getUiccSlots();
+ int mepSupportedSlotCount = (int) Arrays.stream(slots)
+ .filter(UiccSlot::isMultipleEnabledProfileSupported)
+ .count();
+
data.add(TelephonyStatsLog.buildStatsEvent(DEVICE_TELEPHONY_PROPERTIES, true,
isAutoDataSwitchOn, mStorage.getAutoDataSwitchToggleCount(),
- hasDedicatedManagedProfileSub));
+ hasDedicatedManagedProfileSub, mepSupportedSlotCount));
return StatsManager.PULL_SUCCESS;
}
@@ -777,7 +815,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
perSimStatus.minimumVoltageClass, // simVoltageClass
perSimStatus.userModifiedApnTypes, // userModifiedApnTypeBitmask
perSimStatus.unmeteredNetworks, // unmeteredNetworks
- perSimStatus.vonrEnabled); // vonrEnabled
+ perSimStatus.vonrEnabled, // vonrEnabled
+ perSimStatus.crossSimCallingEnabled); // crossSimCallingEnabled
data.add(statsEvent);
result = StatsManager.PULL_SUCCESS;
}
@@ -797,6 +836,21 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
}
}
+ private int pullEmergencyNumbersInfo(List<StatsEvent> data) {
+ boolean isDataLogged = false;
+ for (Phone phone : getPhonesIfAny()) {
+ if (phone != null) {
+ EmergencyNumberTracker tracker = phone.getEmergencyNumberTracker();
+ if (tracker != null) {
+ EmergencyNumbersInfo[] numList = tracker.getEmergencyNumbersProtoArray();
+ Arrays.stream(numList).forEach(number -> data.add(buildStatsEvent(number)));
+ isDataLogged = true;
+ }
+ }
+ }
+ return isDataLogged ? StatsManager.PULL_SUCCESS : StatsManager.PULL_SKIP;
+ }
+
private int pullSatelliteController(List<StatsEvent> data) {
SatelliteController[] controllerAtoms =
mStorage.getSatelliteControllerStats(MIN_COOLDOWN_MILLIS);
@@ -877,21 +931,6 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
}
}
- private int pullEmergencyNumbersInfo(List<StatsEvent> data) {
- boolean isDataLogged = false;
- for (Phone phone : getPhonesIfAny()) {
- if (phone != null) {
- EmergencyNumberTracker tracker = phone.getEmergencyNumberTracker();
- if (tracker != null) {
- EmergencyNumbersInfo[] numList = tracker.getEmergencyNumbersProtoArray();
- Arrays.stream(numList).forEach(number -> data.add(buildStatsEvent(number)));
- isDataLogged = true;
- }
- }
- }
- return isDataLogged ? StatsManager.PULL_SUCCESS : StatsManager.PULL_SKIP;
- }
-
/** Registers a pulled atom ID {@code atomId}. */
private void registerAtom(int atomId) {
mStatsManager.setPullAtomCallback(atomId, /* metadata= */ null,
@@ -920,12 +959,14 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
state.simSlotIndex,
state.isMultiSim,
state.carrierId,
- roundAndConvertMillisToSeconds(state.totalTimeMillis),
+ roundAndConvertMillisToSeconds(state.totalTimeMillis,
+ CELL_SERVICE_DURATION_BUCKET_MILLIS),
state.isEmergencyOnly,
state.isInternetPdnUp,
state.foldState,
state.overrideVoiceService,
- state.isDataEnabled);
+ state.isDataEnabled,
+ state.isIwlanCrossSim);
}
private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) {
@@ -979,7 +1020,12 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
session.lastKnownRat,
session.foldState,
session.ratSwitchCountAfterConnected,
- session.handoverInProgress);
+ session.handoverInProgress,
+ session.isIwlanCrossSimAtStart,
+ session.isIwlanCrossSimAtEnd,
+ session.isIwlanCrossSimAtConnected,
+ session.vonrEnabled);
+
}
private static StatsEvent buildStatsEvent(IncomingSms sms) {
@@ -1051,7 +1097,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
dataCallSession.bandAtEnd,
dataCallSession.handoverFailureCauses,
dataCallSession.handoverFailureRat,
- dataCallSession.isNonDds);
+ dataCallSession.isNonDds,
+ dataCallSession.isIwlanCrossSim);
}
private static StatsEvent buildStatsEvent(ImsRegistrationStats stats) {
@@ -1068,7 +1115,10 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
roundAndConvertMillisToSeconds(stats.videoCapableMillis),
roundAndConvertMillisToSeconds(stats.videoAvailableMillis),
roundAndConvertMillisToSeconds(stats.utCapableMillis),
- roundAndConvertMillisToSeconds(stats.utAvailableMillis));
+ roundAndConvertMillisToSeconds(stats.utAvailableMillis),
+ roundAndConvertMillisToSeconds(stats.registeringMillis),
+ roundAndConvertMillisToSeconds(stats.unregisteredMillis),
+ stats.isIwlanCrossSim);
}
private static StatsEvent buildStatsEvent(ImsRegistrationTermination termination) {
@@ -1081,7 +1131,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
termination.reasonCode,
termination.extraCode,
termination.extraMessage,
- termination.count);
+ termination.count,
+ termination.isIwlanCrossSim);
}
private static StatsEvent buildStatsEvent(NetworkRequestsV2 networkRequests) {
@@ -1247,6 +1298,21 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
shortCodeSms.shortCodeSmsCount);
}
+ private static StatsEvent buildStatsEvent(EmergencyNumbersInfo emergencyNumber) {
+ return TelephonyStatsLog.buildStatsEvent(
+ EMERGENCY_NUMBERS_INFO,
+ emergencyNumber.isDbVersionIgnored,
+ emergencyNumber.assetVersion,
+ emergencyNumber.otaVersion,
+ emergencyNumber.number,
+ emergencyNumber.countryIso,
+ emergencyNumber.mnc,
+ emergencyNumber.route,
+ emergencyNumber.urns,
+ emergencyNumber.serviceCategories,
+ emergencyNumber.sources);
+ }
+
private static StatsEvent buildStatsEvent(SatelliteController satelliteController) {
return TelephonyStatsLog.buildStatsEvent(
SATELLITE_CONTROLLER,
@@ -1310,22 +1376,10 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
stats.countOfTimerStarted,
stats.isImsRegistered,
stats.cellularServiceState,
- stats.count);
- }
-
- private static StatsEvent buildStatsEvent(EmergencyNumbersInfo emergencyNumber) {
- return TelephonyStatsLog.buildStatsEvent(
- EMERGENCY_NUMBERS_INFO,
- emergencyNumber.isDbVersionIgnored,
- emergencyNumber.assetVersion,
- emergencyNumber.otaVersion,
- emergencyNumber.number,
- emergencyNumber.countryIso,
- emergencyNumber.mnc,
- emergencyNumber.route,
- emergencyNumber.urns,
- emergencyNumber.serviceCategories,
- emergencyNumber.sources);
+ stats.count,
+ stats.isMultiSim,
+ stats.recommendingHandoverType,
+ stats.isSatelliteAllowedInCurrentLocation);
}
/** Returns all phones in {@link PhoneFactory}, or an empty array if phones not made yet. */
@@ -1342,8 +1396,15 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
* Rounds the duration and converts it from milliseconds to seconds.
*/
private static int roundAndConvertMillisToSeconds(long valueMillis) {
- long roundedValueMillis = Math.round((double) valueMillis / DURATION_BUCKET_MILLIS)
- * DURATION_BUCKET_MILLIS;
+ return roundAndConvertMillisToSeconds(valueMillis, DURATION_BUCKET_MILLIS);
+ }
+
+ /**
+ * Rounds the duration and converts it from milliseconds to seconds.
+ */
+ private static int roundAndConvertMillisToSeconds(long valueMillis, long durationBucketSize) {
+ long roundedValueMillis = Math.round((double) valueMillis / durationBucketSize)
+ * durationBucketSize;
return (int) (roundedValueMillis / MILLIS_PER_SECOND);
}