Search in sources :

Example 46 with VoiceCallSession

use of com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession in project android_frameworks_opt_telephony by LineageOS.

the class VoiceCallSessionStatsTest method concurrentImsCalls_firstCallHangupDuringSecondCallSetup.

@Test
@SmallTest
public void concurrentImsCalls_firstCallHangupDuringSecondCallSetup() {
    doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getVoiceNetworkType();
    // call 0 starts first, MO
    doReturn(false).when(mImsConnection0).isIncoming();
    doReturn(2000L).when(mImsConnection0).getCreateTime();
    doReturn(mImsCall0).when(mImsConnection0).getCall();
    doReturn(new ArrayList(List.of(mImsConnection0))).when(mImsCall0).getConnections();
    VoiceCallSession expectedCall0 = makeSlot0CallProto(VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_IMS, VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MO, TelephonyManager.NETWORK_TYPE_LTE, ImsReasonInfo.CODE_USER_TERMINATED);
    expectedCall0.setupDuration = VOICE_CALL_SESSION__SETUP_DURATION__CALL_SETUP_DURATION_ULTRA_FAST;
    expectedCall0.setupFailed = false;
    expectedCall0.codecBitmask = 1L << AudioCodec.AUDIO_CODEC_AMR;
    expectedCall0.concurrentCallCountAtStart = 0;
    expectedCall0.concurrentCallCountAtEnd = 1;
    expectedCall0.ratSwitchCount = 0L;
    expectedCall0.ratAtEnd = TelephonyManager.NETWORK_TYPE_LTE;
    // call 1 starts later, MT
    doReturn(true).when(mImsConnection1).isIncoming();
    doReturn(60000L).when(mImsConnection1).getCreateTime();
    doReturn(mImsCall1).when(mImsConnection1).getCall();
    doReturn(new ArrayList(List.of(mImsConnection1))).when(mImsCall1).getConnections();
    VoiceCallSession expectedCall1 = makeSlot0CallProto(VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_IMS, VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MT, TelephonyManager.NETWORK_TYPE_LTE, ImsReasonInfo.CODE_USER_TERMINATED_BY_REMOTE);
    expectedCall1.setupDuration = VOICE_CALL_SESSION__SETUP_DURATION__CALL_SETUP_DURATION_EXTREMELY_FAST;
    expectedCall1.setupFailed = false;
    expectedCall1.codecBitmask = 1L << AudioCodec.AUDIO_CODEC_AMR;
    expectedCall1.concurrentCallCountAtStart = 1;
    expectedCall1.concurrentCallCountAtEnd = 0;
    expectedCall1.ratSwitchCount = 1L;
    expectedCall1.ratAtEnd = TelephonyManager.NETWORK_TYPE_HSPA;
    RawVoiceCallRatUsage expectedRatUsageLte = makeRatUsageProto(CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 80000L, 2L);
    RawVoiceCallRatUsage expectedRatUsageHspa = makeRatUsageProto(CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_HSPA, 80000L, 90000L, 1L);
    final AtomicReference<RawVoiceCallRatUsage[]> ratUsage = setupRatUsageCapture();
    // call 0 dial
    mVoiceCallSessionStats0.setTimeMillis(2000L);
    doReturn(Call.State.DIALING).when(mImsCall0).getState();
    doReturn(Call.State.DIALING).when(mImsConnection0).getState();
    mVoiceCallSessionStats0.onImsDial(mImsConnection0);
    mVoiceCallSessionStats0.setTimeMillis(2020L);
    mVoiceCallSessionStats0.onAudioCodecChanged(mImsConnection0, ImsStreamMediaProfile.AUDIO_QUALITY_AMR);
    mVoiceCallSessionStats0.setTimeMillis(2080L);
    doReturn(Call.State.ALERTING).when(mImsCall0).getState();
    doReturn(Call.State.ALERTING).when(mImsConnection0).getState();
    mVoiceCallSessionStats0.onCallStateChanged(mImsCall0);
    mVoiceCallSessionStats0.setTimeMillis(4000L);
    doReturn(Call.State.ACTIVE).when(mImsCall0).getState();
    doReturn(Call.State.ACTIVE).when(mImsConnection0).getState();
    mVoiceCallSessionStats0.onCallStateChanged(mImsCall0);
    // call 1 ring
    mVoiceCallSessionStats0.setTimeMillis(60000L);
    doReturn(Call.State.INCOMING).when(mImsCall1).getState();
    doReturn(Call.State.INCOMING).when(mImsConnection1).getState();
    mVoiceCallSessionStats0.onImsCallReceived(mImsConnection1);
    mVoiceCallSessionStats0.setTimeMillis(60100L);
    mVoiceCallSessionStats0.onAudioCodecChanged(mImsConnection1, ImsStreamMediaProfile.AUDIO_QUALITY_AMR);
    // call 0 hangup by local
    mVoiceCallSessionStats0.setTimeMillis(61000L);
    mVoiceCallSessionStats0.onImsCallTerminated(mImsConnection0, new ImsReasonInfo(ImsReasonInfo.CODE_USER_TERMINATED, 0));
    mVoiceCallSessionStats0.setTimeMillis(65000L);
    mVoiceCallSessionStats0.onImsAcceptCall(List.of(mImsConnection1));
    mVoiceCallSessionStats0.setTimeMillis(65020L);
    doReturn(Call.State.ACTIVE).when(mImsCall1).getState();
    doReturn(Call.State.ACTIVE).when(mImsConnection1).getState();
    mVoiceCallSessionStats0.onCallStateChanged(mImsCall1);
    // RAT change, LTE to HSPA
    mVoiceCallSessionStats0.setTimeMillis(80000L);
    doReturn(TelephonyManager.NETWORK_TYPE_HSPA).when(mServiceState).getVoiceNetworkType();
    mVoiceCallSessionStats0.onServiceStateChanged(mServiceState);
    // call 1 hangup by remote
    mVoiceCallSessionStats0.setTimeMillis(90000L);
    mVoiceCallSessionStats0.onImsCallTerminated(mImsConnection1, new ImsReasonInfo(ImsReasonInfo.CODE_USER_TERMINATED_BY_REMOTE, 0));
    ArgumentCaptor<VoiceCallSession> callCaptor = ArgumentCaptor.forClass(VoiceCallSession.class);
    verify(mPersistAtomsStorage, times(2)).addVoiceCallSession(callCaptor.capture());
    verify(mPersistAtomsStorage, times(1)).addVoiceCallRatUsage(any());
    verifyNoMoreInteractions(mPersistAtomsStorage);
    assertSortedProtoArrayEquals(new VoiceCallSession[] { expectedCall0, expectedCall1 }, callCaptor.getAllValues().stream().toArray(VoiceCallSession[]::new));
    assertSortedProtoArrayEquals(new RawVoiceCallRatUsage[] { expectedRatUsageLte, expectedRatUsageHspa }, ratUsage.get());
}
Also used : VoiceCallSession(com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession) ArrayList(java.util.ArrayList) RawVoiceCallRatUsage(com.android.internal.telephony.nano.PersistAtomsProto.RawVoiceCallRatUsage) ImsReasonInfo(android.telephony.ims.ImsReasonInfo) TelephonyTest(com.android.internal.telephony.TelephonyTest) SmallTest(android.test.suitebuilder.annotation.SmallTest) Test(org.junit.Test) SmallTest(android.test.suitebuilder.annotation.SmallTest)

