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

Commit 29d89c97 authored by Chi Zhang's avatar Chi Zhang Committed by Android (Google) Code Review
Browse files

Merge "Fix/improve SIM related statsd logging."

parents ce6e6bb2 28f3d941
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -26,10 +26,10 @@ option java_outer_classname = "PersistAtomsProto";
// Next id: 17
message PersistAtoms {
    /* Aggregated RAT usage during the call. */
    repeated RawVoiceCallRatUsage raw_voice_call_rat_usage = 1;
    repeated VoiceCallRatUsage voice_call_rat_usage = 1;

    /* Timestamp of last voice_call_rat_usages pull. */
    optional int64 raw_voice_call_rat_usage_pull_timestamp_millis = 2;
    optional int64 voice_call_rat_usage_pull_timestamp_millis = 2;

    /* Per call statistics and information. */
    repeated VoiceCallSession voice_call_session = 3;
@@ -111,7 +111,7 @@ message VoiceCallSession {
    optional int64 setup_begin_millis = 10001;
}

message RawVoiceCallRatUsage {
message VoiceCallRatUsage {
    optional int32 carrier_id = 1;
    optional int32 rat = 2;
    optional int64 total_duration_millis = 3; // Duration needs to be rounded when pulled
+1 −1
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ public class AirplaneModeStats extends ContentObserver {
     * Returns the carrier ID of the active data subscription. If this is not available,
     * it returns the carrier ID of the first phone.
     */
    private int getCarrierId() {
    private static int getCarrierId() {
        int dataSubId = SubscriptionManager.getActiveDataSubscriptionId();
        int phoneId = dataSubId != INVALID_SUBSCRIPTION_ID
                ? SubscriptionManager.getPhoneId(dataSubId) : 0;
+13 −39
Original line number Diff line number Diff line
@@ -34,13 +34,10 @@ import android.telephony.data.DataService;
import android.telephony.data.DataService.DeactivateDataReason;

import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.ServiceStateTracker;
import com.android.internal.telephony.SubscriptionController;
import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession;
import com.android.internal.telephony.uicc.UiccController;
import com.android.internal.telephony.uicc.UiccSlot;
import com.android.telephony.Rlog;

import java.util.Random;
@@ -59,16 +56,10 @@ public class DataCallSessionStats {
    private static final Random RANDOM = new Random();

    public DataCallSessionStats(Phone phone) {
        if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) {
            mPhone = phone.getDefaultPhone();
        } else {
        mPhone = phone;
    }
    }

    /**
     * create a new ongoing atom when data cal is set up
     */
    /** create a new ongoing atom when data cal is set up */
    public synchronized void onSetupDataCall() {
        // there shouldn't be an ongoing dataCall here, if that's the case, it means that
        // deactivateDataCall hasn't been processed properly, so we save the previous atom here
@@ -92,9 +83,12 @@ public class DataCallSessionStats {
     * @param apnTypeBitmask APN type bitmask
     * @param protocol Data connection protocol
     */
    public synchronized void onSetupDataCallResponse(DataCallResponse response,
            @NetworkType int radioTechnology, int profileId,
            @ApnType int apnTypeBitmask, @ProtocolType int protocol) {
    public synchronized void onSetupDataCallResponse(
            DataCallResponse response,
            @NetworkType int radioTechnology,
            int profileId,
            @ApnType int apnTypeBitmask,
            @ProtocolType int protocol) {
        // there should've been another call to initiate the atom,
        // so this method is being called out of order -> no metric will be logged
        if (mOngoingDataCall == null) {
@@ -156,6 +150,7 @@ public class DataCallSessionStats {

    /**
     * store the atom, when DataConnection reaches DISCONNECTED state
     *
     * @param cid Context Id, uniquely identifies the call
     */
    public void onDataCallDisconnected(int cid) {
@@ -195,11 +190,11 @@ public class DataCallSessionStats {
    private DataCallSession getDefaultProto() {
        DataCallSession proto = new DataCallSession();
        proto.dimension = RANDOM.nextInt();
        proto.isMultiSim = isMultiSim();
        proto.isEsim = isEsim();
        proto.isMultiSim = SimSlotState.isMultiSim();
        proto.isEsim = SimSlotState.isEsim(mPhone.getPhoneId());
        proto.profile = DATA_CALL_SESSION__PROFILE__DATA_PROFILE_DEFAULT;
        proto.apnTypeBitmask = ApnSetting.TYPE_NONE;
        proto.carrierId = getCarrierId();
        proto.carrierId = mPhone.getCarrierId();
        proto.isRoaming = getIsRoaming();
        proto.oosAtEnd = false;
        proto.ratSwitchCount = 0L;
@@ -214,23 +209,6 @@ public class DataCallSessionStats {
        return proto;
    }

    private boolean isMultiSim() {
        return SimSlotState.getCurrentState().numActiveSims > 1;
    }

    private boolean isEsim() {
        UiccController uiccController = UiccController.getInstance();
        int slotId = uiccController.getSlotIdFromPhoneId(mPhone.getPhoneId());
        UiccSlot slot = uiccController.getUiccSlot(slotId);
        if (slot != null) {
            return slot.isEuicc();
        } else {
            // should not happen, but assume we are not using eSIM
            loge("isEsim: slot %d is null", slotId);
            return false;
        }
    }

    private boolean getIsRoaming() {
        ServiceStateTracker serviceStateTracker = mPhone.getServiceStateTracker();
        ServiceState serviceState =
@@ -243,10 +221,6 @@ public class DataCallSessionStats {
        return subController != null ? subController.isOpportunistic(mPhone.getSubId()) : false;
    }

    private int getCarrierId() {
        return mPhone.getCarrierId();
    }

    private void loge(String format, Object... args) {
        Rlog.e(TAG, "[" + mPhone.getPhoneId() + "]" + String.format(format, args));
    }
+3 −3
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ import com.android.internal.telephony.nano.PersistAtomsProto.CellularServiceStat
import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession;
import com.android.internal.telephony.nano.PersistAtomsProto.IncomingSms;
import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms;
import com.android.internal.telephony.nano.PersistAtomsProto.RawVoiceCallRatUsage;
import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallRatUsage;
import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession;
import com.android.internal.util.ConcurrentUtils;
import com.android.telephony.Rlog;
@@ -215,7 +215,7 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
    }

    private int pullVoiceCallRatUsages(List<StatsEvent> data) {
        RawVoiceCallRatUsage[] usages = mStorage.getVoiceCallRatUsages(MIN_COOLDOWN_MILLIS);
        VoiceCallRatUsage[] usages = mStorage.getVoiceCallRatUsages(MIN_COOLDOWN_MILLIS);
        if (usages != null) {
            // sort by carrier/RAT and remove buckets with insufficient number of calls
            Arrays.stream(usages)
@@ -347,7 +347,7 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
                (int) (round(state.totalTimeMillis, DURATION_BUCKET_MILLIS) / SECOND_IN_MILLIS));
    }

    private static StatsEvent buildStatsEvent(RawVoiceCallRatUsage usage) {
    private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) {
        return TelephonyStatsLog.buildStatsEvent(
                VOICE_CALL_RAT_USAGE,
                usage.carrierId,
+15 −15
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession;
import com.android.internal.telephony.nano.PersistAtomsProto.IncomingSms;
import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms;
import com.android.internal.telephony.nano.PersistAtomsProto.PersistAtoms;
import com.android.internal.telephony.nano.PersistAtomsProto.RawVoiceCallRatUsage;
import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallRatUsage;
import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession;
import com.android.internal.util.ArrayUtils;
import com.android.telephony.Rlog;
@@ -105,7 +105,7 @@ public class PersistAtomsStorage {
    public PersistAtomsStorage(Context context) {
        mContext = context;
        mAtoms = loadAtomsFromFile();
        mVoiceCallRatTracker = VoiceCallRatTracker.fromProto(mAtoms.rawVoiceCallRatUsage);
        mVoiceCallRatTracker = VoiceCallRatTracker.fromProto(mAtoms.voiceCallRatUsage);

        mHandlerThread = new HandlerThread("PersistAtomsThread");
        mHandlerThread.start();
@@ -123,7 +123,7 @@ public class PersistAtomsStorage {
    /** Adds RAT usages to the storage when a call session ends. */
    public synchronized void addVoiceCallRatUsage(VoiceCallRatTracker ratUsages) {
        mVoiceCallRatTracker.mergeWith(ratUsages);
        mAtoms.rawVoiceCallRatUsage = mVoiceCallRatTracker.toProto();
        mAtoms.voiceCallRatUsage = mVoiceCallRatTracker.toProto();
        saveAtomsToFile();
    }

@@ -258,13 +258,13 @@ public class PersistAtomsStorage {
     * minIntervalMillis} ago, otherwise returns {@code null}.
     */
    @Nullable
    public synchronized RawVoiceCallRatUsage[] getVoiceCallRatUsages(long minIntervalMillis) {
        if (getWallTimeMillis() - mAtoms.rawVoiceCallRatUsagePullTimestampMillis
    public synchronized VoiceCallRatUsage[] getVoiceCallRatUsages(long minIntervalMillis) {
        if (getWallTimeMillis() - mAtoms.voiceCallRatUsagePullTimestampMillis
                > minIntervalMillis) {
            mAtoms.rawVoiceCallRatUsagePullTimestampMillis = getWallTimeMillis();
            RawVoiceCallRatUsage[] previousUsages = mAtoms.rawVoiceCallRatUsage;
            mAtoms.voiceCallRatUsagePullTimestampMillis = getWallTimeMillis();
            VoiceCallRatUsage[] previousUsages = mAtoms.voiceCallRatUsage;
            mVoiceCallRatTracker.clear();
            mAtoms.rawVoiceCallRatUsage = new RawVoiceCallRatUsage[0];
            mAtoms.voiceCallRatUsage = new VoiceCallRatUsage[0];
            saveAtomsToFile();
            return previousUsages;
        } else {
@@ -370,8 +370,8 @@ public class PersistAtomsStorage {
                    PersistAtoms.parseFrom(
                            Files.readAllBytes(mContext.getFileStreamPath(FILENAME).toPath()));
            // check all the fields in case of situations such as OTA or crash during saving
            atoms.rawVoiceCallRatUsage = sanitizeAtoms(atoms.rawVoiceCallRatUsage,
                    RawVoiceCallRatUsage.class);
            atoms.voiceCallRatUsage = sanitizeAtoms(atoms.voiceCallRatUsage,
                    VoiceCallRatUsage.class);
            atoms.voiceCallSession = sanitizeAtoms(atoms.voiceCallSession,
                    VoiceCallSession.class, MAX_NUM_CALL_SESSIONS);
            atoms.incomingSms = sanitizeAtoms(atoms.incomingSms, IncomingSms.class, MAX_NUM_SMS);
@@ -385,8 +385,8 @@ public class PersistAtomsStorage {
            atoms.cellularDataServiceSwitch = sanitizeAtoms(atoms.cellularDataServiceSwitch,
                    CellularDataServiceSwitch.class, MAX_NUM_CELLULAR_DATA_SERVICE_SWITCHES);
            // out of caution, sanitize also the timestamps
            atoms.rawVoiceCallRatUsagePullTimestampMillis =
                    sanitizeTimestamp(atoms.rawVoiceCallRatUsagePullTimestampMillis);
            atoms.voiceCallRatUsagePullTimestampMillis =
                    sanitizeTimestamp(atoms.voiceCallRatUsagePullTimestampMillis);
            atoms.voiceCallSessionPullTimestampMillis =
                    sanitizeTimestamp(atoms.voiceCallSessionPullTimestampMillis);
            atoms.incomingSmsPullTimestampMillis =
@@ -409,8 +409,8 @@ public class PersistAtomsStorage {
    /**
     * Posts message to save a copy of {@link PersistAtoms} to a file after a delay.
     *
     * The delay is introduced to avoid too frequent operations to disk, that would have negative
     * impact on the power consumption.
     * <p>The delay is introduced to avoid too frequent operations to disk, which would negatively
     * impact the power consumption.
     */
    private void saveAtomsToFile() {
        if (mSaveDelay > 0) {
@@ -549,7 +549,7 @@ public class PersistAtomsStorage {
        PersistAtoms atoms = new PersistAtoms();
        // allow pulling only after some time so data are sufficiently aggregated
        long currentTime = getWallTimeMillis();
        atoms.rawVoiceCallRatUsagePullTimestampMillis = currentTime;
        atoms.voiceCallRatUsagePullTimestampMillis = currentTime;
        atoms.voiceCallSessionPullTimestampMillis = currentTime;
        atoms.incomingSmsPullTimestampMillis = currentTime;
        atoms.outgoingSmsPullTimestampMillis = currentTime;
Loading