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

Commit 1bb5864a authored by Naveen Kalla's avatar Naveen Kalla
Browse files

Log Telephony Event on receiving RIL_UNSOL_MODEM_RESTART

RIL_UNSOL_MODEM_RESTART will be sent by vendor RILs when it detects
a modem restart along with the reason for restart which could be a
crash signature if the modem restarted due to a crash or a some
other string such as a user-initiated restart or AT command
initiated restart.

Test: Modified vendor RIL to send modem restart unsol message and
verified that the event is logged, added a test in TelephonyMetricsTest
and ensured all TelephonyMetricsTest tests pass

Change-Id: I6bc045341be59ac45cc2a8dd83bdbb3748352c0d
parent ea74a4a1
Loading
Loading
Loading
Loading
+11 −13
Original line number Diff line number Diff line
@@ -16,10 +16,10 @@

package com.android.internal.telephony;

import static com.android.internal.telephony.RILConstants.*;
import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;

import android.app.ActivityThread;
import static com.android.internal.telephony.RILConstants.*;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -38,11 +38,11 @@ import android.os.Parcel;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.os.SystemClock;
import android.os.WorkSource;
import android.telephony.ClientRequestStats;
import android.os.SystemProperties;
import android.os.WorkSource;
import android.service.carrier.CarrierIdentifier;
import android.telephony.CellInfo;
import android.telephony.ClientRequestStats;
import android.telephony.ModemActivityInfo;
import android.telephony.NeighboringCellInfo;
import android.telephony.PcoData;
@@ -60,7 +60,6 @@ import android.util.SparseArray;
import android.view.Display;

import com.android.internal.telephony.TelephonyProto.SmsSession;
import com.android.internal.telephony.TelephonyProto.TelephonySettings;
import com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
import com.android.internal.telephony.cdma.CdmaInformationRecords;
import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
@@ -76,12 +75,6 @@ import com.android.internal.telephony.uicc.IccCardStatus;
import com.android.internal.telephony.uicc.IccIoResult;
import com.android.internal.telephony.uicc.IccRefreshResponse;
import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
import com.android.internal.telephony.cdma.CdmaInformationRecords;
import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
import com.android.internal.telephony.dataconnection.DcFailCause;
import com.android.internal.telephony.dataconnection.DataCallResponse;
import com.android.internal.telephony.dataconnection.DataProfile;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
@@ -96,8 +89,6 @@ import java.util.List;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
import static com.android.internal.telephony.RILConstants.*;

