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

Commit e41a0a98 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Adding simple radio service and callbacks."

parents 4fe8f7a7 c3242d22
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
+173 −77
Original line number Diff line number Diff line
@@ -32,6 +32,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;
@@ -59,6 +60,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.cdma.CdmaCallWaitingNotification;
import com.android.internal.telephony.cdma.CdmaInformationRecords;
import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
@@ -478,7 +484,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.
@@ -489,7 +495,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.
@@ -685,14 +691,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 {
@@ -737,8 +740,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
@@ -773,6 +776,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);
@@ -787,6 +812,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);
@@ -868,17 +899,36 @@ 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,
                mRILDefaultWorkSource);

        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,
@@ -2513,24 +2563,100 @@ 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
        }
    }

    /**
     * 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;

        /* 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;
        RILRequest rr;

            default:
                throw new RuntimeException(
                            "Unrecognized RIL_RadioState: " + stateInt);
        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,
                mRILDefaultWorkSource);
        msg = mSender.obtainMessage(RIL.EVENT_SEND_ACK, rr);
        acquireWakeLock(rr, RIL.FOR_ACK_WAKELOCK);
        msg.sendToTarget();
    }

    private WorkSource getDeafultWorkSourceIfInvalid(WorkSource workSource) {
@@ -2823,7 +2949,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;
@@ -3242,19 +3367,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);

@@ -3525,7 +3643,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;
                }

@@ -3860,38 +3978,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();
@@ -4704,29 +4790,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.