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/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/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