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

Commit eb66fa13 authored by Pengquan Meng's avatar Pengquan Meng
Browse files

Refactor simState & activeSubscriptionInfo

We log a base SimState, ActiveSubscriptionInfo and the
EnabledModemBitmap at the first time and reset. If any of these data is
changed, the change will be logged.

Move ActiveSubscriptionInfo to the TelephonyLog so that all
the telephony event can share these data during the aggregation.

Bug: 123047205
Test: build
Change-Id: I584572c0252d74cc08e39825f79f7477156bdb50
Merged-In: I8e510746b16edd436380fb98a21fbb4fb4faa0b6
parent c4233f6d
Loading
Loading
Loading
Loading
+41 −54
Original line number Diff line number Diff line
@@ -50,6 +50,9 @@ message TelephonyLog {

  // Hardware revision (EVT, DVT, PVT etc.)
  optional string hardware_revision = 9;

  // The active subscription info for a specific slot.
  repeated ActiveSubscriptionInfo active_subscription_info = 10;
}

// The time information
@@ -276,9 +279,6 @@ message TelephonyServiceState {

  // Current data radio technology
  optional RadioAccessTechnology data_rat = 6 [default = UNKNOWN];

  // All the active subscription information.
  repeated ActiveSubscriptionInfo active_subscription_info = 7;
}

// Radio access families
@@ -619,9 +619,6 @@ message RilDataCall {

  // The network interface name e.g. wlan0, rmnet_data0.
  optional string iframe = 3;

  // All the active subscription information.
  repeated ActiveSubscriptionInfo active_subscription_info = 4;
}

