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

Commit 3fc643a5 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 8018982 from ff691cef to sc-v2-release

Change-Id: Ief18255c24414adff4e41e962ab42c504e85e25b
parents 724fb71c ff691cef
Loading
Loading
Loading
Loading
+56 −35
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

@@ -132,13 +133,16 @@ public class QosCallbackTracker {
        logd("updateSessions: sessions size=" + sessions.size());

        int bearerState = DedicatedBearerEvent_STATE_NONE;

        final List<QosBearerSession> sessionsToAdd = new ArrayList<>();
        final Map<Integer, QosBearerSession> incomingSessions = new HashMap<>();
        final HashSet<Integer> sessionsReportedToMetric = new HashSet<>();
        for (final QosBearerSession incomingSession : sessions) {
            incomingSessions.put(incomingSession.getQosBearerSessionId(), incomingSession);
            int sessionId = incomingSession.getQosBearerSessionId();
            incomingSessions.put(sessionId, incomingSession);

            final QosBearerSession existingSession = mQosBearerSessions.get(
                    incomingSession.getQosBearerSessionId());
                    sessionId);
            for (final int callbackId : mCallbacksToFilter.keySet()) {
                final IFilter filter = mCallbacksToFilter.get(callbackId);

@@ -149,7 +153,6 @@ public class QosCallbackTracker {
                if (!existingSessionMatch && incomingSessionMatch) {
                    // The filter matches now and didn't match earlier
                    sendSessionAvailable(callbackId, incomingSession, filter);

                    bearerState = DedicatedBearerEvent_STATE_ADDED;
                }

@@ -162,25 +165,46 @@ public class QosCallbackTracker {
                    }
                }

                notifyMetricDedicatedBearerEvent(incomingSession, filter, bearerState);
                // this QosBearerSession has registered QosCallbackId
                if (!sessionsReportedToMetric.contains(sessionId) && incomingSessionMatch) {
                    // this session has listener
                    notifyMetricDedicatedBearerEvent(incomingSession, bearerState, true);
                    sessionsReportedToMetric.add(sessionId);
                }
            }

            // this QosBearerSession does not have registered QosCallbackId
            if (!sessionsReportedToMetric.contains(sessionId)) {
                // no listener is registered to this session
                bearerState = DedicatedBearerEvent_STATE_ADDED;
                notifyMetricDedicatedBearerEvent(incomingSession, bearerState, false);
                sessionsReportedToMetric.add(sessionId);
            }
            sessionsToAdd.add(incomingSession);
        }

        final List<Integer> sessionsToRemove = new ArrayList<>();
        sessionsReportedToMetric.clear();
        bearerState = DedicatedBearerEvent_STATE_DELETED;

        // Find sessions that no longer exist
        for (final QosBearerSession existingSession : mQosBearerSessions.values()) {
            if (!incomingSessions.containsKey(existingSession.getQosBearerSessionId())) {
            final int sessionId = existingSession.getQosBearerSessionId();
            if (!incomingSessions.containsKey(sessionId)) {
                for (final int callbackId : mCallbacksToFilter.keySet()) {
                    final IFilter filter = mCallbacksToFilter.get(callbackId);
                    // The filter matches which means it was previously available, and now is lost
                    if (doFiltersMatch(existingSession, filter)) {
                        bearerState = DedicatedBearerEvent_STATE_DELETED;
                        sendSessionLost(callbackId, existingSession);
                        notifyMetricDedicatedBearerEvent(existingSession, filter, bearerState);
                        notifyMetricDedicatedBearerEvent(existingSession, bearerState, true);
                        sessionsReportedToMetric.add(sessionId);
                    }
                }
                sessionsToRemove.add(existingSession.getQosBearerSessionId());
                if (!sessionsReportedToMetric.contains(sessionId)) {
                    notifyMetricDedicatedBearerEvent(existingSession, bearerState, false);
                    sessionsReportedToMetric.add(sessionId);
                }
            }
        }

@@ -360,40 +384,37 @@ public class QosCallbackTracker {
        return 0;
    }

    private void notifyMetricDedicatedBearerEvent(final QosBearerSession session,
            final IFilter filter, final int bearerState) {

        final int slotId = mPhoneID;
        int ratAtEnd = 0;
        int qci = 0;
        boolean localConnectionInfoReceived = false;
        boolean remoteConnectionInfoReceived = false;


        QosBearerFilter qosBearerFilter = getMatchingQosBearerFilter(session, filter);
        if (session.getQos() instanceof EpsQos) {
            ratAtEnd = TelephonyProtoEnums.NETWORK_TYPE_LTE;
            qci = ((EpsQos) session.getQos()).getQci();
        } else if (session.getQos() instanceof NrQos) {
            ratAtEnd = TelephonyProtoEnums.NETWORK_TYPE_NR;
            qci = ((NrQos) session.getQos()).get5Qi();
        } else {
            return;
    private boolean doesLocalConnectionInfoExist(final QosBearerSession qosBearerSession) {
        for (final QosBearerFilter sessionFilter : qosBearerSession.getQosBearerFilterList()) {
            if (!sessionFilter.getLocalAddresses().isEmpty()
                    && sessionFilter.getLocalPortRange().isValid()) {
                return true;
            }
        }
        return false;
    }

        if (qosBearerFilter != null) {
            if (!qosBearerFilter.getLocalAddresses().isEmpty()
                    && qosBearerFilter.getLocalPortRange().isValid()) {
                localConnectionInfoReceived = true;
    private boolean doesRemoteConnectionInfoExist(final QosBearerSession qosBearerSession) {
        for (final QosBearerFilter sessionFilter : qosBearerSession.getQosBearerFilterList()) {
            if (!sessionFilter.getRemoteAddresses().isEmpty()
                    && sessionFilter.getRemotePortRange().isValid()) {
                return true;
            }
            if (!qosBearerFilter.getRemoteAddresses().isEmpty()
                    && qosBearerFilter.getRemotePortRange().isValid()) {
                remoteConnectionInfoReceived = true;
        }
        return false;
    }

    private void notifyMetricDedicatedBearerEvent(final QosBearerSession session,
            final int bearerState, final boolean hasListener) {

        final int slotId = mPhoneID;
        int ratAtEnd = getRatInfoFromSessionInfo(session);
        int qci = getQCIFromSessionInfo(session);
        boolean localConnectionInfoReceived = doesLocalConnectionInfoExist(session);
        boolean remoteConnectionInfoReceived = doesRemoteConnectionInfoExist(session);

        mRcsStats.onImsDedicatedBearerEvent(slotId, ratAtEnd, qci, bearerState,
                localConnectionInfoReceived, remoteConnectionInfoReceived, true);
                localConnectionInfoReceived, remoteConnectionInfoReceived, hasListener);
    }

    public interface IFilter {
+23 −10
Original line number Diff line number Diff line
@@ -412,10 +412,14 @@ public class RcsStats {

        private class LastFeatureTagState {
            public long timeStamp;
            public int carrierId;
            public int slotId;
            public int state;
            public int reason;

            LastFeatureTagState(int state, int reason, long timeStamp) {
            LastFeatureTagState(int carrierId, int slotId, int state, int reason, long timeStamp) {
                this.carrierId = carrierId;
                this.slotId = slotId;
                this.state = state;
                this.reason = reason;
                this.timeStamp = timeStamp;
@@ -444,17 +448,19 @@ public class RcsStats {
        /*** Create or update featureTags whenever feature Tag states are changed */
        public synchronized void updateLastFeatureTagState(String tagName, int state, int reason,
                long timeStamp) {
            int carrierId = getCarrierId(mSubId);
            int slotId = getSlotId(mSubId);
            if (mFeatureTagMap.containsKey(tagName)) {
                LastFeatureTagState lastFeatureTagState = mFeatureTagMap.get(tagName);
                if (lastFeatureTagState != null) {
                    addFeatureTagStat(tagName, lastFeatureTagState, timeStamp);
                    lastFeatureTagState.update(state, reason, timeStamp);
                } else {
                    create(tagName, state, reason, timeStamp);
                    create(tagName, carrierId, slotId, state, reason, timeStamp);
                }

            } else {
                create(tagName, state, reason, timeStamp);
                create(tagName, carrierId, slotId, state, reason, timeStamp);
            }
        }

@@ -474,8 +480,10 @@ public class RcsStats {
        private synchronized boolean addFeatureTagStat(@NonNull String tagName,
                @NonNull LastFeatureTagState lastFeatureTagState, long now) {
            long duration = now - lastFeatureTagState.timeStamp;
            if (duration < MIN_DURATION_MILLIS) {
                logd("conclude: discarding transient stats, duration= " + duration);
            if (duration < MIN_DURATION_MILLIS
                    || !isValidCarrierId(lastFeatureTagState.carrierId)) {
                logd("conclude: discarding transient stats, duration= " + duration
                        + ", carrierId = " + lastFeatureTagState.carrierId);
            } else {
                SipTransportFeatureTagStats sipFeatureTagStat = new SipTransportFeatureTagStats();
                switch (lastFeatureTagState.state) {
@@ -494,8 +502,8 @@ public class RcsStats {
                        break;
                }

                sipFeatureTagStat.carrierId = getCarrierId(mSubId);
                sipFeatureTagStat.slotId = getSlotId(mSubId);
                sipFeatureTagStat.carrierId = lastFeatureTagState.carrierId;
                sipFeatureTagStat.slotId = lastFeatureTagState.slotId;
                sipFeatureTagStat.associatedMillis = duration;
                sipFeatureTagStat.featureTagName = convertTagNameToValue(tagName);
                mAtomsStorage.addSipTransportFeatureTagStats(sipFeatureTagStat);
@@ -518,9 +526,10 @@ public class RcsStats {
            }
        }

        private LastFeatureTagState create(String tagName, int state, int reason, long timeStamp) {
            LastFeatureTagState lastFeatureTagState = new LastFeatureTagState(state, reason,
                    timeStamp);
        private LastFeatureTagState create(String tagName, int carrierId, int slotId, int state,
                int reason, long timeStamp) {
            LastFeatureTagState lastFeatureTagState = new LastFeatureTagState(carrierId, slotId,
                    state, reason, timeStamp);
            mFeatureTagMap.put(tagName, lastFeatureTagState);
            return lastFeatureTagState;
        }
@@ -1411,6 +1420,10 @@ public class RcsStats {
        return sipTransportFeatureTags;
    }

    private boolean isValidCarrierId(int carrierId) {
        return carrierId > TelephonyManager.UNKNOWN_CARRIER_ID;
    }

    @VisibleForTesting
    protected int getSlotId(int subId) {
        return SubscriptionManager.getPhoneId(subId);
+35 −2
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ public class RcsStatsTest extends TelephonyTest {
    private static final int SLOT2_ID = 1;
    private static final int CARRIER_ID = 100;
    private static final int CARRIER2_ID = 200;
    private static final int INVALID_CARRIER_ID = -1;
    private static final int INVALID_SUB_ID = Integer.MIN_VALUE;

    private class TestResult {
        public String tagName;
@@ -105,11 +107,14 @@ public class RcsStatsTest extends TelephonyTest {

        @Override
        protected int getCarrierId(int subId) {
            if (subId == mSubId) {
            if (subId == INVALID_SUB_ID) {
                return INVALID_CARRIER_ID;
            } else if (subId == mSubId) {
                return CARRIER_ID;
            }
            } else {
                return CARRIER2_ID;
            }
        }

        @Override
        protected long getWallTimeMillis() {
@@ -612,6 +617,34 @@ public class RcsStatsTest extends TelephonyTest {
        verifyNoMoreInteractions(mPersistAtomsStorage);
    }

    @Test
    @SmallTest
    public void onSipTransportFeatureTagStats_addInvalidEntries() throws Exception {
        final long timeGap = 6000L;
        Set<FeatureTagState> deniedTags = new ArraySet<>();
        Set<FeatureTagState> deRegiTags = new ArraySet<>();
        Set<String> regiTags = new ArraySet<>();

        final int invalidSubId = INVALID_SUB_ID;

        // create new featureTags with an invalidId
        regiTags.add(FeatureTags.FEATURE_TAG_STANDALONE_MSG);
        deniedTags.add(new FeatureTagState(FeatureTags.FEATURE_TAG_FILE_TRANSFER,
                SipDelegateManager.DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE));
        mRcsStats.onSipTransportFeatureTagStats(invalidSubId, deniedTags, deRegiTags, regiTags);
        mRcsStats.incTimeMillis(timeGap);

        // change status of featureTags with an invalidId
        regiTags.clear();
        deRegiTags.add(new FeatureTagState(FeatureTags.FEATURE_TAG_STANDALONE_MSG,
                DelegateRegistrationState.DEREGISTERED_REASON_NOT_REGISTERED));
        mRcsStats.onSipTransportFeatureTagStats(invalidSubId, deniedTags, deRegiTags, regiTags);
        mRcsStats.incTimeMillis(timeGap);

        verify(mPersistAtomsStorage, never()).addSipTransportFeatureTagStats(any());
    }


    @Test
    @SmallTest
    public void onSipTransportFeatureTagStats_addCustomTag() throws Exception {