diff options
Diffstat (limited to 'src/java/com/android/internal/telephony/metrics/ImsStats.java')
-rw-r--r-- | src/java/com/android/internal/telephony/metrics/ImsStats.java | 163 |
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; } |