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

Commit 246295a9 authored by Amit Mahajan's avatar Amit Mahajan
Browse files

Adding simple radio service and callbacks.

Test: Sanity tests by telephony test team.
Bug: 32020264
Change-Id: I70552a681006ec46c901bdafb9d346c559ba5ec9
parent f7d420da
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src/java) \
	$(call all-proto-files-under, proto)

LOCAL_JAVA_LIBRARIES := voip-common ims-common
LOCAL_STATIC_JAVA_LIBRARIES := android.hardware.radio@1.0-java-static
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := telephony-common
LOCAL_PROTOC_OPTIMIZE_TYPE := nano
+172 −77
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.os.AsyncResult;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.HwBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Parcel;
@@ -53,6 +54,11 @@ import android.text.TextUtils;
import android.util.SparseArray;
import android.view.Display;

import android.hardware.radio.V1_0.IRadio;
import android.hardware.radio.V1_0.RadioIndicationType;
import android.hardware.radio.V1_0.RadioResponseInfo;
import android.hardware.radio.V1_0.RadioResponseType;

import com.android.internal.telephony.TelephonyProto.SmsSession;
import com.android.internal.telephony.TelephonyProto.TelephonySettings;
import com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
@@ -445,7 +451,7 @@ public final class RIL extends BaseCommands implements CommandsInterface {
                            return;
                        }
                    } catch (IOException ex) {
                        Rlog.e(RILJ_LOG_TAG, "IOException", ex);
                        riljLoge("IOException ", ex);
                        req = findAndRemoveRequestFromList(rr.mSerial);
                        // make sure this request has not already been handled,
                        // eg, if RILReceiver cleared the list.
@@ -456,7 +462,7 @@ public final class RIL extends BaseCommands implements CommandsInterface {
                            return;
                        }
                    } catch (RuntimeException exc) {
                        Rlog.e(RILJ_LOG_TAG, "Uncaught exception ", exc);
                        riljLoge("Uncaught exception ", exc);
                        req = findAndRemoveRequestFromList(rr.mSerial);
                        // make sure this request has not already been handled,
                        // eg, if RILReceiver cleared the list.
@@ -652,14 +658,11 @@ public final class RIL extends BaseCommands implements CommandsInterface {
                    // or after the 8th time

                    if (retryCount == 8) {
                        Rlog.e (RILJ_LOG_TAG,
                            "Couldn't find '" + rilSocket
                            + "' socket after " + retryCount
                            + " times, continuing to retry silently");
                        riljLoge("Couldn't find '" + rilSocket + "' socket after " + retryCount +
                                " times, continuing to retry silently");
                    } else if (retryCount >= 0 && retryCount < 8) {
                        Rlog.i (RILJ_LOG_TAG,
                            "Couldn't find '" + rilSocket
                            + "' socket; retrying after timeout");
                        Rlog.i (RILJ_LOG_TAG, "Couldn't find '" + rilSocket +
                                "' socket; retrying after timeout");
                    }

                    try {
@@ -704,8 +707,8 @@ public final class RIL extends BaseCommands implements CommandsInterface {
                    Rlog.i(RILJ_LOG_TAG, "'" + rilSocket + "' socket closed",
                          ex);
                } catch (Throwable tr) {
                    Rlog.e(RILJ_LOG_TAG, "Uncaught exception read length=" + length +
                        "Exception:" + tr.toString());
                    riljLoge("Uncaught exception read length=" + length + "Exception:" +
                            tr.toString());
                }

                Rlog.i(RILJ_LOG_TAG, "(" + mInstanceId + ") Disconnected from '" + rilSocket
@@ -740,6 +743,28 @@ public final class RIL extends BaseCommands implements CommandsInterface {
        this(context, preferredNetworkType, cdmaSubscription, null);
    }



    RadioResponse mRadioResponse;
    RadioIndication mRadioIndication;

    private IRadio getRadioProxy() {
        IRadio radioProxy = null;
        try {
            radioProxy = IRadio.getService(SOCKET_NAME_RIL[mInstanceId == null ? 0 : mInstanceId]);
            if (radioProxy != null) {
                riljLog("getRadioProxy: radioProxy != null; calling setResponseFunctions()");
                // todo(b/31632518): should not need to be called every time
                radioProxy.setResponseFunctions(mRadioResponse, mRadioIndication);
            } else {
                riljLoge("getRadioProxy: radioProxy == null");
            }
        } catch (Exception e) {
            riljLoge("getRadioProxy: exception", e);
        }
        return radioProxy;
    }

    public RIL(Context context, int preferredNetworkType,
            int cdmaSubscription, Integer instanceId) {
        super(context);
@@ -754,6 +779,12 @@ public final class RIL extends BaseCommands implements CommandsInterface {
        mPhoneType = RILConstants.NO_PHONE;
        mInstanceId = instanceId;

        riljLog("RIL: creating mRadioResponse on initialization");
        mRadioResponse = new RadioResponse(this);
        mRadioIndication = new RadioIndication(this);
        // set radio callback; needed to set RadioIndication callback
        getRadioProxy();

        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, RILJ_LOG_TAG);
        mWakeLock.setReferenceCounted(false);
@@ -832,16 +863,35 @@ public final class RIL extends BaseCommands implements CommandsInterface {
        }
    }

    private void addRequest(RILRequest rr) {
        acquireWakeLock(rr, FOR_WAKELOCK);
        synchronized (mRequestList) {
            mRequestList.append(rr.mSerial, rr);
        }
    }

    @Override
    public void
    getIccCardStatus(Message result) {
        //Note: This RIL request has not been renamed to ICC,
        //       but this request is also valid for SIM and RUIM
        RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_SIM_STATUS, result);

        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));

        send(rr);
        IRadio radioProxy = getRadioProxy();
        if (radioProxy != null) {
            addRequest(rr);
            try {
                radioProxy.getIccCardStatus(rr.mSerial);
            } catch (Exception e) {
                riljLoge("getIccCardStatus", e);
                rr.onError(RADIO_NOT_AVAILABLE, null);
                decrementWakeLock(rr);
                rr.release();
            }
        } else {
            rr.onError(RADIO_NOT_AVAILABLE, null);
            rr.release();
        }
    }

    public void setUiccSubscription(int slotId, int appIndex, int subId,
@@ -2438,24 +2488,99 @@ public final class RIL extends BaseCommands implements CommandsInterface {
        updateScreenState(false);
    }

    private RadioState getRadioStateFromInt(int stateInt) {
        RadioState state;
    /**
     * This is a helper function to be called when a RadioIndication callback is called.
     * It takes care of acquiring wakelock and sending ack if needed.
     * @param indicationType RadioIndicationType received
     */
    void processIndication(int indicationType) {
        if (indicationType == RadioIndicationType.UNSOLICITED_ACK_EXP) {
            sendAck();
            if (RIL.RILJ_LOGD) riljLog("Unsol response received; Sending ack to ril.cpp");
        } else {
            // ack sent for UNSOLICITED_ACK_EXP; nothing to do for UNSOLICITED
        }
    }

        /* RIL_RadioState ril.h */
        switch(stateInt) {
            case 0: state = RadioState.RADIO_OFF; break;
            case 1: state = RadioState.RADIO_UNAVAILABLE; break;
            case 10: state = RadioState.RADIO_ON; break;
    /**
     * This is a helper function to be called when a RadioResponse callback is called.
     * It takes care of acks, wakelocks, and finds and returns RILRequest corresponding to the
     * response if one is found.
     * @param responseInfo RadioResponseInfo received in response callback
     * @return RILRequest corresponding to the response
     */
    RILRequest processResponse(RadioResponseInfo responseInfo) {
        int serial = responseInfo.serial;
        int error = responseInfo.error;
        int type = responseInfo.type;

            default:
                throw new RuntimeException(
                            "Unrecognized RIL_RadioState: " + stateInt);
        RILRequest rr;

        if (type == RadioResponseType.SOLICITED_ACK) {
            synchronized (mRequestList) {
                rr = mRequestList.get(serial);
            }
            if (rr == null) {
                Rlog.w(RIL.RILJ_LOG_TAG, "processResponse: Unexpected solicited ack response! " +
                        "sn: " + serial);
            } else {
                decrementWakeLock(rr);
                if (RIL.RILJ_LOGD) {
                    riljLog(rr.serialString() + " Ack < " + RIL.requestToString(rr.mRequest));
                }
            }
        } else {
            rr = findAndRemoveRequestFromList(serial);

            if (rr == null) {
                Rlog.w(RIL.RILJ_LOG_TAG, "processResponse: Unexpected response! sn: " + serial +
                        " error: " + error);
                return null;
            }

            if (type == RadioResponseType.SOLICITED_ACK_EXP) {
                sendAck();
                if (RIL.RILJ_LOGD) {
                    riljLog("Response received for " + rr.serialString() + " " +
                            RIL.requestToString(rr.mRequest) + " Sending ack to ril.cpp");
                }
            } else {
                // ack sent for SOLICITED_ACK_EXP above; nothing to do for SOLICITED
            }
        return state;
        }

    private void switchToRadioState(RadioState newState) {
        setRadioState(newState);
        return rr;
    }

    /**
     * This is a helper function to be called at the end of all RadioResponse callbacks.
     * It takes care of logging, decrementing wakelock if needed, and releases the request from
     * memory pool.
     * @param rr RILRequest for which response callback was called
     * @param responseInfo RadioResponseInfo received in the callback
     * @param ret object to be returned to request sender
     */
    void processResponseDone(RILRequest rr, RadioResponseInfo responseInfo, Object ret) {
        mMetrics.writeOnRilSolicitedResponse(mInstanceId, rr.mSerial, responseInfo.error,
                rr.mRequest, ret);
        if (rr != null) {
            if (responseInfo.type == RadioResponseType.SOLICITED) {
                decrementWakeLock(rr);
            }
            rr.release();
        }
    }

    /**
     * Function to send ack and acquire related wakelock
     */
    private void sendAck() {
        // todo: use IRadio.sendAck() instead when it's available
        Message msg;
        RILRequest rr = RILRequest.obtain(RIL_RESPONSE_ACKNOWLEDGEMENT, null);
        msg = mSender.obtainMessage(RIL.EVENT_SEND_ACK, rr);
        acquireWakeLock(rr, RIL.FOR_ACK_WAKELOCK);
        msg.sendToTarget();
    }

    /**
@@ -2703,7 +2828,6 @@ public final class RIL extends BaseCommands implements CommandsInterface {
 | egrep "^ *{RIL_" \
 | sed -re 's/\{([^,]+),[^,]+,([^}]+).+/case \1: ret = \2(p); break;/'
             */
            case RIL_REQUEST_GET_SIM_STATUS: ret =  responseIccCardStatus(p); break;
            case RIL_REQUEST_ENTER_SIM_PIN: ret =  responseInts(p); break;
            case RIL_REQUEST_ENTER_SIM_PUK: ret =  responseInts(p); break;
            case RIL_REQUEST_ENTER_SIM_PIN2: ret =  responseInts(p); break;
@@ -3120,19 +3244,12 @@ public final class RIL extends BaseCommands implements CommandsInterface {
                throw new RuntimeException("Unrecognized unsol response: " + response);
            //break; (implied)
        }} catch (Throwable tr) {
            Rlog.e(RILJ_LOG_TAG, "Exception processing unsol response: " + response +
                "Exception:" + tr.toString());
            riljLoge("Exception processing unsol response: " + response + "Exception:" +
                    tr.toString());
            return;
        }

        switch(response) {
            case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
                /* has bonus radio state int */
                RadioState newState = getRadioStateFromInt(p.readInt());
                if (RILJ_LOGD) unsljLogMore(response, newState.toString());

                switchToRadioState(newState);
            break;
            case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
                if (RILJ_LOGD) unsljLog(response);

@@ -3403,7 +3520,7 @@ public final class RIL extends BaseCommands implements CommandsInterface {
                try {
                    listInfoRecs = (ArrayList<CdmaInformationRecords>)ret;
                } catch (ClassCastException e) {
                    Rlog.e(RILJ_LOG_TAG, "Unexpected exception casting to listInfoRecs", e);
                    riljLoge("Unexpected exception casting to listInfoRecs", e);
                    break;
                }

@@ -3733,38 +3850,6 @@ public final class RIL extends BaseCommands implements CommandsInterface {
                ? android.util.Base64.decode(s, android.util.Base64.DEFAULT) : (byte[]) null);
    }

    private Object
    responseIccCardStatus(Parcel p) {
        IccCardApplicationStatus appStatus;

        IccCardStatus cardStatus = new IccCardStatus();
        cardStatus.setCardState(p.readInt());
        cardStatus.setUniversalPinState(p.readInt());
        cardStatus.mGsmUmtsSubscriptionAppIndex = p.readInt();
        cardStatus.mCdmaSubscriptionAppIndex = p.readInt();
        cardStatus.mImsSubscriptionAppIndex = p.readInt();
        int numApplications = p.readInt();

        // limit to maximum allowed applications
        if (numApplications > IccCardStatus.CARD_MAX_APPS) {
            numApplications = IccCardStatus.CARD_MAX_APPS;
        }
        cardStatus.mApplications = new IccCardApplicationStatus[numApplications];
        for (int i = 0 ; i < numApplications ; i++) {
            appStatus = new IccCardApplicationStatus();
            appStatus.app_type       = appStatus.AppTypeFromRILInt(p.readInt());
            appStatus.app_state      = appStatus.AppStateFromRILInt(p.readInt());
            appStatus.perso_substate = appStatus.PersoSubstateFromRILInt(p.readInt());
            appStatus.aid            = p.readString();
            appStatus.app_label      = p.readString();
            appStatus.pin1_replaced  = p.readInt();
            appStatus.pin1           = appStatus.PinStateFromRILInt(p.readInt());
            appStatus.pin2           = appStatus.PinStateFromRILInt(p.readInt());
            cardStatus.mApplications[i] = appStatus;
        }
        return cardStatus;
    }

    private Object
    responseSimRefresh(Parcel p) {
        IccRefreshResponse response = new IccRefreshResponse();
@@ -4576,29 +4661,39 @@ public final class RIL extends BaseCommands implements CommandsInterface {
        }
    }

    private void riljLog(String msg) {
    void riljLog(String msg) {
        Rlog.d(RILJ_LOG_TAG, msg
                + (mInstanceId != null ? (" [SUB" + mInstanceId + "]") : ""));
    }

    private void riljLogv(String msg) {
    void riljLoge(String msg) {
        Rlog.e(RILJ_LOG_TAG, msg
                + (mInstanceId != null ? (" [SUB" + mInstanceId + "]") : ""));
    }

    void riljLoge(String msg, Exception e) {
        Rlog.e(RILJ_LOG_TAG, msg
                + (mInstanceId != null ? (" [SUB" + mInstanceId + "]") : ""), e);
    }

    void riljLogv(String msg) {
        Rlog.v(RILJ_LOG_TAG, msg
                + (mInstanceId != null ? (" [SUB" + mInstanceId + "]") : ""));
    }

    private void unsljLog(int response) {
    void unsljLog(int response) {
        riljLog("[UNSL]< " + responseToString(response));
    }

    private void unsljLogMore(int response, String more) {
    void unsljLogMore(int response, String more) {
        riljLog("[UNSL]< " + responseToString(response) + " " + more);
    }

    private void unsljLogRet(int response, Object ret) {
    void unsljLogRet(int response, Object ret) {
        riljLog("[UNSL]< " + responseToString(response) + " " + retToString(response, ret));
    }

    private void unsljLogvRet(int response, Object ret) {
    void unsljLogvRet(int response, Object ret) {
        riljLogv("[UNSL]< " + responseToString(response) + " " + retToString(response, ret));
    }

+167 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.internal.telephony;

import android.hardware.radio.V1_0.IRadioIndication;
import android.hardware.radio.V1_0.RadioIndicationType;
import android.hardware.radio.V1_0.SetupDataCallResult;
import android.hardware.radio.V1_0.SuppSvcNotification;
import android.hardware.radio.V1_0.SimRefreshResult;
import android.hardware.radio.V1_0.CdmaSignalInfoRecord;
import android.hardware.radio.V1_0.CdmaSmsMessage;
import android.hardware.radio.V1_0.CdmaCallWaiting;
import android.hardware.radio.V1_0.StkCcUnsolSsResult;
import android.hardware.radio.V1_0.LceDataInfo;
import android.hardware.radio.V1_0.PcoDataInfo;
import android.os.Message;

import java.util.ArrayList;
import static com.android.internal.telephony.RILConstants.*;

public class RadioIndication extends IRadioIndication.Stub {
    RIL mRil;

    RadioIndication(RIL ril) {
        mRil = ril;
    }

    /**
     * Indicates when radio state changes.
     * @param indicationType RadioIndicationType
     * @param radioState android.hardware.radio.V1_0.RadioState
     */
    public void radioStateChanged(int indicationType, int radioState) {
        mRil.processIndication(indicationType);
        CommandsInterface.RadioState newState = getRadioStateFromInt(radioState);
        mRil.riljLog("radioStateChanged: " + newState.toString());
        mRil.setRadioState(newState);
    }

    public void callStateChanged(int var1) {}

    public void voiceNetworkStateChanged(int var1) {}

    public void newSms(int var1, ArrayList<Byte> var2) {}

    public void newSmsStatusReport(int var1, ArrayList<Byte> var2) {}

    public void newSmsOnSim(int var1, int var2) {}

    public void onUssd(int var1, int var2, String var3) {}

    public void nitzTimeReceived(int var1, String var2, long var3) {}

    public void currentSignalStrength(int var1,
                                      android.hardware.radio.V1_0.SignalStrength var2) {}

    public void dataCallListChanged(int var1, ArrayList<SetupDataCallResult> var2) {}

    public void suppSvcNotify(int var1, SuppSvcNotification var2) {}

    public void stkSessionEnd(int var1) {}

    public void stkProactiveCommand(int var1, String var2) {}

    public void stkEventNotify(int var1, String var2) {}

    public void stkCallSetup(int var1, long var2) {}

    public void simSmsStorageFull(int var1) {}

    public void simRefresh(int var1, SimRefreshResult var2) {}

    public void callRing(int var1, boolean var2, CdmaSignalInfoRecord var3) {}

    public void simStatusChanged(int var1) {}

    public void cdmaNewSms(int var1, CdmaSmsMessage var2) {}

    public void newBroadcastSms(int var1, ArrayList<Byte> var2) {}

    public void cdmaRuimSmsStorageFull(int var1) {}

    public void restrictedStateChanged(int var1, int var2) {}

    public void enterEmergencyCallbackMode(int var1) {}

    public void cdmaCallWaiting(int var1, CdmaCallWaiting var2) {}

    public void cdmaOtaProvisionStatus(int var1, int var2) {}

    public void cdmaInfoRec(int var1,
                            android.hardware.radio.V1_0.CdmaInformationRecords var2) {}

    public void oemHookRaw(int var1, ArrayList<Byte> var2) {}

    public void indicateRingbackTone(int var1, boolean var2) {}

    public void resendIncallMute(int var1) {}

    public void cdmaSubscriptionSourceChanged(int var1, int var2) {}

    public void cdmaPrlChanged(int var1, int var2) {}

    public void exitEmergencyCallbackMode(int var1) {}

    public void rilConnected(int var1) {}

    public void voiceRadioTechChanged(int var1, int var2) {}

    public void cellInfoList(int var1, ArrayList<android.hardware.radio.V1_0.CellInfo> var2) {}

    public void imsNetworkStateChanged(int var1) {}

    public void subscriptionStatusChanged(int var1, boolean var2) {}

    public void srvccStateNotify(int var1, int var2) {}

    public void hardwareConfigChanged(
            int var1,
            ArrayList<android.hardware.radio.V1_0.HardwareConfig> var2) {}

    public void radioCapabilityIndication(int var1,
                                          android.hardware.radio.V1_0.RadioCapability var2) {}

    public void onSupplementaryServiceIndication(int var1, StkCcUnsolSsResult var2) {}

    public void stkCallControlAlphaNotify(int var1, String var2) {}

    public void lceData(int var1, LceDataInfo var2) {}

    public void pcoData(int var1, PcoDataInfo var2) {}

    public void modemReset(int var1, String var2) {}

    private CommandsInterface.RadioState getRadioStateFromInt(int stateInt) {
        CommandsInterface.RadioState state;

        switch(stateInt) {
            case android.hardware.radio.V1_0.RadioState.OFF:
                state = CommandsInterface.RadioState.RADIO_OFF;
                break;
            case android.hardware.radio.V1_0.RadioState.UNAVAILABLE:
                state = CommandsInterface.RadioState.RADIO_UNAVAILABLE;
                break;
            case android.hardware.radio.V1_0.RadioState.ON:
                state = CommandsInterface.RadioState.RADIO_ON;
                break;
            default:
                throw new RuntimeException("Unrecognized RadioState: " + stateInt);
        }
        return state;
    }
}
 No newline at end of file
+427 −0

File added.

Preview size limit exceeded, changes collapsed.