/**
 * {@hide}
@@ -3245,6 +3236,7 @@ public final class RIL extends BaseCommands implements CommandsInterface {
            case RIL_UNSOL_STK_CC_ALPHA_NOTIFY: ret =  responseString(p); break;
            case RIL_UNSOL_LCEDATA_RECV: ret = responseLceData(p); break;
            case RIL_UNSOL_PCO_DATA: ret = responsePcoData(p); break;
            case RIL_UNSOL_MODEM_RESTART: ret = responseString(p); break;

            default:
                throw new RuntimeException("Unrecognized unsol response: " + response);
@@ -3691,6 +3683,11 @@ public final class RIL extends BaseCommands implements CommandsInterface {

                mPcoDataRegistrants.notifyRegistrants(new AsyncResult(null, ret, null));
                break;
            case RIL_UNSOL_MODEM_RESTART:
                if (RILJ_LOGD) unsljLogRet(response, ret);

                mMetrics.writeModemRestartEvent(mInstanceId, (String) ret);
                break;
        }
    }

@@ -4702,6 +4699,7 @@ public final class RIL extends BaseCommands implements CommandsInterface {
            case RIL_UNSOL_STK_CC_ALPHA_NOTIFY: return "UNSOL_STK_CC_ALPHA_NOTIFY";
            case RIL_UNSOL_LCEDATA_RECV: return "UNSOL_LCE_INFO_RECV";
            case RIL_UNSOL_PCO_DATA: return "UNSOL_PCO_DATA";
            case RIL_UNSOL_MODEM_RESTART: return "UNSOL_MODEM_RESTART";
            default: return "<unknown response>";
        }
    }
+9 −2
Original line number Diff line number Diff line
@@ -16,18 +16,19 @@

package com.android.internal.telephony.metrics;

import android.os.SystemClock;

import static com.android.internal.telephony.TelephonyProto.ImsCapabilities;
import static com.android.internal.telephony.TelephonyProto.ImsConnectionState;
import static com.android.internal.telephony.TelephonyProto.RilDataCall;
import static com.android.internal.telephony.TelephonyProto.TelephonyEvent;
import static com.android.internal.telephony.TelephonyProto.TelephonyEvent.ModemRestart;
import static com.android.internal.telephony.TelephonyProto.TelephonyEvent.RilDeactivateDataCall;
import static com.android.internal.telephony.TelephonyProto.TelephonyEvent.RilSetupDataCall;
import static com.android.internal.telephony.TelephonyProto.TelephonyEvent.RilSetupDataCallResponse;
import static com.android.internal.telephony.TelephonyProto.TelephonyServiceState;
import static com.android.internal.telephony.TelephonyProto.TelephonySettings;

import android.os.SystemClock;

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

@@ -109,4 +110,10 @@ public class TelephonyEventBuilder {
        mEvent.setNitzTimestampMillis(timestamp);
        return this;
    }

    public TelephonyEventBuilder setModemRestart(ModemRestart modemRestart) {
        mEvent.setType(TelephonyEvent.Type.MODEM_RESTART);
        mEvent.modemRestart = modemRestart;
        return this;
    }
}
+40 −19
Original line number Diff line number Diff line
@@ -16,6 +16,27 @@

package com.android.internal.telephony.metrics;

import static android.text.format.DateUtils.MINUTE_IN_MILLIS;

import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ANSWER;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SEND_SMS;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEACTIVATE_DATA_CALL;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DIAL;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP;
import static com.android.internal.telephony.RILConstants
        .RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IMS_SEND_SMS;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS_EXPECT_MORE;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SETUP_DATA_CALL;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_IP;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_IPV4V6;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_IPV6;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_PPP;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_UNKNOWN;

import android.os.Build;
import android.os.SystemClock;
import android.telephony.Rlog;
import android.telephony.ServiceState;
@@ -37,10 +58,12 @@ import com.android.internal.telephony.TelephonyProto.RilDataCall;
import com.android.internal.telephony.TelephonyProto.SmsSession;
import com.android.internal.telephony.TelephonyProto.TelephonyCallSession;
import com.android.internal.telephony.TelephonyProto.TelephonyEvent;
import com.android.internal.telephony.TelephonyProto.TelephonyEvent.ModemRestart;
import com.android.internal.telephony.TelephonyProto.TelephonyEvent.RilDeactivateDataCall;
import com.android.internal.telephony.TelephonyProto.TelephonyEvent.RilSetupDataCall;
import com.android.internal.telephony.TelephonyProto.TelephonyEvent.RilSetupDataCallResponse;
import com.android.internal.telephony.TelephonyProto.TelephonyEvent.RilSetupDataCallResponse.RilDataCallFailCause;
import com.android.internal.telephony.TelephonyProto.TelephonyEvent.RilSetupDataCallResponse
        .RilDataCallFailCause;
import com.android.internal.telephony.TelephonyProto.TelephonyLog;
import com.android.internal.telephony.TelephonyProto.TelephonyServiceState;
import com.android.internal.telephony.TelephonyProto.TelephonySettings;
@@ -57,24 +80,6 @@ import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ANSWER;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SEND_SMS;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEACTIVATE_DATA_CALL;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DIAL;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IMS_SEND_SMS;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS_EXPECT_MORE;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SETUP_DATA_CALL;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_IP;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_IPV4V6;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_IPV6;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_PPP;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_UNKNOWN;

/**
 * Telephony metrics holds all metrics events and convert it into telephony proto buf.
 * @hide
@@ -1520,6 +1525,22 @@ public class TelephonyMetrics {
                        .setNITZ(timestamp));
    }

    /**
     * Write Modem Restart event
     *
     * @param phoneId Phone id
     * @param reason Reason for the modem reset.
     */
    public void writeModemRestartEvent(int phoneId, String reason) {
        final ModemRestart modemRestart = new ModemRestart();
        String basebandVersion = Build.getRadioVersion();
        if (basebandVersion != null) modemRestart.setBasebandVersion(basebandVersion);
        if (reason != null) modemRestart.setReason(reason);
        TelephonyEvent event = new TelephonyEventBuilder(phoneId).setModemRestart(
                modemRestart).build();
        addTelephonyEvent(event);
    }

    //TODO: Expand the proto in the future
    public void writeOnImsCallProgressing(int phoneId, ImsCallSession session) {}
    public void writeOnImsCallStarted(int phoneId, ImsCallSession session) {}
+30 −13
Original line number Diff line number Diff line
@@ -16,6 +16,20 @@

package com.android.internal.telephony.metrics;

import static android.telephony.ServiceState.RIL_RADIO_TECHNOLOGY_LTE;
import static android.telephony.ServiceState.ROAMING_TYPE_DOMESTIC;

import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEACTIVATE_DATA_CALL;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SETUP_DATA_CALL;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_IPV4V6;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;

import android.telephony.ServiceState;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Base64;
@@ -28,8 +42,8 @@ import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.SmsResponse;
import com.android.internal.telephony.TelephonyProto;
import com.android.internal.telephony.TelephonyProto.ImsConnectionState;
import com.android.internal.telephony.TelephonyProto.SmsSession;
import com.android.internal.telephony.TelephonyProto.RadioAccessTechnology;
import com.android.internal.telephony.TelephonyProto.SmsSession;
import com.android.internal.telephony.TelephonyProto.TelephonyCallSession;
import com.android.internal.telephony.TelephonyProto.TelephonyCallSession.Event.CallState;
import com.android.internal.telephony.TelephonyProto.TelephonyCallSession.Event.ImsCommand;
@@ -48,18 +62,6 @@ import org.mockito.Mock;

import java.lang.reflect.Method;

import static android.telephony.ServiceState.RIL_RADIO_TECHNOLOGY_LTE;
import static android.telephony.ServiceState.ROAMING_TYPE_DOMESTIC;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEACTIVATE_DATA_CALL;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SETUP_DATA_CALL;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_IPV4V6;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;

public class TelephonyMetricsTest extends TelephonyTest {

    @Mock
@@ -153,6 +155,21 @@ public class TelephonyMetricsTest extends TelephonyTest {
        assertEquals(3, log.events[0].getDataStallAction());
    }

    // Test write modem restart event
    @Test
    @SmallTest
    public void testModemRestartEvent() throws Exception {
        mMetrics.writeModemRestartEvent(mPhone.getPhoneId(), "Test");
        TelephonyLog log = buildProto();

        assertEquals(1, log.events.length);
        assertEquals(0, log.callSessions.length);
        assertEquals(0, log.smsSessions.length);
        assertTrue(log.events[0].hasPhoneId());
        assertEquals(mPhone.getPhoneId(), log.events[0].getPhoneId());
        assertEquals("Test", log.events[0].modemRestart.getReason());
    }

    // Test write on IMS call start
    @Test
    @SmallTest