aboutsummaryrefslogtreecommitdiff
path: root/src/java/com/android/internal/telephony/metrics/ImsStats.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/android/internal/telephony/metrics/ImsStats.java')
-rw-r--r--src/java/com/android/internal/telephony/metrics/ImsStats.java163
1 files changed, 100 insertions, 63 deletions
diff --git a/src/java/com/android/internal/telephony/metrics/ImsStats.java b/src/java/com/android/internal/telephony/metrics/ImsStats.java
index 427595ff8c..04c9677453 100644
--- a/src/java/com/android/internal/telephony/metrics/ImsStats.java
+++ b/src/java/com/android/internal/telephony/metrics/ImsStats.java
@@ -23,6 +23,7 @@ import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPAB
import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT;
import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO;
import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE;
+import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_LTE;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_NONE;
@@ -39,6 +40,7 @@ import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsReasonInfo;
+import android.telephony.ims.ImsRegistrationAttributes;
import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.RegistrationManager.ImsRegistrationState;
import android.telephony.ims.feature.MmTelFeature.MmTelCapabilities;
@@ -197,7 +199,7 @@ public class ImsStats {
@ImsRegistrationState private int mLastRegistrationState = REGISTRATION_STATE_NOT_REGISTERED;
private long mLastTimestamp;
- @Nullable private ImsRegistrationStats mLastRegistrationStats;
+ private ImsRegistrationStats mLastRegistrationStats;
@TransportType int mLastTransportType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID;
// Available features are those reported by ImsService to be available for use.
private MmTelCapabilities mLastAvailableFeatures = new MmTelCapabilities();
@@ -210,6 +212,10 @@ public class ImsStats {
public ImsStats(ImsPhone phone) {
mPhone = phone;
mStorage = PhoneFactory.getMetricsCollector().getAtomsStorage();
+
+ mLastRegistrationStats = getDefaultImsRegistrationStats();
+ updateImsRegistrationStats();
+ mLastTimestamp = getTimeMillis();
}
/**
@@ -221,40 +227,52 @@ public class ImsStats {
public synchronized void conclude() {
long now = getTimeMillis();
- // Currently not tracking time spent on registering.
- if (mLastRegistrationState == REGISTRATION_STATE_REGISTERED) {
- ImsRegistrationStats stats = copyOf(mLastRegistrationStats);
- long duration = now - mLastTimestamp;
+ long duration = now - mLastTimestamp;
+ if (duration < MIN_REGISTRATION_DURATION_MILLIS) {
+ logw("conclude: discarding transient stats, duration=%d", duration);
+ } else {
+ ImsRegistrationStats stats = copyOfDimensionsOnly(mLastRegistrationStats);
- if (duration < MIN_REGISTRATION_DURATION_MILLIS) {
- logw("conclude: discarding transient stats, duration=%d", duration);
- } else {
- stats.registeredMillis = duration;
-
- stats.voiceAvailableMillis =
- mLastAvailableFeatures.isCapable(CAPABILITY_TYPE_VOICE) ? duration : 0;
- stats.videoAvailableMillis =
- mLastAvailableFeatures.isCapable(CAPABILITY_TYPE_VIDEO) ? duration : 0;
- stats.utAvailableMillis =
- mLastAvailableFeatures.isCapable(CAPABILITY_TYPE_UT) ? duration : 0;
- stats.smsAvailableMillis =
- mLastAvailableFeatures.isCapable(CAPABILITY_TYPE_SMS) ? duration : 0;
-
- MmTelCapabilities lastCapableFeatures =
- stats.rat == TelephonyManager.NETWORK_TYPE_IWLAN
- ? mLastWlanCapableFeatures
- : mLastWwanCapableFeatures;
- stats.voiceCapableMillis =
- lastCapableFeatures.isCapable(CAPABILITY_TYPE_VOICE) ? duration : 0;
- stats.videoCapableMillis =
- lastCapableFeatures.isCapable(CAPABILITY_TYPE_VIDEO) ? duration : 0;
- stats.utCapableMillis =
- lastCapableFeatures.isCapable(CAPABILITY_TYPE_UT) ? duration : 0;
- stats.smsCapableMillis =
- lastCapableFeatures.isCapable(CAPABILITY_TYPE_SMS) ? duration : 0;
-
- mStorage.addImsRegistrationStats(stats);
+ if (stats.rat == TelephonyManager.NETWORK_TYPE_UNKNOWN) {
+ logw("conclude: discarding UNKNOWN RAT, duration=%d", duration);
+ mLastTimestamp = now;
+ return;
}
+
+ switch (mLastRegistrationState) {
+ case REGISTRATION_STATE_REGISTERED:
+ stats.registeredMillis = duration;
+
+ stats.voiceAvailableMillis =
+ mLastAvailableFeatures.isCapable(CAPABILITY_TYPE_VOICE) ? duration : 0;
+ stats.videoAvailableMillis =
+ mLastAvailableFeatures.isCapable(CAPABILITY_TYPE_VIDEO) ? duration : 0;
+ stats.utAvailableMillis =
+ mLastAvailableFeatures.isCapable(CAPABILITY_TYPE_UT) ? duration : 0;
+ stats.smsAvailableMillis =
+ mLastAvailableFeatures.isCapable(CAPABILITY_TYPE_SMS) ? duration : 0;
+
+ MmTelCapabilities lastCapableFeatures =
+ stats.rat == TelephonyManager.NETWORK_TYPE_IWLAN
+ ? mLastWlanCapableFeatures
+ : mLastWwanCapableFeatures;
+ stats.voiceCapableMillis =
+ lastCapableFeatures.isCapable(CAPABILITY_TYPE_VOICE) ? duration : 0;
+ stats.videoCapableMillis =
+ lastCapableFeatures.isCapable(CAPABILITY_TYPE_VIDEO) ? duration : 0;
+ stats.utCapableMillis =
+ lastCapableFeatures.isCapable(CAPABILITY_TYPE_UT) ? duration : 0;
+ stats.smsCapableMillis =
+ lastCapableFeatures.isCapable(CAPABILITY_TYPE_SMS) ? duration : 0;
+ break;
+ case REGISTRATION_STATE_REGISTERING:
+ stats.registeringMillis = duration;
+ break;
+ case REGISTRATION_STATE_NOT_REGISTERED:
+ stats.unregisteredMillis = duration;
+ break;
+ }
+ mStorage.addImsRegistrationStats(stats);
}
mLastTimestamp = now;
@@ -271,10 +289,11 @@ public class ImsStats {
(newRat == TelephonyManager.NETWORK_TYPE_IWLAN)
? AccessNetworkConstants.TRANSPORT_TYPE_WLAN
: AccessNetworkConstants.TRANSPORT_TYPE_WWAN;
- if (mLastRegistrationStats != null && mLastRegistrationStats.rat != newRat) {
+ if (mLastRegistrationStats.rat != newRat) {
mLastRegistrationStats.rat = newRat;
ratChanged = true;
}
+ mLastRegistrationStats.isIwlanCrossSim = radioTech == REGISTRATION_TECH_CROSS_SIM;
boolean voiceAvailableNow = capabilities.isCapable(CAPABILITY_TYPE_VOICE);
boolean voiceAvailabilityChanged =
@@ -308,21 +327,24 @@ public class ImsStats {
conclude();
mLastTransportType = imsRadioTech;
- mLastRegistrationStats = getDefaultImsRegistrationStats();
+ updateImsRegistrationStats();
mLastRegistrationStats.rat = convertTransportTypeToNetworkType(imsRadioTech);
mLastRegistrationState = REGISTRATION_STATE_REGISTERING;
}
/** Updates the stats when IMS registration succeeds. */
- public synchronized void onImsRegistered(@TransportType int imsRadioTech) {
+ public synchronized void onImsRegistered(ImsRegistrationAttributes attributes) {
conclude();
- mLastTransportType = imsRadioTech;
- // NOTE: mLastRegistrationStats can be null (no registering phase).
- if (mLastRegistrationStats == null) {
- mLastRegistrationStats = getDefaultImsRegistrationStats();
+ mLastTransportType = attributes.getTransportType();
+ // NOTE: status can be unregistered (no registering phase)
+ if (mLastRegistrationState == REGISTRATION_STATE_NOT_REGISTERED) {
+ updateImsRegistrationStats();
}
- mLastRegistrationStats.rat = convertTransportTypeToNetworkType(imsRadioTech);
+ mLastRegistrationStats.rat =
+ convertTransportTypeToNetworkType(attributes.getTransportType());
+ mLastRegistrationStats.isIwlanCrossSim = attributes.getRegistrationTechnology()
+ == REGISTRATION_TECH_CROSS_SIM;
mLastRegistrationState = REGISTRATION_STATE_REGISTERED;
}
@@ -331,16 +353,16 @@ public class ImsStats {
conclude();
// Generate end reason atom.
- // NOTE: mLastRegistrationStats can be null (no registering phase).
ImsRegistrationTermination termination = new ImsRegistrationTermination();
- if (mLastRegistrationStats != null) {
+ if (mLastRegistrationState != REGISTRATION_STATE_NOT_REGISTERED) {
termination.carrierId = mLastRegistrationStats.carrierId;
termination.ratAtEnd = getRatAtEnd(mLastRegistrationStats.rat);
+ termination.isIwlanCrossSim = mLastRegistrationStats.isIwlanCrossSim;
} else {
+ // if the registration state is from unregistered to unregistered.
termination.carrierId = mPhone.getDefaultPhone().getCarrierId();
- // We cannot tell whether the registration was intended for WWAN or WLAN
- termination.ratAtEnd = TelephonyManager.NETWORK_TYPE_UNKNOWN;
}
+ termination.ratAtEnd = getRatAtEnd(mLastRegistrationStats.rat);
termination.isMultiSim = SimSlotState.isMultiSim();
termination.setupFailed = (mLastRegistrationState != REGISTRATION_STATE_REGISTERED);
termination.reasonCode = reasonInfo.getCode();
@@ -351,16 +373,20 @@ public class ImsStats {
// Reset state to unregistered.
mLastRegistrationState = REGISTRATION_STATE_NOT_REGISTERED;
- mLastRegistrationStats = null;
mLastAvailableFeatures = new MmTelCapabilities();
}
/** Updates the RAT when service state changes. */
public synchronized void onServiceStateChanged(ServiceState state) {
- if (mLastTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN
- && mLastRegistrationStats != null) {
- mLastRegistrationStats.rat =
- ServiceStateStats.getRat(state, NetworkRegistrationInfo.DOMAIN_PS);
+ conclude();
+
+ @NetworkType int newRat = state.getDataNetworkType();
+ MmTelCapabilities lastCapableFeatures = getLastCapableFeaturesForNetworkType(newRat);
+
+ if (lastCapableFeatures != null) {
+ mLastRegistrationStats.rat = newRat;
+ } else {
+ mLastRegistrationStats.rat = TelephonyManager.NETWORK_TYPE_UNKNOWN;
}
}
@@ -370,7 +396,7 @@ public class ImsStats {
*/
@NetworkType
public synchronized int getImsVoiceRadioTech() {
- if (mLastRegistrationStats == null
+ if (mLastRegistrationState == REGISTRATION_STATE_NOT_REGISTERED
|| !mLastAvailableFeatures.isCapable(CAPABILITY_TYPE_VOICE)) {
return TelephonyManager.NETWORK_TYPE_UNKNOWN;
}
@@ -404,17 +430,35 @@ public class ImsStats {
private ImsRegistrationStats getDefaultImsRegistrationStats() {
Phone phone = mPhone.getDefaultPhone();
ImsRegistrationStats stats = new ImsRegistrationStats();
- stats.carrierId = phone.getCarrierId();
- stats.simSlotIndex = phone.getPhoneId();
+ stats.rat = TelephonyManager.NETWORK_TYPE_UNKNOWN;
return stats;
}
+ private void updateImsRegistrationStats() {
+ Phone phone = mPhone.getDefaultPhone();
+ mLastRegistrationStats.carrierId = phone.getCarrierId();
+ mLastRegistrationStats.simSlotIndex = phone.getPhoneId();
+ }
+
@Nullable
private MmTelCapabilities getLastCapableFeaturesForTech(@ImsRegistrationTech int radioTech) {
switch (radioTech) {
case REGISTRATION_TECH_NONE:
return null;
case REGISTRATION_TECH_IWLAN:
+ case REGISTRATION_TECH_CROSS_SIM:
+ return mLastWlanCapableFeatures;
+ default:
+ return mLastWwanCapableFeatures;
+ }
+ }
+
+ @Nullable
+ private MmTelCapabilities getLastCapableFeaturesForNetworkType(@NetworkType int netType) {
+ switch (netType) {
+ case TelephonyManager.NETWORK_TYPE_UNKNOWN:
+ return null;
+ case TelephonyManager.NETWORK_TYPE_IWLAN:
return mLastWlanCapableFeatures;
default:
return mLastWwanCapableFeatures;
@@ -429,6 +473,7 @@ public class ImsStats {
case REGISTRATION_TECH_LTE:
return TelephonyManager.NETWORK_TYPE_LTE;
case REGISTRATION_TECH_IWLAN:
+ case REGISTRATION_TECH_CROSS_SIM:
return TelephonyManager.NETWORK_TYPE_IWLAN;
case REGISTRATION_TECH_NR:
return TelephonyManager.NETWORK_TYPE_NR;
@@ -438,21 +483,13 @@ public class ImsStats {
}
}
- private static ImsRegistrationStats copyOf(ImsRegistrationStats source) {
+ private static ImsRegistrationStats copyOfDimensionsOnly(ImsRegistrationStats source) {
ImsRegistrationStats dest = new ImsRegistrationStats();
dest.carrierId = source.carrierId;
dest.simSlotIndex = source.simSlotIndex;
dest.rat = source.rat;
- dest.registeredMillis = source.registeredMillis;
- dest.voiceCapableMillis = source.voiceCapableMillis;
- dest.voiceAvailableMillis = source.voiceAvailableMillis;
- dest.smsCapableMillis = source.smsCapableMillis;
- dest.smsAvailableMillis = source.smsAvailableMillis;
- dest.videoCapableMillis = source.videoCapableMillis;
- dest.videoAvailableMillis = source.videoAvailableMillis;
- dest.utCapableMillis = source.utCapableMillis;
- dest.utAvailableMillis = source.utAvailableMillis;
+ dest.isIwlanCrossSim = source.isIwlanCrossSim;
return dest;
}