message TelephonyEvent {
@@ -675,35 +672,41 @@ message TelephonyEvent {
    // Carrier Key Change event.
    CARRIER_KEY_CHANGED = 14;

    // Phone status change event.
    PHONE_STATUS_CHANGED = 15;

    // Data switch event.
    DATA_SWITCH = 16;
    DATA_SWITCH = 15;

    // Network validate event.
    NETWORK_VALIDATE = 17;
    NETWORK_VALIDATE = 16;

    // On deman data switch event.
    ON_DEMAND_DATA_SWITCH = 18;
    ON_DEMAND_DATA_SWITCH = 17;

    // SIM state change event.
    SIM_STATE_CHANGE = 18;

    // Active subscription info change event.
    ACTIVE_SUBSCRIPTION_INFO_CHANGE = 19;

    // Enabled modem change event.
    ENABLED_MODEM_CHANGE = 20;
  }

  enum ApnType {
      DEFAULT = 0;
      MMS = 1;
      SUPL = 2;
      DUN = 3;
      HIPRI = 4;
      FOTA = 5;
      IMS = 6;
      CBS = 7;
      IA = 8;
      EMERGENCY = 9;
      DEFAULT = 1;
      MMS = 2;
      SUPL = 3;
      DUN = 4;
      HIPRI = 5;
      FOTA = 6;
      IMS = 7;
      CBS = 8;
      IA = 9;
      EMERGENCY = 10;
  }

  enum EventState {
      START = 0;
      END = 1;
      START = 1;
      END = 2;
  }

  enum NetworkValidationState {
@@ -1542,17 +1545,6 @@ message TelephonyEvent {
    optional string mccmnc = 3;
  }

  message PhoneStatus {
      /** The sim state of each active slot. */
      repeated SimState sim_state = 1;

      /**
       * The modem state represent by a bitmap, the i-th bit(LSB) indicates the i-th modem
       * state(0 - disabled, 1 - enabled).
       */
      optional int32 enabled_modem_bitmap = 2;
  }

  // Time when event happened on device, in milliseconds since epoch
  optional int64 timestamp_millis = 1;

@@ -1604,9 +1596,6 @@ message TelephonyEvent {
  // Carrier key change
  optional CarrierKeyChange carrier_key_change = 17;

  // Phone status
  optional PhoneStatus phone_status = 18;

  // Data switch event
  optional DataSwitch data_switch = 19;

@@ -1615,17 +1604,27 @@ message TelephonyEvent {

  // On demand data switch event
  optional OnDemandDataSwitch on_demand_data_switch = 21;

  // Sim state for each slot.
  repeated SimState sim_state = 22;

  // The active subscription info for a specific slot.
  optional ActiveSubscriptionInfo active_subscription_info = 23;

  // The modem state represent by a bitmap, the i-th bit(LSB) indicates the i-th modem
  // state(0 - disabled, 1 - enabled).
  optional int32 enabled_modem_bitmap = 24;
}

message ActiveSubscriptionInfo {
    /** The slot index which this subscription associated with. */
    /** The slot index which this subscription is associated with. */
    optional int32 slot_index = 1;

    /** The Carrier id of this subscription. */
    /** The Carrier id of this subscription. -1 indicates unknown value. */
    optional int32 carrier_id = 2;

    /** whether subscription is opportunistic. */
    optional bool is_opportunistic = 3;
    /** whether subscription is opportunistic (0 - false, 1 - true, -1 - unknown). */
    optional int32 is_opportunistic = 3;
};

enum SimState {
@@ -2007,12 +2006,6 @@ message TelephonyCallSession {

  // Indicating some call events are dropped
  optional bool events_dropped = 4;

  // SIM state of the active slots
  repeated SimState sim_states = 5;

  // All the active subscription information.
  repeated ActiveSubscriptionInfo active_subscription_info = 6;
}

message SmsSession {
@@ -2227,12 +2220,6 @@ message SmsSession {

  // Indicating some sms session events are dropped
  optional bool events_dropped = 4;

  // SIM state of the active slots.
  repeated SimState sim_state = 5;

  // All the active subscription information.
  repeated ActiveSubscriptionInfo active_subscription_info = 6;
}

// Power stats for modem
+32 −7
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.internal.telephony.metrics;
import static com.android.internal.telephony.nano.TelephonyProto.ImsCapabilities;
import static com.android.internal.telephony.nano.TelephonyProto.ImsConnectionState;
import static com.android.internal.telephony.nano.TelephonyProto.RilDataCall;
import static com.android.internal.telephony.nano.TelephonyProto.SimState;
import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent;
import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.CarrierIdMatching;
import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.CarrierKeyChange;
@@ -30,12 +31,16 @@ import static com.android.internal.telephony.nano.TelephonyProto.TelephonyServic
import static com.android.internal.telephony.nano.TelephonyProto.TelephonySettings;

import android.os.SystemClock;
import android.telephony.TelephonyManager;
import android.util.SparseArray;

import com.android.internal.telephony.nano.TelephonyProto.ActiveSubscriptionInfo;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.DataSwitch;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.OnDemandDataSwitch;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.PhoneStatus;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.Type;

import java.util.Arrays;

public class TelephonyEventBuilder {
    private final TelephonyEvent mEvent = new TelephonyEvent();

@@ -144,12 +149,32 @@ public class TelephonyEventBuilder {
        return this;
    }

    /**
     * Set and build phone status changed event.
     */
    public TelephonyEventBuilder setPhoneStatusChange(PhoneStatus phoneStatus) {
        mEvent.type = Type.PHONE_STATUS_CHANGED;
        mEvent.phoneStatus = phoneStatus;
    /** Set and build SIM state change event. */
    public TelephonyEventBuilder setSimStateChange(SparseArray<Integer> simStates) {
        int phoneCount = TelephonyManager.getDefault().getPhoneCount();
        mEvent.simState = new int[phoneCount];
        Arrays.fill(mEvent.simState, SimState.SIM_STATE_UNKNOWN);
        mEvent.type = Type.SIM_STATE_CHANGE;
        for (int i = 0; i < simStates.size(); i++) {
            int key = simStates.keyAt(i);
            if (0 <= key && key < phoneCount) {
                mEvent.simState[key] = simStates.get(key);
            }
        }
        return this;
    }

    /** Set and build subscription info change event. */
    public TelephonyEventBuilder setActiveSubscriptionInfoChange(ActiveSubscriptionInfo info) {
        mEvent.type = Type.ACTIVE_SUBSCRIPTION_INFO_CHANGE;
        mEvent.activeSubscriptionInfo = info;
        return this;
    }

    /** Set and build enabled modem bitmap change event. */
    public TelephonyEventBuilder setEnabledModemBitmap(int enabledModemBitmap) {
        mEvent.type = Type.ENABLED_MODEM_CHANGE;
        mEvent.enabledModemBitmap = enabledModemBitmap;
        return this;
    }

+60 −28
Original line number Diff line number Diff line
@@ -89,7 +89,6 @@ import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.Carrier
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.DataSwitch;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.ModemRestart;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.OnDemandDataSwitch;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.PhoneStatus;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilDeactivateDataCall;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilDeactivateDataCall.DeactivateReason;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilSetupDataCall;
@@ -600,7 +599,18 @@ public class TelephonyMetrics {
            addTelephonyEvent(event);
        }

        writePhoneStatusChangedEvent();
        for (int i = 0; i < mLastActiveSubscriptionInfos.size(); i++) {
            final int key = mLastActiveSubscriptionInfos.keyAt(i);
            TelephonyEvent event = new TelephonyEventBuilder(mStartElapsedTimeMs, key)
                    .setActiveSubscriptionInfoChange(mLastActiveSubscriptionInfos.get(key)).build();
            addTelephonyEvent(event);
        }

        addTelephonyEvent(new TelephonyEventBuilder(mStartElapsedTimeMs, -1 /* phoneId */)
                .setSimStateChange(mLastSimState).build());

        addTelephonyEvent(new TelephonyEventBuilder(mStartElapsedTimeMs, -1 /* phoneId */)
                .setEnabledModemBitmap(mLastEnabledModemBitmap).build());
    }

    /**
@@ -657,6 +667,16 @@ public class TelephonyMetrics {
        log.endTime = new TelephonyProto.Time();
        log.endTime.systemTimestampMillis = System.currentTimeMillis();
        log.endTime.elapsedTimestampMillis = SystemClock.elapsedRealtime();

        // Log the last active subscription information.
        ActiveSubscriptionInfo[] activeSubscriptionInfo =
                new ActiveSubscriptionInfo[mLastActiveSubscriptionInfos.size()];
        for (int i = 0; i < mLastActiveSubscriptionInfos.size(); i++) {
            int key = mLastActiveSubscriptionInfos.keyAt(i);
            activeSubscriptionInfo[key] = mLastActiveSubscriptionInfos.get(key);
        }
        log.activeSubscriptionInfo = activeSubscriptionInfo;

        return log;
    }

@@ -666,48 +686,50 @@ public class TelephonyMetrics {
        Integer lastSimState = mLastSimState.get(phoneId);
        if (lastSimState == null || !lastSimState.equals(state)) {
            mLastSimState.put(phoneId, state);
            writePhoneStatusChangedEvent();
            addTelephonyEvent(new TelephonyEventBuilder().setSimStateChange(mLastSimState).build());
        }
    }

    /** Update active subscription info list. */
    public void updateActiveSubscriptionInfoList(List<SubscriptionInfo> subInfos) {
        mLastActiveSubscriptionInfos.clear();
        List<Integer> inActivePhoneList = new ArrayList<>();
        for (int i = 0; i < mLastActiveSubscriptionInfos.size(); i++) {
            inActivePhoneList.add(mLastActiveSubscriptionInfos.keyAt(i));
        }

        for (SubscriptionInfo info : subInfos) {
            int phoneId = SubscriptionManager.getPhoneId(info.getSubscriptionId());
            inActivePhoneList.removeIf(value -> value.equals(phoneId));
            ActiveSubscriptionInfo activeSubscriptionInfo = new ActiveSubscriptionInfo();
            activeSubscriptionInfo.isOpportunistic = info.isOpportunistic();
            activeSubscriptionInfo.slotIndex = phoneId;
            activeSubscriptionInfo.isOpportunistic = info.isOpportunistic() ? 1 : 0;
            activeSubscriptionInfo.carrierId = info.getCarrierId();
            if (isDifferentSubscriptionInfo(
                    mLastActiveSubscriptionInfos.get(phoneId), activeSubscriptionInfo)) {
                addTelephonyEvent(new TelephonyEventBuilder(phoneId)
                        .setActiveSubscriptionInfoChange(activeSubscriptionInfo).build());

                mLastActiveSubscriptionInfos.put(phoneId, activeSubscriptionInfo);
            }
        }

        for (int phoneId : inActivePhoneList) {
            mLastActiveSubscriptionInfos.remove(phoneId);
            ActiveSubscriptionInfo invalidSubInfo = new ActiveSubscriptionInfo();
            invalidSubInfo.slotIndex = phoneId;
            invalidSubInfo.carrierId = -1;
            invalidSubInfo.isOpportunistic = -1;
            addTelephonyEvent(new TelephonyEventBuilder(phoneId)
                    .setActiveSubscriptionInfoChange(invalidSubInfo).build());
        }
    }

    /** Update the enabled modem bitmap. */
    public void updateEnabledModemBitmap(int enabledModemBitmap) {
        if (mLastEnabledModemBitmap == enabledModemBitmap) return;
        mLastEnabledModemBitmap = enabledModemBitmap;
        writePhoneStatusChangedEvent();
    }

    /** Write the event of phone status changed. */
    public void writePhoneStatusChangedEvent() {
        int phoneCount = TelephonyManager.getDefault().getPhoneCount();
        PhoneStatus phoneStatus = new PhoneStatus();
        phoneStatus.enabledModemBitmap = mLastEnabledModemBitmap;
        phoneStatus.simState = new int[phoneCount];
        Arrays.fill(phoneStatus.simState, SimState.SIM_STATE_ABSENT);
        for (int i = 0; i < mLastSimState.size(); i++) {
            int phoneId = mLastSimState.keyAt(i);
            if (SubscriptionManager.isValidPhoneId(phoneId)) {
                phoneStatus.simState[phoneId] = mLastSimState.get(phoneId);
            }
        }

        // Phone status is not associated with any phone id, so set the phone id to -1 for the phone
        // status changed event.
        addTelephonyEvent(new TelephonyEventBuilder(-1 /* phoneId */)
                .setPhoneStatusChange(phoneStatus)
                .build());
        addTelephonyEvent(new TelephonyEventBuilder()
                .setEnabledModemBitmap(mLastEnabledModemBitmap).build());
    }

    /**
@@ -2462,4 +2484,14 @@ public class TelephonyMetrics {
                return SimState.SIM_STATE_UNKNOWN;
        }
    }

    private static boolean isDifferentSubscriptionInfo(
            ActiveSubscriptionInfo oldInfo, ActiveSubscriptionInfo newInfo) {
        if (oldInfo == null || newInfo == null) {
            return oldInfo == newInfo;
        }

        return oldInfo.slotIndex != newInfo.slotIndex || oldInfo.carrierId != newInfo.carrierId
                || oldInfo.isOpportunistic != newInfo.isOpportunistic;
    }
}