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

Commit cef5f1a1 authored by Nazanin Bakhshi's avatar Nazanin Bakhshi Committed by Gerrit Code Review
Browse files

Merge changes I8d3c6ad0,I600eb1ed,I69d46a35,I29db2ba3,Icc342738, ...

* changes:
  add fix for populating DataCallSession metrics: apnTypeBitmask, deactivateReason, failureCause, and removing profileId
  Log IMS registration statistics to statsd.
  Add new metrics to VoiceCallSession atom.
  Fix/improve SIM related statsd logging.
  Clean up of code to sanitize persistent atoms.
  Add delay before saving atoms to persistent storage.
  Separate proto message definitions for pushed and pulled atoms
  Add PNN in the metrics for carrier ID mismatch
  Log service state to statsd.
  Add support for Data calls metrics
  Fix null pointer exceptions
  Add metrics for carrier ID matching
parents a301a43e 89bd9d01
Loading
Loading
Loading
Loading
+136 −6
Original line number Diff line number Diff line
@@ -23,13 +23,13 @@ option java_outer_classname = "PersistAtomsProto";

// Holds atoms to store on persist storage in case of power cycle or process crash.
// NOTE: using int64 rather than google.protobuf.Timestamp for timestamps simplifies implementation.
// Next id: 9
// Next id: 21
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;
@@ -48,6 +48,42 @@ message PersistAtoms {

    /* Timestamp of last incoming_sms pull. */
    optional int64 outgoing_sms_pull_timestamp_millis = 8;

    /* List of carrier ID mismatch events already sent. */
    repeated CarrierIdMismatch carrier_id_mismatch = 9;

    /* Last version of carrier ID table sent. */
    optional int32 carrier_id_table_version = 10;

    /* Data Call session statistics and information. */
    repeated DataCallSession data_call_session = 11;

    /* Timestamp of last data_call_session pull. */
    optional int64 data_call_session_pull_timestamp_millis = 12;

    /* Duration spent in each possible service state. */
    repeated CellularServiceState cellular_service_state = 13;

    /* Timestamp of last cellular_service_state pull. */
    optional int64 cellular_service_state_pull_timestamp_millis = 14;

    /* Switch count between data RATs. */
    repeated CellularDataServiceSwitch cellular_data_service_switch = 15;

    /* Timestamp of last cellular_data_service_switch pull. */
    optional int64 cellular_data_service_switch_pull_timestamp_millis = 16;

    /* List of IMS registration terminations. */
    repeated ImsRegistrationTermination ims_registration_termination = 17;

    /* Timestamp of last ims_registration_termination pull. */
    optional int64 ims_registration_termination_pull_timestamp_millis = 18;

    /* Durations of IMS registrations and capabilities. */
    repeated ImsRegistrationStats ims_registration_stats = 19;

    /* Timestamp of last ims_registration_stats pull. */
    optional int64 ims_registration_stats_pull_timestamp_millis = 20;
}

// The canonical versions of the following enums live in:
@@ -82,16 +118,22 @@ message VoiceCallSession {
    optional bool rtt_enabled = 22;
    optional bool is_emergency = 23;
    optional bool is_roaming = 24;
    optional int32 signal_strength_at_end = 25;
    optional int32 band_at_end = 26;
    optional int32 setup_duration_millis = 27;
    optional int32 main_codec_quality = 28;
    optional bool video_enabled = 29;
    optional int32 rat_at_connected = 30;
    optional bool is_multiparty = 31;

    // Internal use only
    optional int64 setup_begin_millis = 10001;
}