Example 47 with VoiceCallSession

use of com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession in project android_frameworks_opt_telephony by LineageOS.

the class VoiceCallSessionStats method onRilCallListChanged.

/**
 * Updates internal states when CS calls are created or terminated, or CS call state is changed.
 */
public synchronized void onRilCallListChanged(List<GsmCdmaConnection> connections) {
    for (Connection conn : connections) {
        int id = getConnectionId(conn);
        if (!mCallProtos.contains(id)) {
            // handle new connections
            if (conn.getDisconnectCause() == DisconnectCause.NOT_DISCONNECTED) {
                addCall(conn);
                checkCallSetup(conn, mCallProtos.get(id));
            } else {
                logd("onRilCallListChanged: skip adding disconnected connection");
            }
        } else {
            VoiceCallSession proto = mCallProtos.get(id);
            // handle call state change
            checkCallSetup(conn, proto);
            // handle terminated connections
            if (conn.getDisconnectCause() != DisconnectCause.NOT_DISCONNECTED) {
                // should be CS
                proto.bearerAtEnd = getBearer(conn);
                proto.disconnectReasonCode = conn.getDisconnectCause();
                proto.disconnectExtraCode = conn.getPreciseDisconnectCause();
                proto.disconnectExtraMessage = conn.getVendorDisconnectCause();
                finishCall(id);
            }
        }
    }
// NOTE: we cannot check stray connections (CS call in our list but not in RIL), as
// GsmCdmaCallTracker can call this with a partial list
}
Also used : VoiceCallSession(com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession) ImsPhoneConnection(com.android.internal.telephony.imsphone.ImsPhoneConnection) GsmCdmaConnection(com.android.internal.telephony.GsmCdmaConnection) Connection(com.android.internal.telephony.Connection)

Example 48 with VoiceCallSession

use of com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession in project android_frameworks_opt_telephony by LineageOS.

the class VoiceCallSessionStats method finishImsCall.

private void finishImsCall(int id, ImsReasonInfo reasonInfo) {
    VoiceCallSession proto = mCallProtos.get(id);
    proto.bearerAtEnd = VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_IMS;
    proto.disconnectReasonCode = reasonInfo.mCode;
    proto.disconnectExtraCode = reasonInfo.mExtraCode;
    proto.disconnectExtraMessage = reasonInfo.mExtraMessage;
    finishCall(id);
}
Also used : VoiceCallSession(com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession)

Aggregations

VoiceCallSession (com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession)48 SmallTest (android.test.suitebuilder.annotation.SmallTest)36 TelephonyTest (com.android.internal.telephony.TelephonyTest)36 Test (org.junit.Test)36 RawVoiceCallRatUsage (com.android.internal.telephony.nano.PersistAtomsProto.RawVoiceCallRatUsage)28 ArrayList (java.util.ArrayList)24 ImsReasonInfo (android.telephony.ims.ImsReasonInfo)21 InOrder (org.mockito.InOrder)6 Connection (com.android.internal.telephony.Connection)2 GsmCdmaConnection (com.android.internal.telephony.GsmCdmaConnection)2 ImsPhoneConnection (com.android.internal.telephony.imsphone.ImsPhoneConnection)2 ServiceState (android.telephony.ServiceState)1 StatsEvent (android.util.StatsEvent)1 FileOutputStream (java.io.FileOutputStream)1