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

Commit a28c7a77 authored by Qingqi Lei's avatar Qingqi Lei Committed by Android (Google) Code Review
Browse files

Merge "Revert^2 "Collect DataRatStateChanged atom"" into main

parents 0daa2155 f4ee961c
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -150,3 +150,11 @@ flag {
  description: "Enable DSRS diagnostics."
  bug: "319601607"
}

# OWNER=jackyu TARGET=24Q3
flag {
  name: "data_rat_metric_enabled"
  namespace: "telephony"
  description: "Write DataRatStateChanged atom"
  bug:"318519337"
}
+42 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.telephony.metrics;

import static com.android.internal.telephony.flags.Flags.dataRatMetricEnabled;

import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.HandlerThread;
@@ -27,6 +29,7 @@ import android.util.SparseArray;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.TelephonyStatsLog;

import java.util.HashMap;
import java.util.List;
@@ -48,6 +51,7 @@ public class DataConnectionStateTracker {
    private HashMap<Integer, PreciseDataConnectionState> mLastPreciseDataConnectionState =
            new HashMap<>();
    private PreciseDataConnectionStateListenerImpl mDataConnectionStateListener;
    private int mActiveDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;

    private final SubscriptionManager.OnSubscriptionsChangedListener mSubscriptionsChangedListener =
            new SubscriptionManager.OnSubscriptionsChangedListener() {
@@ -156,8 +160,37 @@ public class DataConnectionStateTracker {
        mPhone.getVoiceCallSessionStats().onPreciseDataConnectionStateChanged(connectionState);
    }

    static int getActiveDataSubId() {
        if (sDataConnectionStateTracker.size() == 0) {
            return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
        }
        return sDataConnectionStateTracker.valueAt(0).mActiveDataSubId;
    }

    /** Log RAT if the active data subId changes to another subId with a different RAT */
    private void logRATChanges(int subId) {
        if (mSubId == subId && mActiveDataSubId != subId) {
            int newDataRat = mPhone.getServiceStateTracker()
                    .getServiceStateStats().getCurrentDataRat();
            for (int i = 0; i < sDataConnectionStateTracker.size(); i++) {
                DataConnectionStateTracker dataConnectionStateTracker =
                        sDataConnectionStateTracker.valueAt(0);
                if (dataConnectionStateTracker.mSubId == mActiveDataSubId) {
                    int previousDataRat = dataConnectionStateTracker.mPhone
                            .getServiceStateTracker().getServiceStateStats()
                            .getCurrentDataRat();
                    if (newDataRat != previousDataRat) {
                        TelephonyStatsLog.write(TelephonyStatsLog.DATA_RAT_STATE_CHANGED,
                                newDataRat);
                    }
                }
            }
        }
    }

    private class PreciseDataConnectionStateListenerImpl extends TelephonyCallback
            implements TelephonyCallback.PreciseDataConnectionStateListener {
            implements TelephonyCallback.PreciseDataConnectionStateListener,
            TelephonyCallback.ActiveDataSubscriptionIdListener {
        private final Executor mExecutor;
        private TelephonyManager mTelephonyManager = null;

@@ -185,5 +218,13 @@ public class DataConnectionStateTracker {
                PreciseDataConnectionState connectionState) {
            notifyDataConnectionStateChanged(connectionState);
        }

        @Override
        public void onActiveDataSubscriptionIdChanged(int subId) {
            if (dataRatMetricEnabled()) {
                logRATChanges(subId);
                mActiveDataSubId = subId;
            }
        }
    }
}
+71 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.telephony.TelephonyManager.DATA_CONNECTED;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_CS;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_IMS;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_UNKNOWN;
import static com.android.internal.telephony.flags.Flags.dataRatMetricEnabled;

import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -31,6 +32,7 @@ import android.telephony.Annotation.NetworkType;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.ServiceState.RoamingType;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.ims.stub.ImsRegistrationImplBase;

@@ -38,6 +40,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.ServiceStateTracker;
import com.android.internal.telephony.TelephonyStatsLog;
import com.android.internal.telephony.data.DataNetwork;
import com.android.internal.telephony.data.DataNetworkController;
import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback;
@@ -61,6 +64,8 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
    private final PersistAtomsStorage mStorage;
    private final DeviceStateHelper mDeviceStateHelper;
    private boolean mExistAnyConnectedInternetPdn;
    private int mCurrentDataRat =
            TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__DATA_RAT_UNSPECIFIED;

    public ServiceStateStats(Phone phone) {
        super(Runnable::run);
@@ -140,6 +145,10 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
            addServiceStateAndSwitch(
                    prevState, now, getDataServiceSwitch(prevState.mServiceState, newState));
        }

        if (dataRatMetricEnabled()) {
            writeDataRatAtom(serviceState);
        }
    }

    /** Updates the fold state of the device for the current service state. */
@@ -456,6 +465,68 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
                || isNetworkRoaming(ss, NetworkRegistrationInfo.DOMAIN_PS);
    }

    /** Collect data Rat metric. */
    private void writeDataRatAtom(@NonNull ServiceState serviceState) {
        if (DataConnectionStateTracker.getActiveDataSubId() != mPhone.getSubId()) {
            return;
        }
        NetworkRegistrationInfo wwanRegInfo = serviceState.getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        if (wwanRegInfo == null) {
            return;
        }
        int dataRat = wwanRegInfo.getAccessNetworkTechnology();
        int nrFrequency = serviceState.getNrFrequencyRange();
        int nrState = serviceState.getNrState();
        int translatedDataRat =
                TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__DATA_RAT_UNSPECIFIED;
        if (!SubscriptionManager.isValidSubscriptionId(mPhone.getSubId())) {
            translatedDataRat = TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__NO_SIM;
        } else if (dataRat == TelephonyManager.NETWORK_TYPE_EHRPD
                || dataRat == TelephonyManager.NETWORK_TYPE_HSPAP
                || dataRat == TelephonyManager.NETWORK_TYPE_UMTS
                || dataRat == TelephonyManager.NETWORK_TYPE_HSDPA
                || dataRat == TelephonyManager.NETWORK_TYPE_HSUPA
                || dataRat == TelephonyManager.NETWORK_TYPE_HSPA
                || dataRat == TelephonyManager.NETWORK_TYPE_EVDO_0
                || dataRat == TelephonyManager.NETWORK_TYPE_EVDO_A
                || dataRat == TelephonyManager.NETWORK_TYPE_EVDO_B) {
            translatedDataRat = TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__DATA_RAT_3G;
        } else if (dataRat == TelephonyManager.NETWORK_TYPE_1xRTT
                || dataRat == TelephonyManager.NETWORK_TYPE_GPRS
                || dataRat == TelephonyManager.NETWORK_TYPE_EDGE
                || dataRat == TelephonyManager.NETWORK_TYPE_CDMA
                || dataRat == TelephonyManager.NETWORK_TYPE_GSM) {
            translatedDataRat = TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__DATA_RAT_2G;
        } else if (dataRat == TelephonyManager.NETWORK_TYPE_NR) {
            translatedDataRat = nrFrequency != ServiceState.FREQUENCY_RANGE_MMWAVE
                    ? TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__DATA_RAT_5G_SA_FR1 :
                    TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__DATA_RAT_5G_SA_FR2;
        } else if (dataRat == TelephonyManager.NETWORK_TYPE_LTE) {
            if (nrState == NetworkRegistrationInfo.NR_STATE_CONNECTED) {
                translatedDataRat = nrFrequency != ServiceState.FREQUENCY_RANGE_MMWAVE
                    ? TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__DATA_RAT_5G_NSA_FR1 :
                    TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__DATA_RAT_5G_NSA_FR2;
            } else if (nrState == NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED) {
                translatedDataRat =
                        TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__DATA_RAT_5G_NSA_LTE;
            } else {
                translatedDataRat =
                        TelephonyStatsLog.DATA_RAT_STATE_CHANGED__DATA_RAT__DATA_RAT_4G_LTE;
            }
        }

        if (translatedDataRat != mCurrentDataRat) {
            TelephonyStatsLog.write(TelephonyStatsLog.DATA_RAT_STATE_CHANGED, translatedDataRat);
            mCurrentDataRat = translatedDataRat;
        }
    }

    int getCurrentDataRat() {
        return mCurrentDataRat;
    }

    @VisibleForTesting
    protected long getTimeMillis() {
        return SystemClock.elapsedRealtime();