Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +8 −0 Original line number Diff line number Diff line Loading @@ -3198,6 +3198,14 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { } } mPhone.getVoiceCallSessionStats() .onImsCallStartFailed( findConnection(imsCall), new ImsReasonInfo( maybeRemapReasonCode(reasonInfo), reasonInfo.mExtraCode, reasonInfo.mExtraMessage)); if (mPendingMO != null) { // To initiate dialing circuit-switched call if (reasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED Loading src/java/com/android/internal/telephony/metrics/RcsStats.java +0 −82 Original line number Diff line number Diff line Loading @@ -56,7 +56,6 @@ import android.telephony.ims.FeatureTagState; import android.telephony.ims.RcsContactPresenceTuple; import android.telephony.ims.RcsContactUceCapability; import android.telephony.ims.aidl.IRcsConfigCallback; import android.util.Base64; import android.util.IndentingPrintWriter; import com.android.ims.rcs.uce.UceStatsWriter; Loading @@ -83,7 +82,6 @@ import com.android.telephony.Rlog; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; Loading Loading @@ -1777,84 +1775,4 @@ public class RcsStats { } pw.decreaseIndent(); } /** * Reset all events */ public synchronized void reset() { if (mAtomsStorage == null || mAtomsStorage.mAtoms == null) { return; } PersistAtomsProto.PersistAtoms metricAtoms = mAtomsStorage.mAtoms; metricAtoms.imsRegistrationFeatureTagStats = PersistAtomsProto.ImsRegistrationFeatureTagStats.emptyArray(); metricAtoms.rcsClientProvisioningStats = PersistAtomsProto.RcsClientProvisioningStats.emptyArray(); metricAtoms.rcsAcsProvisioningStats = PersistAtomsProto.RcsAcsProvisioningStats.emptyArray(); metricAtoms.sipDelegateStats = PersistAtomsProto.SipDelegateStats.emptyArray(); metricAtoms.sipTransportFeatureTagStats = PersistAtomsProto.SipTransportFeatureTagStats.emptyArray(); metricAtoms.sipMessageResponse = PersistAtomsProto.SipMessageResponse.emptyArray(); metricAtoms.sipTransportSession = PersistAtomsProto.SipTransportSession.emptyArray(); metricAtoms.imsDedicatedBearerListenerEvent = PersistAtomsProto.ImsDedicatedBearerListenerEvent.emptyArray(); metricAtoms.imsDedicatedBearerEvent = PersistAtomsProto.ImsDedicatedBearerEvent.emptyArray(); metricAtoms.imsRegistrationServiceDescStats = PersistAtomsProto.ImsRegistrationServiceDescStats.emptyArray(); metricAtoms.uceEventStats = PersistAtomsProto.UceEventStats.emptyArray(); metricAtoms.presenceNotifyEvent = PersistAtomsProto.PresenceNotifyEvent.emptyArray(); metricAtoms.gbaEvent = PersistAtomsProto.GbaEvent.emptyArray(); } /** * Convert the PersistAtomsProto into Base-64 encoded string * * @return Encoded string */ public String buildLog() { PersistAtomsProto.PersistAtoms log = buildProto(); return Base64.encodeToString( PersistAtomsProto.PersistAtoms.toByteArray(log), Base64.DEFAULT); } /** * Build the PersistAtomsProto * * @return PersistAtomsProto.PersistAtoms */ public PersistAtomsProto.PersistAtoms buildProto() { PersistAtomsProto.PersistAtoms log = new PersistAtomsProto.PersistAtoms(); PersistAtomsProto.PersistAtoms atoms = mAtomsStorage.mAtoms; log.imsRegistrationFeatureTagStats = Arrays.copyOf(atoms.imsRegistrationFeatureTagStats, atoms.imsRegistrationFeatureTagStats.length); log.rcsClientProvisioningStats = Arrays.copyOf(atoms.rcsClientProvisioningStats, atoms.rcsClientProvisioningStats.length); log.rcsAcsProvisioningStats = Arrays.copyOf(atoms.rcsAcsProvisioningStats, atoms.rcsAcsProvisioningStats.length); log.sipDelegateStats = Arrays.copyOf(atoms.sipDelegateStats, atoms.sipDelegateStats.length); log.sipTransportFeatureTagStats = Arrays.copyOf(atoms.sipTransportFeatureTagStats, atoms.sipTransportFeatureTagStats.length); log.sipMessageResponse = Arrays.copyOf(atoms.sipMessageResponse, atoms.sipMessageResponse.length); log.sipTransportSession = Arrays.copyOf(atoms.sipTransportSession, atoms.sipTransportSession.length); log.imsDedicatedBearerListenerEvent = Arrays.copyOf(atoms.imsDedicatedBearerListenerEvent, atoms.imsDedicatedBearerListenerEvent.length); log.imsDedicatedBearerEvent = Arrays.copyOf(atoms.imsDedicatedBearerEvent, atoms.imsDedicatedBearerEvent.length); log.imsRegistrationServiceDescStats = Arrays.copyOf(atoms.imsRegistrationServiceDescStats, atoms.imsRegistrationServiceDescStats.length); log.uceEventStats = Arrays.copyOf(atoms.uceEventStats, atoms.uceEventStats.length); log.presenceNotifyEvent = Arrays.copyOf(atoms.presenceNotifyEvent, atoms.presenceNotifyEvent.length); log.gbaEvent = Arrays.copyOf(atoms.gbaEvent, atoms.gbaEvent.length); return log; } } src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java +0 −4 Original line number Diff line number Diff line Loading @@ -290,14 +290,12 @@ public class TelephonyMetrics { break; case "--metricsproto": pw.println(convertProtoToBase64String(buildProto())); pw.println(RcsStats.getInstance().buildLog()); if (reset) { reset(); } break; case "--metricsprototext": pw.println(buildProto().toString()); pw.println(RcsStats.getInstance().buildProto().toString()); break; } } Loading Loading @@ -749,8 +747,6 @@ public class TelephonyMetrics { .setRadioState(mLastRadioState.get(key)).build(); addTelephonyEvent(event); } RcsStats.getInstance().reset(); } /** Loading src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java +6 −0 Original line number Diff line number Diff line Loading @@ -240,6 +240,12 @@ public class VoiceCallSessionStats { } } /** Updates internal states when an IMS fails to start. */ public synchronized void onImsCallStartFailed( @Nullable ImsPhoneConnection conn, ImsReasonInfo reasonInfo) { onImsCallTerminated(conn, reasonInfo); } /** Updates internal states when an IMS call is terminated. */ public synchronized void onImsCallTerminated( @Nullable ImsPhoneConnection conn, ImsReasonInfo reasonInfo) { Loading tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java +88 −0 Original line number Diff line number Diff line Loading @@ -309,6 +309,47 @@ public class VoiceCallSessionStatsTest extends TelephonyTest { assertProtoEquals(expectedRatUsage, ratUsage.get()[0]); } @Test @SmallTest public void singleImsCall_moStartFailed() { setServiceState(mServiceState, TelephonyManager.NETWORK_TYPE_LTE); doReturn(false).when(mImsConnection0).isIncoming(); doReturn(2000L).when(mImsConnection0).getCreateTime(); doReturn(0L).when(mImsConnection0).getDurationMillis(); doReturn(mImsCall0).when(mImsConnection0).getCall(); doReturn(new ArrayList(List.of(mImsConnection0))).when(mImsCall0).getConnections(); VoiceCallSession expectedCall = makeSlot0CallProto( VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_IMS, VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MO, TelephonyManager.NETWORK_TYPE_LTE, ImsReasonInfo.CODE_SIP_REQUEST_CANCELLED); expectedCall.setupFailed = true; expectedCall.ratAtConnected = TelephonyManager.NETWORK_TYPE_UNKNOWN; expectedCall.callDuration = VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN; VoiceCallRatUsage expectedRatUsage = makeRatUsageProto( CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 2200L, 1L); final AtomicReference<VoiceCallRatUsage[]> ratUsage = setupRatUsageCapture(); mVoiceCallSessionStats0.setTimeMillis(2000L); doReturn(Call.State.DIALING).when(mImsCall0).getState(); doReturn(Call.State.DIALING).when(mImsConnection0).getState(); mVoiceCallSessionStats0.onImsDial(mImsConnection0); mVoiceCallSessionStats0.setTimeMillis(2200L); mVoiceCallSessionStats0.onImsCallStartFailed( mImsConnection0, new ImsReasonInfo(ImsReasonInfo.CODE_SIP_REQUEST_CANCELLED, 0)); ArgumentCaptor<VoiceCallSession> callCaptor = ArgumentCaptor.forClass(VoiceCallSession.class); verify(mPersistAtomsStorage, times(1)).addVoiceCallSession(callCaptor.capture()); verify(mPersistAtomsStorage, times(1)).addVoiceCallRatUsage(any()); verifyNoMoreInteractions(mPersistAtomsStorage); assertProtoEquals(expectedCall, callCaptor.getValue()); assertThat(ratUsage.get()).hasLength(1); assertProtoEquals(expectedRatUsage, ratUsage.get()[0]); } @Test @SmallTest public void singleImsCall_moAccepted() { Loading Loading @@ -417,6 +458,53 @@ public class VoiceCallSessionStatsTest extends TelephonyTest { assertProtoEquals(expectedRatUsage, ratUsage.get()[0]); } @Test @SmallTest public void singleImsCall_mtStartFailed() { setServiceState(mServiceState, TelephonyManager.NETWORK_TYPE_LTE); doReturn(true).when(mImsConnection0).isIncoming(); doReturn(2000L).when(mImsConnection0).getCreateTime(); doReturn(0L).when(mImsConnection0).getDurationMillis(); doReturn(mImsCall0).when(mImsConnection0).getCall(); doReturn(new ArrayList(List.of(mImsConnection0))).when(mImsCall0).getConnections(); VoiceCallSession expectedCall = makeSlot0CallProto( VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_IMS, VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MT, TelephonyManager.NETWORK_TYPE_LTE, ImsReasonInfo.CODE_SIP_REQUEST_CANCELLED); expectedCall.setupFailed = true; expectedCall.ratAtConnected = TelephonyManager.NETWORK_TYPE_UNKNOWN; expectedCall.codecBitmask = 1L << AudioCodec.AUDIO_CODEC_AMR; expectedCall.mainCodecQuality = VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND; expectedCall.callDuration = VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN; VoiceCallRatUsage expectedRatUsage = makeRatUsageProto( CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 8000L, 1L); final AtomicReference<VoiceCallRatUsage[]> ratUsage = setupRatUsageCapture(); mVoiceCallSessionStats0.setTimeMillis(2000L); doReturn(Call.State.INCOMING).when(mImsCall0).getState(); doReturn(Call.State.INCOMING).when(mImsConnection0).getState(); mVoiceCallSessionStats0.onImsCallReceived(mImsConnection0); mVoiceCallSessionStats0.setTimeMillis(2100L); mVoiceCallSessionStats0.onAudioCodecChanged( mImsConnection0, ImsStreamMediaProfile.AUDIO_QUALITY_AMR); mVoiceCallSessionStats0.setTimeMillis(8000L); mVoiceCallSessionStats0.onImsCallStartFailed( mImsConnection0, new ImsReasonInfo(ImsReasonInfo.CODE_SIP_REQUEST_CANCELLED, 0)); ArgumentCaptor<VoiceCallSession> callCaptor = ArgumentCaptor.forClass(VoiceCallSession.class); verify(mPersistAtomsStorage, times(1)).addVoiceCallSession(callCaptor.capture()); verify(mPersistAtomsStorage, times(1)).addVoiceCallRatUsage(any()); verifyNoMoreInteractions(mPersistAtomsStorage); assertProtoEquals(expectedCall, callCaptor.getValue()); assertThat(ratUsage.get()).hasLength(1); assertProtoEquals(expectedRatUsage, ratUsage.get()[0]); } @Test @SmallTest public void singleImsCall_mtAccepted() { Loading Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +8 −0 Original line number Diff line number Diff line Loading @@ -3198,6 +3198,14 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { } } mPhone.getVoiceCallSessionStats() .onImsCallStartFailed( findConnection(imsCall), new ImsReasonInfo( maybeRemapReasonCode(reasonInfo), reasonInfo.mExtraCode, reasonInfo.mExtraMessage)); if (mPendingMO != null) { // To initiate dialing circuit-switched call if (reasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED Loading
src/java/com/android/internal/telephony/metrics/RcsStats.java +0 −82 Original line number Diff line number Diff line Loading @@ -56,7 +56,6 @@ import android.telephony.ims.FeatureTagState; import android.telephony.ims.RcsContactPresenceTuple; import android.telephony.ims.RcsContactUceCapability; import android.telephony.ims.aidl.IRcsConfigCallback; import android.util.Base64; import android.util.IndentingPrintWriter; import com.android.ims.rcs.uce.UceStatsWriter; Loading @@ -83,7 +82,6 @@ import com.android.telephony.Rlog; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; Loading Loading @@ -1777,84 +1775,4 @@ public class RcsStats { } pw.decreaseIndent(); } /** * Reset all events */ public synchronized void reset() { if (mAtomsStorage == null || mAtomsStorage.mAtoms == null) { return; } PersistAtomsProto.PersistAtoms metricAtoms = mAtomsStorage.mAtoms; metricAtoms.imsRegistrationFeatureTagStats = PersistAtomsProto.ImsRegistrationFeatureTagStats.emptyArray(); metricAtoms.rcsClientProvisioningStats = PersistAtomsProto.RcsClientProvisioningStats.emptyArray(); metricAtoms.rcsAcsProvisioningStats = PersistAtomsProto.RcsAcsProvisioningStats.emptyArray(); metricAtoms.sipDelegateStats = PersistAtomsProto.SipDelegateStats.emptyArray(); metricAtoms.sipTransportFeatureTagStats = PersistAtomsProto.SipTransportFeatureTagStats.emptyArray(); metricAtoms.sipMessageResponse = PersistAtomsProto.SipMessageResponse.emptyArray(); metricAtoms.sipTransportSession = PersistAtomsProto.SipTransportSession.emptyArray(); metricAtoms.imsDedicatedBearerListenerEvent = PersistAtomsProto.ImsDedicatedBearerListenerEvent.emptyArray(); metricAtoms.imsDedicatedBearerEvent = PersistAtomsProto.ImsDedicatedBearerEvent.emptyArray(); metricAtoms.imsRegistrationServiceDescStats = PersistAtomsProto.ImsRegistrationServiceDescStats.emptyArray(); metricAtoms.uceEventStats = PersistAtomsProto.UceEventStats.emptyArray(); metricAtoms.presenceNotifyEvent = PersistAtomsProto.PresenceNotifyEvent.emptyArray(); metricAtoms.gbaEvent = PersistAtomsProto.GbaEvent.emptyArray(); } /** * Convert the PersistAtomsProto into Base-64 encoded string * * @return Encoded string */ public String buildLog() { PersistAtomsProto.PersistAtoms log = buildProto(); return Base64.encodeToString( PersistAtomsProto.PersistAtoms.toByteArray(log), Base64.DEFAULT); } /** * Build the PersistAtomsProto * * @return PersistAtomsProto.PersistAtoms */ public PersistAtomsProto.PersistAtoms buildProto() { PersistAtomsProto.PersistAtoms log = new PersistAtomsProto.PersistAtoms(); PersistAtomsProto.PersistAtoms atoms = mAtomsStorage.mAtoms; log.imsRegistrationFeatureTagStats = Arrays.copyOf(atoms.imsRegistrationFeatureTagStats, atoms.imsRegistrationFeatureTagStats.length); log.rcsClientProvisioningStats = Arrays.copyOf(atoms.rcsClientProvisioningStats, atoms.rcsClientProvisioningStats.length); log.rcsAcsProvisioningStats = Arrays.copyOf(atoms.rcsAcsProvisioningStats, atoms.rcsAcsProvisioningStats.length); log.sipDelegateStats = Arrays.copyOf(atoms.sipDelegateStats, atoms.sipDelegateStats.length); log.sipTransportFeatureTagStats = Arrays.copyOf(atoms.sipTransportFeatureTagStats, atoms.sipTransportFeatureTagStats.length); log.sipMessageResponse = Arrays.copyOf(atoms.sipMessageResponse, atoms.sipMessageResponse.length); log.sipTransportSession = Arrays.copyOf(atoms.sipTransportSession, atoms.sipTransportSession.length); log.imsDedicatedBearerListenerEvent = Arrays.copyOf(atoms.imsDedicatedBearerListenerEvent, atoms.imsDedicatedBearerListenerEvent.length); log.imsDedicatedBearerEvent = Arrays.copyOf(atoms.imsDedicatedBearerEvent, atoms.imsDedicatedBearerEvent.length); log.imsRegistrationServiceDescStats = Arrays.copyOf(atoms.imsRegistrationServiceDescStats, atoms.imsRegistrationServiceDescStats.length); log.uceEventStats = Arrays.copyOf(atoms.uceEventStats, atoms.uceEventStats.length); log.presenceNotifyEvent = Arrays.copyOf(atoms.presenceNotifyEvent, atoms.presenceNotifyEvent.length); log.gbaEvent = Arrays.copyOf(atoms.gbaEvent, atoms.gbaEvent.length); return log; } }
src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java +0 −4 Original line number Diff line number Diff line Loading @@ -290,14 +290,12 @@ public class TelephonyMetrics { break; case "--metricsproto": pw.println(convertProtoToBase64String(buildProto())); pw.println(RcsStats.getInstance().buildLog()); if (reset) { reset(); } break; case "--metricsprototext": pw.println(buildProto().toString()); pw.println(RcsStats.getInstance().buildProto().toString()); break; } } Loading Loading @@ -749,8 +747,6 @@ public class TelephonyMetrics { .setRadioState(mLastRadioState.get(key)).build(); addTelephonyEvent(event); } RcsStats.getInstance().reset(); } /** Loading
src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java +6 −0 Original line number Diff line number Diff line Loading @@ -240,6 +240,12 @@ public class VoiceCallSessionStats { } } /** Updates internal states when an IMS fails to start. */ public synchronized void onImsCallStartFailed( @Nullable ImsPhoneConnection conn, ImsReasonInfo reasonInfo) { onImsCallTerminated(conn, reasonInfo); } /** Updates internal states when an IMS call is terminated. */ public synchronized void onImsCallTerminated( @Nullable ImsPhoneConnection conn, ImsReasonInfo reasonInfo) { Loading
tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java +88 −0 Original line number Diff line number Diff line Loading @@ -309,6 +309,47 @@ public class VoiceCallSessionStatsTest extends TelephonyTest { assertProtoEquals(expectedRatUsage, ratUsage.get()[0]); } @Test @SmallTest public void singleImsCall_moStartFailed() { setServiceState(mServiceState, TelephonyManager.NETWORK_TYPE_LTE); doReturn(false).when(mImsConnection0).isIncoming(); doReturn(2000L).when(mImsConnection0).getCreateTime(); doReturn(0L).when(mImsConnection0).getDurationMillis(); doReturn(mImsCall0).when(mImsConnection0).getCall(); doReturn(new ArrayList(List.of(mImsConnection0))).when(mImsCall0).getConnections(); VoiceCallSession expectedCall = makeSlot0CallProto( VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_IMS, VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MO, TelephonyManager.NETWORK_TYPE_LTE, ImsReasonInfo.CODE_SIP_REQUEST_CANCELLED); expectedCall.setupFailed = true; expectedCall.ratAtConnected = TelephonyManager.NETWORK_TYPE_UNKNOWN; expectedCall.callDuration = VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN; VoiceCallRatUsage expectedRatUsage = makeRatUsageProto( CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 2200L, 1L); final AtomicReference<VoiceCallRatUsage[]> ratUsage = setupRatUsageCapture(); mVoiceCallSessionStats0.setTimeMillis(2000L); doReturn(Call.State.DIALING).when(mImsCall0).getState(); doReturn(Call.State.DIALING).when(mImsConnection0).getState(); mVoiceCallSessionStats0.onImsDial(mImsConnection0); mVoiceCallSessionStats0.setTimeMillis(2200L); mVoiceCallSessionStats0.onImsCallStartFailed( mImsConnection0, new ImsReasonInfo(ImsReasonInfo.CODE_SIP_REQUEST_CANCELLED, 0)); ArgumentCaptor<VoiceCallSession> callCaptor = ArgumentCaptor.forClass(VoiceCallSession.class); verify(mPersistAtomsStorage, times(1)).addVoiceCallSession(callCaptor.capture()); verify(mPersistAtomsStorage, times(1)).addVoiceCallRatUsage(any()); verifyNoMoreInteractions(mPersistAtomsStorage); assertProtoEquals(expectedCall, callCaptor.getValue()); assertThat(ratUsage.get()).hasLength(1); assertProtoEquals(expectedRatUsage, ratUsage.get()[0]); } @Test @SmallTest public void singleImsCall_moAccepted() { Loading Loading @@ -417,6 +458,53 @@ public class VoiceCallSessionStatsTest extends TelephonyTest { assertProtoEquals(expectedRatUsage, ratUsage.get()[0]); } @Test @SmallTest public void singleImsCall_mtStartFailed() { setServiceState(mServiceState, TelephonyManager.NETWORK_TYPE_LTE); doReturn(true).when(mImsConnection0).isIncoming(); doReturn(2000L).when(mImsConnection0).getCreateTime(); doReturn(0L).when(mImsConnection0).getDurationMillis(); doReturn(mImsCall0).when(mImsConnection0).getCall(); doReturn(new ArrayList(List.of(mImsConnection0))).when(mImsCall0).getConnections(); VoiceCallSession expectedCall = makeSlot0CallProto( VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_IMS, VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MT, TelephonyManager.NETWORK_TYPE_LTE, ImsReasonInfo.CODE_SIP_REQUEST_CANCELLED); expectedCall.setupFailed = true; expectedCall.ratAtConnected = TelephonyManager.NETWORK_TYPE_UNKNOWN; expectedCall.codecBitmask = 1L << AudioCodec.AUDIO_CODEC_AMR; expectedCall.mainCodecQuality = VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND; expectedCall.callDuration = VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN; VoiceCallRatUsage expectedRatUsage = makeRatUsageProto( CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 8000L, 1L); final AtomicReference<VoiceCallRatUsage[]> ratUsage = setupRatUsageCapture(); mVoiceCallSessionStats0.setTimeMillis(2000L); doReturn(Call.State.INCOMING).when(mImsCall0).getState(); doReturn(Call.State.INCOMING).when(mImsConnection0).getState(); mVoiceCallSessionStats0.onImsCallReceived(mImsConnection0); mVoiceCallSessionStats0.setTimeMillis(2100L); mVoiceCallSessionStats0.onAudioCodecChanged( mImsConnection0, ImsStreamMediaProfile.AUDIO_QUALITY_AMR); mVoiceCallSessionStats0.setTimeMillis(8000L); mVoiceCallSessionStats0.onImsCallStartFailed( mImsConnection0, new ImsReasonInfo(ImsReasonInfo.CODE_SIP_REQUEST_CANCELLED, 0)); ArgumentCaptor<VoiceCallSession> callCaptor = ArgumentCaptor.forClass(VoiceCallSession.class); verify(mPersistAtomsStorage, times(1)).addVoiceCallSession(callCaptor.capture()); verify(mPersistAtomsStorage, times(1)).addVoiceCallRatUsage(any()); verifyNoMoreInteractions(mPersistAtomsStorage); assertProtoEquals(expectedCall, callCaptor.getValue()); assertThat(ratUsage.get()).hasLength(1); assertProtoEquals(expectedRatUsage, ratUsage.get()[0]); } @Test @SmallTest public void singleImsCall_mtAccepted() { Loading