// Internal use only
message RawVoiceCallRatUsage {
message VoiceCallRatUsage {
    optional int32 carrier_id = 1;
    optional int32 rat = 2;
    optional int64 total_duration_millis = 3;
    optional int64 total_duration_millis = 3; // Duration needs to be rounded when pulled
    optional int64 call_count = 4;
}

@@ -127,3 +169,91 @@ message OutgoingSms {
    optional int64 message_id = 12;
    optional int32 retry_id = 13;
}

message CarrierIdMismatch {
    optional string mcc_mnc = 1;
    optional string gid1 = 2;
    optional string spn = 3;
    optional string pnn = 4;
}

message DataCallSession {
    reserved 4;
    optional int32 dimension = 1;
    optional bool is_multi_sim = 2;
    optional bool is_esim = 3;
    optional int32 apn_type_bitmask = 5;
    optional int32 carrier_id = 6;
    optional bool is_roaming = 7;
    optional int32 rat_at_end = 8;
    optional bool oos_at_end = 9;
    optional int64 rat_switch_count = 10;
    optional bool is_opportunistic = 11;
    optional int32 ip_type = 12;
    optional bool setup_failed = 13;
    optional int32 failure_cause = 14;
    optional int32 suggested_retry_millis = 15;
    optional int32 deactivate_reason = 16;
    optional int64 duration_minutes = 17;
    optional bool ongoing = 18;
}

message CellularServiceState {
    optional int32 voice_rat = 1;
    optional int32 data_rat = 2;
    optional int32 voice_roaming_type = 3;
    optional int32 data_roaming_type = 4;
    optional bool is_endc = 5;
    optional int32 sim_slot_index = 6;
    optional bool is_multi_sim = 7;
    optional int32 carrier_id = 8;
    optional int64 total_time_millis = 9; // Duration needs to be rounded when pulled

    // Internal use only
    optional int64 last_used_millis = 10001;
}

message CellularDataServiceSwitch {
    optional int32 rat_from = 1;
    optional int32 rat_to = 2;
    optional int32 sim_slot_index = 3;
    optional bool is_multi_sim = 4;
    optional int32 carrier_id = 5;
    optional int32 switch_count = 6;

    // Internal use only
    optional int64 last_used_millis = 10001;
}

message ImsRegistrationTermination {
    optional int32 carrier_id = 1;
    optional bool is_multi_sim = 2;
    optional int32 rat_at_end = 3;
    optional bool setup_failed = 4;
    optional int32 reason_code = 5;
    optional int32 extra_code = 6;
    optional string extra_message = 7;
    optional int32 count = 8;

    // Internal use only
    optional int64 last_used_millis = 10001;
}

message ImsRegistrationStats {
    optional int32 carrier_id = 1;
    optional int32 sim_slot_index = 2;
    optional int32 rat = 3;
    // Durations need to be rounded when pulled
    optional int64 registered_millis = 4;
    optional int64 voice_capable_millis = 5;
    optional int64 voice_available_millis = 6;
    optional int64 sms_capable_millis = 7;
    optional int64 sms_available_millis = 8;
    optional int64 video_capable_millis = 9;
    optional int64 video_available_millis = 10;
    optional int64 ut_capable_millis = 11;
    optional int64 ut_available_millis = 12;

    // Internal use only
    optional int64 last_used_millis = 10001;
}
+25 −6
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@
package com.android.internal.telephony;

import static android.provider.Telephony.CarrierId;
import static android.provider.Telephony.Carriers.CONTENT_URI;

import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -41,6 +40,7 @@ import android.util.LocalLog;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.metrics.CarrierIdMatchStats;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.uicc.IccRecords;
import com.android.internal.telephony.uicc.UiccController;
@@ -78,6 +78,8 @@ public class CarrierResolver extends Handler {
    private static final String TEST_ACTION = "com.android.internal.telephony"
            + ".ACTION_TEST_OVERRIDE_CARRIER_ID";

    // cached version of the carrier list, so that we don't need to re-query it every time.
    private Integer mCarrierListVersion;
    // cached matching rules based mccmnc to speed up resolution
    private List<CarrierMatchingRule> mCarrierMatchingRulesOnMccMnc = new ArrayList<>();
    // cached carrier Id
@@ -275,6 +277,8 @@ public class CarrierResolver extends Handler {
                handleSimLoaded();
                break;
            case CARRIER_ID_DB_UPDATE_EVENT:
                // clean the cached carrier list version, so that a new one will be queried.
                mCarrierListVersion = null;
                loadCarrierMatchingRulesOnMccMnc(true /* update carrier config*/);
                break;
            case PREFER_APN_UPDATE_EVENT:
@@ -327,6 +331,9 @@ public class CarrierResolver extends Handler {
                        mCarrierMatchingRulesOnMccMnc.add(makeCarrierMatchingRule(cursor));
                    }
                    matchSubscriptionCarrier(updateCarrierConfig);

                    // Generate metrics related to carrier ID table version.
                    CarrierIdMatchStats.sendCarrierIdTableVersion(getCarrierListVersion());
                }
            } finally {
                if (cursor != null) {
@@ -931,14 +938,26 @@ public class CarrierResolver extends Handler {
        TelephonyMetrics.getInstance().writeCarrierIdMatchingEvent(
                mPhone.getPhoneId(), getCarrierListVersion(), mCarrierId,
                unknownMccmncToLog, unknownGid1ToLog, simInfo);

        // Generate statsd metrics only when MCC/MNC is unknown or there is no match for GID1.
        if (unknownMccmncToLog != null || unknownGid1ToLog != null) {
            // Pass the PNN value to metrics only if the SPN is empty
            String pnn = TextUtils.isEmpty(subscriptionRule.spn) ? subscriptionRule.plmn : "";
            CarrierIdMatchStats.onCarrierIdMismatch(
                    mCarrierId, unknownMccmncToLog, unknownGid1ToLog, subscriptionRule.spn, pnn);
        }
    }

    public int getCarrierListVersion() {
        // Use the cached value if it exists, otherwise retrieve it.
        if (mCarrierListVersion == null) {
            final Cursor cursor = mContext.getContentResolver().query(
                    Uri.withAppendedPath(CarrierId.All.CONTENT_URI,
                    "get_version"), null, null, null);
            cursor.moveToFirst();
        return cursor.getInt(0);
            mCarrierListVersion = cursor.getInt(0);
        }
        return mCarrierListVersion;
    }

    public int getCarrierId() {
+15 −7
Original line number Diff line number Diff line
@@ -1876,37 +1876,45 @@ public class GsmCdmaPhone extends Phone {

    @Override
    public int getCarrierId() {
        return mCarrierResolver.getCarrierId();
        return mCarrierResolver != null
                ? mCarrierResolver.getCarrierId() : super.getCarrierId();
    }

    @Override
    public String getCarrierName() {
        return mCarrierResolver.getCarrierName();
        return mCarrierResolver != null
                ? mCarrierResolver.getCarrierName() : super.getCarrierName();
    }

    @Override
    public int getMNOCarrierId() {
        return mCarrierResolver.getMnoCarrierId();
        return mCarrierResolver != null
                ? mCarrierResolver.getMnoCarrierId() : super.getMNOCarrierId();
    }

    @Override
    public int getSpecificCarrierId() {
        return mCarrierResolver.getSpecificCarrierId();
        return mCarrierResolver != null
                ? mCarrierResolver.getSpecificCarrierId() : super.getSpecificCarrierId();
    }

    @Override
    public String getSpecificCarrierName() {
        return mCarrierResolver.getSpecificCarrierName();
        return mCarrierResolver != null
                ? mCarrierResolver.getSpecificCarrierName() : super.getSpecificCarrierName();
    }

    @Override
    public void resolveSubscriptionCarrierId(String simState) {
        if (mCarrierResolver != null) {
            mCarrierResolver.resolveSubscriptionCarrierId(simState);
        }
    }

    @Override
    public int getCarrierIdListVersion() {
        return mCarrierResolver.getCarrierListVersion();
        return mCarrierResolver != null
                ? mCarrierResolver.getCarrierListVersion() : super.getCarrierIdListVersion();
    }

    @Override
+19 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ import com.android.internal.telephony.cdnr.CarrierDisplayNameResolver;
import com.android.internal.telephony.dataconnection.DataConnection;
import com.android.internal.telephony.dataconnection.DcTracker;
import com.android.internal.telephony.dataconnection.TransportManager;
import com.android.internal.telephony.metrics.ServiceStateStats;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
import com.android.internal.telephony.uicc.IccCardStatus.CardState;
@@ -481,6 +482,8 @@ public class ServiceStateTracker extends Handler {
    private static final int MS_PER_HOUR = 60 * 60 * 1000;
    private final NitzStateMachine mNitzState;

    private ServiceStateStats mServiceStateStats;

    /**
     * Holds the last NITZ signal received. Used only for trying to determine an MCC from a CDMA
     * SID.
@@ -647,6 +650,8 @@ public class ServiceStateTracker extends Handler {
        mPhone = phone;
        mCi = ci;

        mServiceStateStats = new ServiceStateStats(mPhone);

        mCdnr = new CarrierDisplayNameResolver(mPhone);

        mEriManager = TelephonyComponentFactory.getInstance().inject(EriManager.class.getName())
@@ -1717,6 +1722,7 @@ public class ServiceStateTracker extends Handler {
                        TelephonyMetrics.getInstance().writeServiceStateChanged(
                                mPhone.getPhoneId(), mSS);
                        mPhone.getVoiceCallSessionStats().onServiceStateChanged(mSS);
                        mServiceStateStats.onServiceStateChanged(mSS);
                    }
                }
                break;
@@ -2301,6 +2307,7 @@ public class ServiceStateTracker extends Handler {
                    TelephonyMetrics.getInstance().writeServiceStateChanged(
                            mPhone.getPhoneId(), mSS);
                    mPhone.getVoiceCallSessionStats().onServiceStateChanged(mSS);
                    mServiceStateStats.onServiceStateChanged(mSS);
                }

                if (mPhone.isPhoneTypeGsm()) {
@@ -3590,6 +3597,7 @@ public class ServiceStateTracker extends Handler {
        if (hasChanged || hasNrStateChanged) {
            TelephonyMetrics.getInstance().writeServiceStateChanged(mPhone.getPhoneId(), mSS);
            mPhone.getVoiceCallSessionStats().onServiceStateChanged(mSS);
            mServiceStateStats.onServiceStateChanged(mSS);
        }

        boolean shouldLogAttachedChange = false;
@@ -5905,6 +5913,17 @@ public class ServiceStateTracker extends Handler {
        tm.setDataNetworkTypeForPhone(mPhone.getPhoneId(), type);
    }

    /** Returns the {@link ServiceStateStats} for the phone tracked. */
    public ServiceStateStats getServiceStateStats() {
        return mServiceStateStats;
    }

    /** Replaces the {@link ServiceStateStats} for testing purposes. */
    @VisibleForTesting
    public void setServiceStateStats(ServiceStateStats serviceStateStats) {
        mServiceStateStats = serviceStateStats;
    }

    /**
     * Used to insert a ServiceState into the ServiceStateProvider as a ContentValues instance.
     *
+30 −1
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ import com.android.internal.telephony.ServiceStateTracker;
import com.android.internal.telephony.TelephonyStatsLog;
import com.android.internal.telephony.dataconnection.DcTracker.ReleaseNetworkType;
import com.android.internal.telephony.dataconnection.DcTracker.RequestNetworkType;
import com.android.internal.telephony.metrics.DataCallSessionStats;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.nano.TelephonyProto.RilDataCall;
import com.android.internal.util.AsyncChannel;
@@ -198,6 +199,9 @@ public class DataConnection extends StateMachine {

    private int[] mAdministratorUids = new int[0];

    // stats per data call
    private DataCallSessionStats mDataCallSessionStats;

    /**
     * Used internally for saving connecting parameters.
     */
@@ -692,6 +696,7 @@ public class DataConnection extends StateMachine {
        mCid = -1;
        mDataRegState = mPhone.getServiceState().getDataRegistrationState();
        mIsSuspended = false;
        mDataCallSessionStats = new DataCallSessionStats(mPhone);

        int networkType = getNetworkType();
        mRilRat = ServiceState.networkTypeToRilRadioTechnology(networkType);
@@ -1017,6 +1022,7 @@ public class DataConnection extends StateMachine {
        if (apnContext != null) apnContext.requestLog(str);
        mDataServiceManager.deactivateDataCall(mCid, discReason,
                obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o));
        mDataCallSessionStats.setDeactivateDataCallReason(discReason);
    }

    private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) {
@@ -1975,6 +1981,8 @@ public class DataConnection extends StateMachine {
                    if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW");
                    mDataServiceManager.deactivateDataCall(mCid, DataService.REQUEST_REASON_NORMAL,
                            null);
                    mDataCallSessionStats.setDeactivateDataCallReason(
                            DataService.REQUEST_REASON_NORMAL);
                    break;
                case EVENT_LOST_CONNECTION:
                    if (DBG) {
@@ -1997,6 +2005,10 @@ public class DataConnection extends StateMachine {
                                + " drs=" + mDataRegState
                                + " mRilRat=" + mRilRat);
                    }
                    // this is for DRS or RAT changes, so only call onRatChanged if RAT is changed
                    if (mRilRat != 0) {
                        mDataCallSessionStats.onRatChanged(mRilRat);
                    }
                    break;

                case EVENT_START_HANDOVER:  //calls startHandover()
@@ -2249,6 +2261,7 @@ public class DataConnection extends StateMachine {
                    .registerCarrierPrivilegesListener(
                            getHandler(), EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED, null);
            notifyDataConnectionState();
            mDataCallSessionStats.onSetupDataCall(mApnSetting.getApnTypeBitmask());
        }
        @Override
        public boolean processMessage(Message msg) {
@@ -2348,6 +2361,10 @@ public class DataConnection extends StateMachine {
                            throw new RuntimeException("Unknown SetupResult, should not happen");
                    }
                    retVal = HANDLED;
                    mDataCallSessionStats
                            .onSetupDataCallResponse(dataCallResponse, cp.mRilRat,
                                    mApnSetting.getApnTypeBitmask(), mApnSetting.getProtocol(),
                                    result.mFailCause);
                    break;
                case EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED:
                    AsyncResult asyncResult = (AsyncResult) msg.obj;
@@ -2500,8 +2517,9 @@ public class DataConnection extends StateMachine {
                        getHandler(), DataConnection.EVENT_LINK_CAPACITY_CHANGED, null);
            }
            notifyDataConnectionState();
            int apnBitMask = mApnSetting.getApnTypeBitmask();
            TelephonyMetrics.getInstance().writeRilDataCallEvent(mPhone.getPhoneId(),
                    mCid, mApnSetting.getApnTypeBitmask(), RilDataCall.State.CONNECTED);
                    mCid, apnBitMask, RilDataCall.State.CONNECTED);
        }

        @Override
@@ -2529,6 +2547,7 @@ public class DataConnection extends StateMachine {

            TelephonyMetrics.getInstance().writeRilDataCallEvent(mPhone.getPhoneId(),
                    mCid, mApnSetting.getApnTypeBitmask(), RilDataCall.State.DISCONNECTED);
            mDataCallSessionStats.onDataCallDisconnected(mCid);

            mPhone.getCarrierPrivilegesTracker().unregisterCarrierPrivilegesListener(getHandler());
        }
@@ -2640,6 +2659,10 @@ public class DataConnection extends StateMachine {
                        mNetworkAgent.sendLinkProperties(mLinkProperties, DataConnection.this);
                    }
                    retVal = HANDLED;
                    // this is for DRS or RAT changes, so only call onRatChanged if RAT is changed
                    if (mRilRat != 0) {
                        mDataCallSessionStats.onRatChanged(mRilRat);
                    }
                    break;
                }
                case EVENT_NR_FREQUENCY_CHANGED:
@@ -3177,6 +3200,12 @@ public class DataConnection extends StateMachine {
        }
    }

    /** Sets the {@link DataCallSessionStats} mock for this phone ID during unit testing. */
    @VisibleForTesting
    public void setDataCallSessionStats(DataCallSessionStats dataCallSessionStats) {
        mDataCallSessionStats = dataCallSessionStats;
    }

    /**
     * @return the string for msg.what as our info.
     */
Loading