| /* |
| * Copyright (C) 2021 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.os.RemoteException; |
| import android.telephony.Rlog; |
| |
| /** |
| * A holder for IRadioModem. |
| * Use getAidl to get IRadioModem and call the AIDL implementations of the HAL APIs. |
| */ |
| public class RadioModemProxy extends RadioServiceProxy { |
| private static final String TAG = "RadioModemProxy"; |
| private volatile android.hardware.radio.modem.IRadioModem mModemProxy = null; |
| |
| /** |
| * Set IRadioModem as the AIDL implementation for RadioServiceProxy |
| * @param halVersion Radio HAL version |
| * @param modem IRadioModem implementation |
| * |
| * @return updated HAL version |
| */ |
| public HalVersion setAidl(HalVersion halVersion, |
| android.hardware.radio.modem.IRadioModem modem) { |
| HalVersion version = halVersion; |
| try { |
| version = RIL.getServiceHalVersion(modem.getInterfaceVersion()); |
| } catch (RemoteException e) { |
| Rlog.e(TAG, "setAidl: " + e); |
| } |
| mHalVersion = version; |
| mModemProxy = modem; |
| mIsAidl = true; |
| |
| Rlog.d(TAG, "AIDL initialized mHalVersion=" + mHalVersion); |
| return mHalVersion; |
| } |
| |
| /** |
| * Get the AIDL implementation of RadioModemProxy |
| * @return IRadioModem implementation |
| */ |
| public android.hardware.radio.modem.IRadioModem getAidl() { |
| return mModemProxy; |
| } |
| |
| /** |
| * Reset RadioModemProxy |
| */ |
| @Override |
| public void clear() { |
| super.clear(); |
| mModemProxy = null; |
| } |
| |
| /** |
| * Check whether a RadioModem implementation exists |
| * @return true if there is neither a HIDL nor AIDL implementation |
| */ |
| @Override |
| public boolean isEmpty() { |
| return mRadioProxy == null && mModemProxy == null; |
| } |
| |
| /** |
| * Call IRadioModem#enableModem |
| * @param serial Serial number of request |
| * @param on Whether to enable or disable the modem |
| * @throws RemoteException |
| */ |
| public void enableModem(int serial, boolean on) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.enableModem(serial, on); |
| } else { |
| mRadioProxy.enableModem(serial, on); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#getBasebandVersion |
| * @param serial Serial number of request |
| * @throws RemoteException |
| */ |
| public void getBasebandVersion(int serial) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.getBasebandVersion(serial); |
| } else { |
| mRadioProxy.getBasebandVersion(serial); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#getDeviceIdentity |
| * @param serial Serial number of request |
| * @throws RemoteException |
| */ |
| public void getDeviceIdentity(int serial) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.getDeviceIdentity(serial); |
| } else { |
| mRadioProxy.getDeviceIdentity(serial); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#getImei |
| * |
| * @param serial Serial number of request |
| * @throws RemoteException |
| */ |
| public void getImei(int serial) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.getImei(serial); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#getHardwareConfig |
| * @param serial Serial number of request |
| * @throws RemoteException |
| */ |
| public void getHardwareConfig(int serial) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.getHardwareConfig(serial); |
| } else { |
| mRadioProxy.getHardwareConfig(serial); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#getModemActivityInfo |
| * @param serial Serial number of request |
| * @throws RemoteException |
| */ |
| public void getModemActivityInfo(int serial) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.getModemActivityInfo(serial); |
| } else { |
| mRadioProxy.getModemActivityInfo(serial); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#getModemStackStatus |
| * @param serial Serial number of request |
| * @throws RemoteException |
| */ |
| public void getModemStackStatus(int serial) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.getModemStackStatus(serial); |
| } else { |
| mRadioProxy.getModemStackStatus(serial); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#getRadioCapability |
| * @param serial Serial number of request |
| * @throws RemoteException |
| */ |
| public void getRadioCapability(int serial) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.getRadioCapability(serial); |
| } else { |
| mRadioProxy.getRadioCapability(serial); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#nvReadItem |
| * @param serial Serial number of request |
| * @param itemId ID of the item to read |
| * @throws RemoteException |
| */ |
| public void nvReadItem(int serial, int itemId) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.nvReadItem(serial, itemId); |
| } else { |
| mRadioProxy.nvReadItem(serial, itemId); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#nvResetConfig |
| * @param serial Serial number of request |
| * @param resetType Reset type; 1: reload NV reset, 2: erase NV reset, 3: factory NV reset |
| * @throws RemoteException |
| */ |
| public void nvResetConfig(int serial, int resetType) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.nvResetConfig(serial, RILUtils.convertToHalResetNvTypeAidl(resetType)); |
| } else { |
| mRadioProxy.nvResetConfig(serial, RILUtils.convertToHalResetNvType(resetType)); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#nvWriteCdmaPrl |
| * @param serial Serial number of request |
| * @param prl Preferred roaming list as a byte array |
| * @throws RemoteException |
| */ |
| public void nvWriteCdmaPrl(int serial, byte[] prl) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.nvWriteCdmaPrl(serial, prl); |
| } else { |
| mRadioProxy.nvWriteCdmaPrl(serial, RILUtils.primitiveArrayToArrayList(prl)); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#nvWriteItem |
| * @param serial Serial number of request |
| * @param itemId ID of the item to write |
| * @param itemValue Value to write as a String |
| * @throws RemoteException |
| */ |
| public void nvWriteItem(int serial, int itemId, String itemValue) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| android.hardware.radio.modem.NvWriteItem item = |
| new android.hardware.radio.modem.NvWriteItem(); |
| item.itemId = itemId; |
| item.value = itemValue; |
| mModemProxy.nvWriteItem(serial, item); |
| } else { |
| android.hardware.radio.V1_0.NvWriteItem item = |
| new android.hardware.radio.V1_0.NvWriteItem(); |
| item.itemId = itemId; |
| item.value = itemValue; |
| mRadioProxy.nvWriteItem(serial, item); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#requestShutdown |
| * @param serial Serial number of request |
| * @throws RemoteException |
| */ |
| public void requestShutdown(int serial) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.requestShutdown(serial); |
| } else { |
| mRadioProxy.requestShutdown(serial); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#responseAcknowledgement |
| * @throws RemoteException |
| */ |
| @Override |
| public void responseAcknowledgement() throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.responseAcknowledgement(); |
| } else { |
| mRadioProxy.responseAcknowledgement(); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#sendDeviceState |
| * @param serial Serial number of request |
| * @param deviceStateType Device state type |
| * @param state True if enabled and false if disabled |
| * @throws RemoteException |
| */ |
| public void sendDeviceState(int serial, int deviceStateType, boolean state) |
| throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.sendDeviceState(serial, deviceStateType, state); |
| } else { |
| mRadioProxy.sendDeviceState(serial, deviceStateType, state); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#setRadioCapability |
| * @param serial Serial number of request |
| * @param rc The phone radio capability defined in RadioCapability |
| * It's a input object used to transfer parameter to logic modem |
| * @throws RemoteException |
| */ |
| public void setRadioCapability(int serial, RadioCapability rc) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| android.hardware.radio.modem.RadioCapability halRc = |
| new android.hardware.radio.modem.RadioCapability(); |
| halRc.session = rc.getSession(); |
| halRc.phase = rc.getPhase(); |
| halRc.raf = rc.getRadioAccessFamily(); |
| halRc.logicalModemUuid = RILUtils.convertNullToEmptyString(rc.getLogicalModemUuid()); |
| halRc.status = rc.getStatus(); |
| mModemProxy.setRadioCapability(serial, halRc); |
| } else { |
| android.hardware.radio.V1_0.RadioCapability halRc = |
| new android.hardware.radio.V1_0.RadioCapability(); |
| halRc.session = rc.getSession(); |
| halRc.phase = rc.getPhase(); |
| halRc.raf = rc.getRadioAccessFamily(); |
| halRc.logicalModemUuid = RILUtils.convertNullToEmptyString(rc.getLogicalModemUuid()); |
| halRc.status = rc.getStatus(); |
| mRadioProxy.setRadioCapability(serial, halRc); |
| } |
| } |
| |
| /** |
| * Call IRadioModem#setRadioPower |
| * @param serial Serial number of request |
| * @param powerOn True to turn on radio and false to turn off |
| * @param forEmergencyCall Indicates that this request is due to emergency call |
| * No effect if powerOn is false |
| * @param preferredForEmergencyCall Whether or not the following emergency call will be sent |
| * on this modem |
| * No effect if powerOn or forEmergencyCall is false |
| * @throws RemoteException |
| */ |
| public void setRadioPower(int serial, boolean powerOn, boolean forEmergencyCall, |
| boolean preferredForEmergencyCall) throws RemoteException { |
| if (isEmpty()) return; |
| if (isAidl()) { |
| mModemProxy.setRadioPower(serial, powerOn, forEmergencyCall, preferredForEmergencyCall); |
| } else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6)) { |
| ((android.hardware.radio.V1_6.IRadio) mRadioProxy).setRadioPower_1_6(serial, powerOn, |
| forEmergencyCall, preferredForEmergencyCall); |
| } else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5)) { |
| ((android.hardware.radio.V1_5.IRadio) mRadioProxy).setRadioPower_1_5(serial, powerOn, |
| forEmergencyCall, preferredForEmergencyCall); |
| } else { |
| mRadioProxy.setRadioPower(serial, powerOn); |
| } |
| } |
| } |