Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a46c701c authored by Jisun Annie Jung's avatar Jisun Annie Jung Committed by Android (Google) Code Review
Browse files

Merge "Add registering_seconds and unregistered_seconds to ImsRegistrationStats" into main

parents ba32229a 12d24f2c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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;
+63 −59
Original line number Diff line number Diff line
@@ -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();
@@ -210,6 +210,10 @@ public class ImsStats {
    public ImsStats(ImsPhone phone) {
        mPhone = phone;
        mStorage = PhoneFactory.getMetricsCollector().getAtomsStorage();

        mLastRegistrationStats = getDefaultImsRegistrationStats();
        updateImsRegistrationStats();
        mLastTimestamp = getTimeMillis();
    }

    /**
@@ -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 =
@@ -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;
@@ -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;
        }
@@ -308,7 +318,7 @@ public class ImsStats {
        conclude();

        mLastTransportType = imsRadioTech;
        mLastRegistrationStats = getDefaultImsRegistrationStats();
        updateImsRegistrationStats();
        mLastRegistrationStats.rat = convertTransportTypeToNetworkType(imsRadioTech);
        mLastRegistrationState = REGISTRATION_STATE_REGISTERING;
    }
@@ -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;
@@ -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();
@@ -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);
        }
@@ -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;
        }
@@ -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) {
@@ -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;
    }
+3 −1
Original line number Diff line number Diff line
@@ -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) {
+6 −0
Original line number Diff line number Diff line
@@ -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();
@@ -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;
    }
+130 −8
Original line number Diff line number Diff line
@@ -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);
    }

@@ -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 {
@@ -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);
@@ -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);
@@ -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);
@@ -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);