Loading proto/src/persist_atoms.proto +2 −0 Original line number Diff line number Diff line Loading @@ -427,6 +427,8 @@ message ImsRegistrationStats { optional int64 video_available_millis = 10; optional int64 ut_capable_millis = 11; optional int64 ut_available_millis = 12; optional int64 registering_millis = 13; optional int64 unregistered_millis = 14; // Internal use only optional int64 last_used_millis = 10001; Loading src/java/com/android/internal/telephony/metrics/ImsStats.java +63 −59 Original line number Diff line number Diff line Loading @@ -197,7 +197,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(); Loading @@ -210,6 +210,10 @@ public class ImsStats { public ImsStats(ImsPhone phone) { mPhone = phone; mStorage = PhoneFactory.getMetricsCollector().getAtomsStorage(); mLastRegistrationStats = getDefaultImsRegistrationStats(); updateImsRegistrationStats(); mLastTimestamp = getTimeMillis(); } /** Loading @@ -221,14 +225,14 @@ 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; if (duration < MIN_REGISTRATION_DURATION_MILLIS) { logw("conclude: discarding transient stats, duration=%d", duration); } else { ImsRegistrationStats stats = copyOfDimensionsOnly(mLastRegistrationStats); switch (mLastRegistrationState) { case REGISTRATION_STATE_REGISTERED: stats.registeredMillis = duration; stats.voiceAvailableMillis = Loading @@ -252,9 +256,15 @@ public class ImsStats { lastCapableFeatures.isCapable(CAPABILITY_TYPE_UT) ? duration : 0; stats.smsCapableMillis = lastCapableFeatures.isCapable(CAPABILITY_TYPE_SMS) ? duration : 0; mStorage.addImsRegistrationStats(stats); break; case REGISTRATION_STATE_REGISTERING: stats.registeringMillis = duration; break; case REGISTRATION_STATE_NOT_REGISTERED: stats.unregisteredMillis = duration; break; } mStorage.addImsRegistrationStats(stats); } mLastTimestamp = now; Loading @@ -271,7 +281,7 @@ 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; } Loading Loading @@ -308,7 +318,7 @@ public class ImsStats { conclude(); mLastTransportType = imsRadioTech; mLastRegistrationStats = getDefaultImsRegistrationStats(); updateImsRegistrationStats(); mLastRegistrationStats.rat = convertTransportTypeToNetworkType(imsRadioTech); mLastRegistrationState = REGISTRATION_STATE_REGISTERING; } Loading @@ -318,9 +328,9 @@ public class ImsStats { conclude(); mLastTransportType = imsRadioTech; // NOTE: mLastRegistrationStats can be null (no registering phase). if (mLastRegistrationStats == null) { mLastRegistrationStats = getDefaultImsRegistrationStats(); // NOTE: status can be unregistered (no registering phase) if (mLastRegistrationState == REGISTRATION_STATE_NOT_REGISTERED) { updateImsRegistrationStats(); } mLastRegistrationStats.rat = convertTransportTypeToNetworkType(imsRadioTech); mLastRegistrationState = REGISTRATION_STATE_REGISTERED; Loading @@ -331,16 +341,14 @@ 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); } 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(); Loading @@ -351,14 +359,14 @@ public class ImsStats { // Reset state to unregistered. mLastRegistrationState = REGISTRATION_STATE_NOT_REGISTERED; mLastRegistrationStats = null; mLastRegistrationStats.rat = TelephonyManager.NETWORK_TYPE_UNKNOWN; mLastAvailableFeatures = new MmTelCapabilities(); } /** Updates the RAT when service state changes. */ public synchronized void onServiceStateChanged(ServiceState state) { if (mLastTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN && mLastRegistrationStats != null) { && mLastRegistrationState != REGISTRATION_STATE_NOT_REGISTERED) { mLastRegistrationStats.rat = ServiceStateStats.getRat(state, NetworkRegistrationInfo.DOMAIN_PS); } Loading @@ -370,7 +378,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; } Loading Loading @@ -404,11 +412,16 @@ 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) { Loading Loading @@ -438,21 +451,12 @@ 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; return dest; } Loading src/java/com/android/internal/telephony/metrics/MetricsCollector.java +3 −1 Original line number Diff line number Diff line Loading @@ -1077,7 +1077,9 @@ 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)); } private static StatsEvent buildStatsEvent(ImsRegistrationTermination termination) { Loading src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java +6 −0 Original line number Diff line number Diff line Loading @@ -407,6 +407,8 @@ public class PersistAtomsStorage { existingStats.videoAvailableMillis += stats.videoAvailableMillis; existingStats.utCapableMillis += stats.utCapableMillis; existingStats.utAvailableMillis += stats.utAvailableMillis; existingStats.registeringMillis += stats.registeringMillis; existingStats.unregisteredMillis += stats.unregisteredMillis; existingStats.lastUsedMillis = getWallTimeMillis(); } else { stats.lastUsedMillis = getWallTimeMillis(); Loading Loading @@ -2279,6 +2281,10 @@ public class PersistAtomsStorage { normalizeDurationTo24H(stats[i].utCapableMillis, intervalMillis); stats[i].utAvailableMillis = normalizeDurationTo24H(stats[i].utAvailableMillis, intervalMillis); stats[i].registeringMillis = normalizeDurationTo24H(stats[i].registeringMillis, intervalMillis); stats[i].unregisteredMillis = normalizeDurationTo24H(stats[i].unregisteredMillis, intervalMillis); } return stats; } Loading tests/telephonytests/src/com/android/internal/telephony/metrics/ImsStatsTest.java +130 −8 Original line number Diff line number Diff line Loading @@ -308,12 +308,73 @@ public class ImsStatsTest extends TelephonyTest { mImsStats.onImsCapabilitiesChanged( REGISTRATION_TECH_LTE, new MmTelCapabilities(CAPABILITY_TYPE_ALL)); mImsStats.onImsUnregistered( new ImsReasonInfo(ImsReasonInfo.CODE_REGISTRATION_ERROR, 999, "Timeout")); mImsStats.incTimeMillis(2000L); mImsStats.conclude(); // No atom should be generated ArgumentCaptor<ImsRegistrationTermination> terminationCaptor = ArgumentCaptor.forClass(ImsRegistrationTermination.class); verify(mPersistAtomsStorage).addImsRegistrationTermination(terminationCaptor.capture()); ImsRegistrationTermination termination = terminationCaptor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); assertTrue(termination.setupFailed); assertEquals(ImsReasonInfo.CODE_REGISTRATION_ERROR, termination.reasonCode); assertEquals(999, termination.extraCode); assertEquals("Timeout", termination.extraMessage); // Registering duration should be counted ArgumentCaptor<ImsRegistrationStats> statsCaptor = ArgumentCaptor.forClass(ImsRegistrationStats.class); verify(mPersistAtomsStorage).addImsRegistrationStats(statsCaptor.capture()); ImsRegistrationStats stats = statsCaptor.getValue(); assertEquals(CARRIER1_ID, stats.carrierId); assertEquals(0, stats.simSlotIndex); assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, stats.rat); assertEquals(2000L, stats.unregisteredMillis); verifyNoMoreInteractions(mPersistAtomsStorage); } @Test @SmallTest public void conclude_registering() throws Exception { // IMS over LTE mImsStats.onSetFeatureResponse( CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, ProvisioningManager.PROVISIONING_VALUE_ENABLED); mImsStats.onSetFeatureResponse( CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE, ProvisioningManager.PROVISIONING_VALUE_ENABLED); mImsStats.onSetFeatureResponse( CAPABILITY_TYPE_UT, REGISTRATION_TECH_LTE, ProvisioningManager.PROVISIONING_VALUE_ENABLED); mImsStats.onSetFeatureResponse( CAPABILITY_TYPE_SMS, REGISTRATION_TECH_LTE, ProvisioningManager.PROVISIONING_VALUE_ENABLED); mImsStats.onImsCapabilitiesChanged( REGISTRATION_TECH_LTE, new MmTelCapabilities(CAPABILITY_TYPE_ALL)); mImsStats.onImsRegistering(TRANSPORT_TYPE_WLAN); mImsStats.incTimeMillis(2000L); mImsStats.conclude(); // Registering duration should be counted ArgumentCaptor<ImsRegistrationStats> captor = ArgumentCaptor.forClass(ImsRegistrationStats.class); verify(mPersistAtomsStorage).addImsRegistrationStats(captor.capture()); ImsRegistrationStats stats = captor.getValue(); assertEquals(CARRIER1_ID, stats.carrierId); assertEquals(0, stats.simSlotIndex); assertEquals(TelephonyManager.NETWORK_TYPE_IWLAN, stats.rat); assertEquals(2000L, stats.registeringMillis); verifyNoMoreInteractions(mPersistAtomsStorage); } Loading Loading @@ -508,6 +569,57 @@ public class ImsStatsTest extends TelephonyTest { verifyNoMoreInteractions(mPersistAtomsStorage); } @Test @SmallTest public void onImsRegistered_afterImsRegistering() throws Exception { mImsStats.onImsRegistering(TRANSPORT_TYPE_WWAN); mImsStats.incTimeMillis(2000L); mImsStats.onImsRegistered(TRANSPORT_TYPE_WWAN); // Registering duration should be counted ArgumentCaptor<ImsRegistrationStats> captor = ArgumentCaptor.forClass(ImsRegistrationStats.class); verify(mPersistAtomsStorage).addImsRegistrationStats(captor.capture()); ImsRegistrationStats stats = captor.getValue(); assertEquals(CARRIER1_ID, stats.carrierId); assertEquals(0, stats.simSlotIndex); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, stats.rat); assertEquals(0L, stats.registeredMillis); assertEquals(2000L, stats.registeringMillis); } @Test @SmallTest public void onImsRegistering_afterImsUnregistered() throws Exception { mImsStats.onImsUnregistered( new ImsReasonInfo(ImsReasonInfo.CODE_REGISTRATION_ERROR, 999, "Timeout")); mImsStats.incTimeMillis(2000L); mImsStats.onImsRegistering(TRANSPORT_TYPE_WWAN); // Atom with termination info should be generated ArgumentCaptor<ImsRegistrationTermination> terminationCaptor = ArgumentCaptor.forClass(ImsRegistrationTermination.class); verify(mPersistAtomsStorage).addImsRegistrationTermination(terminationCaptor.capture()); ImsRegistrationTermination termination = terminationCaptor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); assertTrue(termination.setupFailed); assertEquals(ImsReasonInfo.CODE_REGISTRATION_ERROR, termination.reasonCode); assertEquals(999, termination.extraCode); assertEquals("Timeout", termination.extraMessage); ArgumentCaptor<ImsRegistrationStats> statsCaptor = ArgumentCaptor.forClass(ImsRegistrationStats.class); verify(mPersistAtomsStorage).addImsRegistrationStats(statsCaptor.capture()); ImsRegistrationStats stats = statsCaptor.getValue(); assertEquals(CARRIER1_ID, stats.carrierId); assertEquals(0, stats.simSlotIndex); assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, stats.rat); assertEquals(2000L, stats.unregisteredMillis); verifyNoMoreInteractions(mPersistAtomsStorage); } @Test @SmallTest public void onImsUnregistered_setupFailure() throws Exception { Loading @@ -521,7 +633,7 @@ public class ImsStatsTest extends TelephonyTest { ImsRegistrationTermination termination = captor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, termination.ratAtEnd); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); assertTrue(termination.setupFailed); assertEquals(ImsReasonInfo.CODE_REGISTRATION_ERROR, termination.reasonCode); assertEquals(999, termination.extraCode); Loading @@ -532,16 +644,26 @@ public class ImsStatsTest extends TelephonyTest { @Test @SmallTest public void onImsUnregistered_setupFailureWithProgress() throws Exception { mImsStats.onImsRegistering(REGISTRATION_TECH_LTE); mImsStats.onImsRegistering(TRANSPORT_TYPE_WWAN); mImsStats.incTimeMillis(2000L); mImsStats.onImsUnregistered( new ImsReasonInfo(ImsReasonInfo.CODE_REGISTRATION_ERROR, 999, "Timeout")); // Atom with termination info should be generated ArgumentCaptor<ImsRegistrationTermination> captor = ArgumentCaptor<ImsRegistrationStats> statsCaptor = ArgumentCaptor.forClass(ImsRegistrationStats.class); verify(mPersistAtomsStorage).addImsRegistrationStats(statsCaptor.capture()); ImsRegistrationStats stats = statsCaptor.getValue(); assertEquals(CARRIER1_ID, stats.carrierId); assertEquals(0, stats.simSlotIndex); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, stats.rat); assertEquals(0L, stats.registeredMillis); assertEquals(2000L, stats.registeringMillis); ArgumentCaptor<ImsRegistrationTermination> terminationCaptor = ArgumentCaptor.forClass(ImsRegistrationTermination.class); verify(mPersistAtomsStorage).addImsRegistrationTermination(captor.capture()); ImsRegistrationTermination termination = captor.getValue(); verify(mPersistAtomsStorage).addImsRegistrationTermination(terminationCaptor.capture()); ImsRegistrationTermination termination = terminationCaptor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); Loading Loading @@ -604,7 +726,7 @@ public class ImsStatsTest extends TelephonyTest { ImsRegistrationTermination termination = captor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, termination.ratAtEnd); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); assertTrue(termination.setupFailed); assertEquals(ImsReasonInfo.CODE_REGISTRATION_ERROR, termination.reasonCode); assertEquals(0, termination.extraCode); Loading @@ -630,7 +752,7 @@ public class ImsStatsTest extends TelephonyTest { ImsRegistrationTermination termination = captor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, termination.ratAtEnd); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); assertTrue(termination.setupFailed); assertEquals(ImsReasonInfo.CODE_REGISTRATION_ERROR, termination.reasonCode); assertEquals(0, termination.extraCode); Loading Loading
proto/src/persist_atoms.proto +2 −0 Original line number Diff line number Diff line Loading @@ -427,6 +427,8 @@ message ImsRegistrationStats { optional int64 video_available_millis = 10; optional int64 ut_capable_millis = 11; optional int64 ut_available_millis = 12; optional int64 registering_millis = 13; optional int64 unregistered_millis = 14; // Internal use only optional int64 last_used_millis = 10001; Loading
src/java/com/android/internal/telephony/metrics/ImsStats.java +63 −59 Original line number Diff line number Diff line Loading @@ -197,7 +197,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(); Loading @@ -210,6 +210,10 @@ public class ImsStats { public ImsStats(ImsPhone phone) { mPhone = phone; mStorage = PhoneFactory.getMetricsCollector().getAtomsStorage(); mLastRegistrationStats = getDefaultImsRegistrationStats(); updateImsRegistrationStats(); mLastTimestamp = getTimeMillis(); } /** Loading @@ -221,14 +225,14 @@ 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; if (duration < MIN_REGISTRATION_DURATION_MILLIS) { logw("conclude: discarding transient stats, duration=%d", duration); } else { ImsRegistrationStats stats = copyOfDimensionsOnly(mLastRegistrationStats); switch (mLastRegistrationState) { case REGISTRATION_STATE_REGISTERED: stats.registeredMillis = duration; stats.voiceAvailableMillis = Loading @@ -252,9 +256,15 @@ public class ImsStats { lastCapableFeatures.isCapable(CAPABILITY_TYPE_UT) ? duration : 0; stats.smsCapableMillis = lastCapableFeatures.isCapable(CAPABILITY_TYPE_SMS) ? duration : 0; mStorage.addImsRegistrationStats(stats); break; case REGISTRATION_STATE_REGISTERING: stats.registeringMillis = duration; break; case REGISTRATION_STATE_NOT_REGISTERED: stats.unregisteredMillis = duration; break; } mStorage.addImsRegistrationStats(stats); } mLastTimestamp = now; Loading @@ -271,7 +281,7 @@ 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; } Loading Loading @@ -308,7 +318,7 @@ public class ImsStats { conclude(); mLastTransportType = imsRadioTech; mLastRegistrationStats = getDefaultImsRegistrationStats(); updateImsRegistrationStats(); mLastRegistrationStats.rat = convertTransportTypeToNetworkType(imsRadioTech); mLastRegistrationState = REGISTRATION_STATE_REGISTERING; } Loading @@ -318,9 +328,9 @@ public class ImsStats { conclude(); mLastTransportType = imsRadioTech; // NOTE: mLastRegistrationStats can be null (no registering phase). if (mLastRegistrationStats == null) { mLastRegistrationStats = getDefaultImsRegistrationStats(); // NOTE: status can be unregistered (no registering phase) if (mLastRegistrationState == REGISTRATION_STATE_NOT_REGISTERED) { updateImsRegistrationStats(); } mLastRegistrationStats.rat = convertTransportTypeToNetworkType(imsRadioTech); mLastRegistrationState = REGISTRATION_STATE_REGISTERED; Loading @@ -331,16 +341,14 @@ 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); } 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(); Loading @@ -351,14 +359,14 @@ public class ImsStats { // Reset state to unregistered. mLastRegistrationState = REGISTRATION_STATE_NOT_REGISTERED; mLastRegistrationStats = null; mLastRegistrationStats.rat = TelephonyManager.NETWORK_TYPE_UNKNOWN; mLastAvailableFeatures = new MmTelCapabilities(); } /** Updates the RAT when service state changes. */ public synchronized void onServiceStateChanged(ServiceState state) { if (mLastTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN && mLastRegistrationStats != null) { && mLastRegistrationState != REGISTRATION_STATE_NOT_REGISTERED) { mLastRegistrationStats.rat = ServiceStateStats.getRat(state, NetworkRegistrationInfo.DOMAIN_PS); } Loading @@ -370,7 +378,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; } Loading Loading @@ -404,11 +412,16 @@ 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) { Loading Loading @@ -438,21 +451,12 @@ 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; return dest; } Loading
src/java/com/android/internal/telephony/metrics/MetricsCollector.java +3 −1 Original line number Diff line number Diff line Loading @@ -1077,7 +1077,9 @@ 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)); } private static StatsEvent buildStatsEvent(ImsRegistrationTermination termination) { Loading
src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java +6 −0 Original line number Diff line number Diff line Loading @@ -407,6 +407,8 @@ public class PersistAtomsStorage { existingStats.videoAvailableMillis += stats.videoAvailableMillis; existingStats.utCapableMillis += stats.utCapableMillis; existingStats.utAvailableMillis += stats.utAvailableMillis; existingStats.registeringMillis += stats.registeringMillis; existingStats.unregisteredMillis += stats.unregisteredMillis; existingStats.lastUsedMillis = getWallTimeMillis(); } else { stats.lastUsedMillis = getWallTimeMillis(); Loading Loading @@ -2279,6 +2281,10 @@ public class PersistAtomsStorage { normalizeDurationTo24H(stats[i].utCapableMillis, intervalMillis); stats[i].utAvailableMillis = normalizeDurationTo24H(stats[i].utAvailableMillis, intervalMillis); stats[i].registeringMillis = normalizeDurationTo24H(stats[i].registeringMillis, intervalMillis); stats[i].unregisteredMillis = normalizeDurationTo24H(stats[i].unregisteredMillis, intervalMillis); } return stats; } Loading
tests/telephonytests/src/com/android/internal/telephony/metrics/ImsStatsTest.java +130 −8 Original line number Diff line number Diff line Loading @@ -308,12 +308,73 @@ public class ImsStatsTest extends TelephonyTest { mImsStats.onImsCapabilitiesChanged( REGISTRATION_TECH_LTE, new MmTelCapabilities(CAPABILITY_TYPE_ALL)); mImsStats.onImsUnregistered( new ImsReasonInfo(ImsReasonInfo.CODE_REGISTRATION_ERROR, 999, "Timeout")); mImsStats.incTimeMillis(2000L); mImsStats.conclude(); // No atom should be generated ArgumentCaptor<ImsRegistrationTermination> terminationCaptor = ArgumentCaptor.forClass(ImsRegistrationTermination.class); verify(mPersistAtomsStorage).addImsRegistrationTermination(terminationCaptor.capture()); ImsRegistrationTermination termination = terminationCaptor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); assertTrue(termination.setupFailed); assertEquals(ImsReasonInfo.CODE_REGISTRATION_ERROR, termination.reasonCode); assertEquals(999, termination.extraCode); assertEquals("Timeout", termination.extraMessage); // Registering duration should be counted ArgumentCaptor<ImsRegistrationStats> statsCaptor = ArgumentCaptor.forClass(ImsRegistrationStats.class); verify(mPersistAtomsStorage).addImsRegistrationStats(statsCaptor.capture()); ImsRegistrationStats stats = statsCaptor.getValue(); assertEquals(CARRIER1_ID, stats.carrierId); assertEquals(0, stats.simSlotIndex); assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, stats.rat); assertEquals(2000L, stats.unregisteredMillis); verifyNoMoreInteractions(mPersistAtomsStorage); } @Test @SmallTest public void conclude_registering() throws Exception { // IMS over LTE mImsStats.onSetFeatureResponse( CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, ProvisioningManager.PROVISIONING_VALUE_ENABLED); mImsStats.onSetFeatureResponse( CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE, ProvisioningManager.PROVISIONING_VALUE_ENABLED); mImsStats.onSetFeatureResponse( CAPABILITY_TYPE_UT, REGISTRATION_TECH_LTE, ProvisioningManager.PROVISIONING_VALUE_ENABLED); mImsStats.onSetFeatureResponse( CAPABILITY_TYPE_SMS, REGISTRATION_TECH_LTE, ProvisioningManager.PROVISIONING_VALUE_ENABLED); mImsStats.onImsCapabilitiesChanged( REGISTRATION_TECH_LTE, new MmTelCapabilities(CAPABILITY_TYPE_ALL)); mImsStats.onImsRegistering(TRANSPORT_TYPE_WLAN); mImsStats.incTimeMillis(2000L); mImsStats.conclude(); // Registering duration should be counted ArgumentCaptor<ImsRegistrationStats> captor = ArgumentCaptor.forClass(ImsRegistrationStats.class); verify(mPersistAtomsStorage).addImsRegistrationStats(captor.capture()); ImsRegistrationStats stats = captor.getValue(); assertEquals(CARRIER1_ID, stats.carrierId); assertEquals(0, stats.simSlotIndex); assertEquals(TelephonyManager.NETWORK_TYPE_IWLAN, stats.rat); assertEquals(2000L, stats.registeringMillis); verifyNoMoreInteractions(mPersistAtomsStorage); } Loading Loading @@ -508,6 +569,57 @@ public class ImsStatsTest extends TelephonyTest { verifyNoMoreInteractions(mPersistAtomsStorage); } @Test @SmallTest public void onImsRegistered_afterImsRegistering() throws Exception { mImsStats.onImsRegistering(TRANSPORT_TYPE_WWAN); mImsStats.incTimeMillis(2000L); mImsStats.onImsRegistered(TRANSPORT_TYPE_WWAN); // Registering duration should be counted ArgumentCaptor<ImsRegistrationStats> captor = ArgumentCaptor.forClass(ImsRegistrationStats.class); verify(mPersistAtomsStorage).addImsRegistrationStats(captor.capture()); ImsRegistrationStats stats = captor.getValue(); assertEquals(CARRIER1_ID, stats.carrierId); assertEquals(0, stats.simSlotIndex); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, stats.rat); assertEquals(0L, stats.registeredMillis); assertEquals(2000L, stats.registeringMillis); } @Test @SmallTest public void onImsRegistering_afterImsUnregistered() throws Exception { mImsStats.onImsUnregistered( new ImsReasonInfo(ImsReasonInfo.CODE_REGISTRATION_ERROR, 999, "Timeout")); mImsStats.incTimeMillis(2000L); mImsStats.onImsRegistering(TRANSPORT_TYPE_WWAN); // Atom with termination info should be generated ArgumentCaptor<ImsRegistrationTermination> terminationCaptor = ArgumentCaptor.forClass(ImsRegistrationTermination.class); verify(mPersistAtomsStorage).addImsRegistrationTermination(terminationCaptor.capture()); ImsRegistrationTermination termination = terminationCaptor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); assertTrue(termination.setupFailed); assertEquals(ImsReasonInfo.CODE_REGISTRATION_ERROR, termination.reasonCode); assertEquals(999, termination.extraCode); assertEquals("Timeout", termination.extraMessage); ArgumentCaptor<ImsRegistrationStats> statsCaptor = ArgumentCaptor.forClass(ImsRegistrationStats.class); verify(mPersistAtomsStorage).addImsRegistrationStats(statsCaptor.capture()); ImsRegistrationStats stats = statsCaptor.getValue(); assertEquals(CARRIER1_ID, stats.carrierId); assertEquals(0, stats.simSlotIndex); assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, stats.rat); assertEquals(2000L, stats.unregisteredMillis); verifyNoMoreInteractions(mPersistAtomsStorage); } @Test @SmallTest public void onImsUnregistered_setupFailure() throws Exception { Loading @@ -521,7 +633,7 @@ public class ImsStatsTest extends TelephonyTest { ImsRegistrationTermination termination = captor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, termination.ratAtEnd); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); assertTrue(termination.setupFailed); assertEquals(ImsReasonInfo.CODE_REGISTRATION_ERROR, termination.reasonCode); assertEquals(999, termination.extraCode); Loading @@ -532,16 +644,26 @@ public class ImsStatsTest extends TelephonyTest { @Test @SmallTest public void onImsUnregistered_setupFailureWithProgress() throws Exception { mImsStats.onImsRegistering(REGISTRATION_TECH_LTE); mImsStats.onImsRegistering(TRANSPORT_TYPE_WWAN); mImsStats.incTimeMillis(2000L); mImsStats.onImsUnregistered( new ImsReasonInfo(ImsReasonInfo.CODE_REGISTRATION_ERROR, 999, "Timeout")); // Atom with termination info should be generated ArgumentCaptor<ImsRegistrationTermination> captor = ArgumentCaptor<ImsRegistrationStats> statsCaptor = ArgumentCaptor.forClass(ImsRegistrationStats.class); verify(mPersistAtomsStorage).addImsRegistrationStats(statsCaptor.capture()); ImsRegistrationStats stats = statsCaptor.getValue(); assertEquals(CARRIER1_ID, stats.carrierId); assertEquals(0, stats.simSlotIndex); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, stats.rat); assertEquals(0L, stats.registeredMillis); assertEquals(2000L, stats.registeringMillis); ArgumentCaptor<ImsRegistrationTermination> terminationCaptor = ArgumentCaptor.forClass(ImsRegistrationTermination.class); verify(mPersistAtomsStorage).addImsRegistrationTermination(captor.capture()); ImsRegistrationTermination termination = captor.getValue(); verify(mPersistAtomsStorage).addImsRegistrationTermination(terminationCaptor.capture()); ImsRegistrationTermination termination = terminationCaptor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); Loading Loading @@ -604,7 +726,7 @@ public class ImsStatsTest extends TelephonyTest { ImsRegistrationTermination termination = captor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, termination.ratAtEnd); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); assertTrue(termination.setupFailed); assertEquals(ImsReasonInfo.CODE_REGISTRATION_ERROR, termination.reasonCode); assertEquals(0, termination.extraCode); Loading @@ -630,7 +752,7 @@ public class ImsStatsTest extends TelephonyTest { ImsRegistrationTermination termination = captor.getValue(); assertEquals(CARRIER1_ID, termination.carrierId); assertFalse(termination.isMultiSim); assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, termination.ratAtEnd); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, termination.ratAtEnd); assertTrue(termination.setupFailed); assertEquals(ImsReasonInfo.CODE_REGISTRATION_ERROR, termination.reasonCode); assertEquals(0, termination.extraCode); Loading