blob: c8855cd8b792246ddcd3d4bc8067cb6c4d67941c [file] [log] [blame]
/*
* 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 static com.android.internal.telephony.RILConstants.REQUEST_NOT_SUPPORTED;
import android.annotation.NonNull;
import android.os.AsyncResult;
import android.os.Message;
import android.os.RemoteException;
import android.telephony.AccessNetworkConstants;
import android.telephony.NetworkScanRequest;
import android.telephony.RadioAccessSpecifier;
import android.telephony.Rlog;
import android.telephony.SignalThresholdInfo;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* A holder for IRadioNetwork. Use getHidl to get IRadio 1.0 and call the HIDL implementations or
* getAidl to get IRadioNetwork and call the AIDL implementations of the HAL APIs.
*/
public class RadioNetworkProxy extends RadioServiceProxy {
private static final String TAG = "RadioNetworkProxy";
private volatile android.hardware.radio.network.IRadioNetwork mNetworkProxy = null;
private static final int INDICATION_FILTERS_ALL_V1_0 =
android.hardware.radio.V1_5.IndicationFilter.SIGNAL_STRENGTH
| android.hardware.radio.V1_5.IndicationFilter.FULL_NETWORK_STATE
| android.hardware.radio.V1_5.IndicationFilter.DATA_CALL_DORMANCY_CHANGED;
private static final int INDICATION_FILTERS_ALL_V1_2 =
INDICATION_FILTERS_ALL_V1_0
| android.hardware.radio.V1_5.IndicationFilter.LINK_CAPACITY_ESTIMATE
| android.hardware.radio.V1_5.IndicationFilter.PHYSICAL_CHANNEL_CONFIG;
private static final int INDICATION_FILTERS_ALL_V1_5 =
INDICATION_FILTERS_ALL_V1_2
| android.hardware.radio.V1_5.IndicationFilter.REGISTRATION_FAILURE
| android.hardware.radio.V1_5.IndicationFilter.BARRING_INFO;
private static final int INDICATION_FILTERS_ALL_AIDL =
android.hardware.radio.network.IndicationFilter.SIGNAL_STRENGTH
| android.hardware.radio.network.IndicationFilter.FULL_NETWORK_STATE
| android.hardware.radio.network.IndicationFilter.DATA_CALL_DORMANCY_CHANGED
| android.hardware.radio.network.IndicationFilter.LINK_CAPACITY_ESTIMATE
| android.hardware.radio.network.IndicationFilter.PHYSICAL_CHANNEL_CONFIG
| android.hardware.radio.network.IndicationFilter.REGISTRATION_FAILURE
| android.hardware.radio.network.IndicationFilter.BARRING_INFO;
/**
* Set IRadioNetwork as the AIDL implementation for RadioServiceProxy
* @param halVersion Radio HAL version
* @param network IRadioNetwork implementation
*
* @return updated HAL version
*/
public HalVersion setAidl(HalVersion halVersion,
android.hardware.radio.network.IRadioNetwork network) {
mHalVersion = halVersion;
mNetworkProxy = network;
mIsAidl = true;
try {
HalVersion newHalVersion;
int version = network.getInterfaceVersion();
switch(version) {
case 2:
newHalVersion = RIL.RADIO_HAL_VERSION_2_1;
break;
default:
newHalVersion = RIL.RADIO_HAL_VERSION_2_0;
break;
}
Rlog.d(TAG, "AIDL version=" + version + ", halVersion=" + newHalVersion);
if (mHalVersion.less(newHalVersion)) {
mHalVersion = newHalVersion;
}
} catch (RemoteException e) {
Rlog.e(TAG, "setAidl: " + e);
}
Rlog.d(TAG, "AIDL initialized mHalVersion=" + mHalVersion);
return mHalVersion;
}
/**
* Get the AIDL implementation of RadioNetworkProxy
* @return IRadioNetwork implementation
*/
public android.hardware.radio.network.IRadioNetwork getAidl() {
return mNetworkProxy;
}
/**
* Reset RadioNetworkProxy
*/
@Override
public void clear() {
super.clear();
mNetworkProxy = null;
}
/**
* Check whether a RadioNetwork implementation exists
* @return true if there is neither a HIDL nor AIDL implementation
*/
@Override
public boolean isEmpty() {
return mRadioProxy == null && mNetworkProxy == null;
}
/**
* Call IRadioNetwork#getAllowedNetworkTypesBitmap
* @param serial Serial number of request
* @throws RemoteException
*/
public void getAllowedNetworkTypesBitmap(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getAllowedNetworkTypesBitmap(serial);
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6)) {
((android.hardware.radio.V1_6.IRadio) mRadioProxy).getAllowedNetworkTypesBitmap(serial);
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_4)) {
((android.hardware.radio.V1_4.IRadio) mRadioProxy)
.getPreferredNetworkTypeBitmap(serial);
} else {
mRadioProxy.getPreferredNetworkType(serial);
}
}
/**
* Call IRadioNetwork#getAvailableBandModes
* @param serial Serial number of request
* @throws RemoteException
*/
public void getAvailableBandModes(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getAvailableBandModes(serial);
} else {
mRadioProxy.getAvailableBandModes(serial);
}
}
/**
* Call IRadioNetwork#getAvailableNetworks
* @param serial Serial number of request
* @throws RemoteException
*/
public void getAvailableNetworks(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getAvailableNetworks(serial);
} else {
mRadioProxy.getAvailableNetworks(serial);
}
}
/**
* Call IRadioNetwork#getBarringInfo
* @param serial Serial number of request
* @throws RemoteException
*/
public void getBarringInfo(int serial) throws RemoteException {
if (isEmpty() || mHalVersion.less(RIL.RADIO_HAL_VERSION_1_5)) return;
if (isAidl()) {
mNetworkProxy.getBarringInfo(serial);
} else {
((android.hardware.radio.V1_5.IRadio) mRadioProxy).getBarringInfo(serial);
}
}
/**
* Call IRadioNetwork#getCdmaRoamingPreference
* @param serial Serial number of request
* @throws RemoteException
*/
public void getCdmaRoamingPreference(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getCdmaRoamingPreference(serial);
} else {
mRadioProxy.getCdmaRoamingPreference(serial);
}
}
/**
* Call IRadioNetwork#getCellInfoList
* @param serial Serial number of request
* @throws RemoteException
*/
public void getCellInfoList(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getCellInfoList(serial);
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6)) {
((android.hardware.radio.V1_6.IRadio) mRadioProxy).getCellInfoList_1_6(serial);
} else {
mRadioProxy.getCellInfoList(serial);
}
}
/**
* Call IRadioNetwork#getDataRegistrationState
* @param serial Serial number of request
* @param overrideHalVersion Radio HAL fallback compatibility override
* @throws RemoteException
*/
public void getDataRegistrationState(int serial, HalVersion overrideHalVersion)
throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getDataRegistrationState(serial);
} else if ((overrideHalVersion == null
|| overrideHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6))
&& mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6)) {
((android.hardware.radio.V1_6.IRadio) mRadioProxy).getDataRegistrationState_1_6(serial);
} else if ((overrideHalVersion == null
|| overrideHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5))
&& mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5)) {
((android.hardware.radio.V1_5.IRadio) mRadioProxy).getDataRegistrationState_1_5(serial);
} else {
mRadioProxy.getDataRegistrationState(serial);
}
}
/**
* Call IRadioNetwork#getImsRegistrationState
* @param serial Serial number of request
* @throws RemoteException
*/
public void getImsRegistrationState(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getImsRegistrationState(serial);
} else {
mRadioProxy.getImsRegistrationState(serial);
}
}
/**
* Call IRadioNetwork#getNetworkSelectionMode
* @param serial Serial number of request
* @throws RemoteException
*/
public void getNetworkSelectionMode(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getNetworkSelectionMode(serial);
} else {
mRadioProxy.getNetworkSelectionMode(serial);
}
}
/**
* Call IRadioNetwork#getOperator
* @param serial Serial number of request
* @throws RemoteException
*/
public void getOperator(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getOperator(serial);
} else {
mRadioProxy.getOperator(serial);
}
}
/**
* Call IRadioNetwork#getSignalStrength
* @param serial Serial number of request
* @throws RemoteException
*/
public void getSignalStrength(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getSignalStrength(serial);
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6)) {
((android.hardware.radio.V1_6.IRadio) mRadioProxy).getSignalStrength_1_6(serial);
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_4)) {
((android.hardware.radio.V1_4.IRadio) mRadioProxy).getSignalStrength_1_4(serial);
} else {
mRadioProxy.getSignalStrength(serial);
}
}
/**
* Call IRadioNetwork#getSystemSelectionChannels
* @param serial Serial number of request
* @throws RemoteException
*/
public void getSystemSelectionChannels(int serial) throws RemoteException {
if (isEmpty() || mHalVersion.less(RIL.RADIO_HAL_VERSION_1_6)) return;
if (isAidl()) {
mNetworkProxy.getSystemSelectionChannels(serial);
} else {
((android.hardware.radio.V1_6.IRadio) mRadioProxy).getSystemSelectionChannels(serial);
}
}
/**
* Call IRadioNetwork#getVoiceRadioTechnology
* @param serial Serial number of request
* @throws RemoteException
*/
public void getVoiceRadioTechnology(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getVoiceRadioTechnology(serial);
} else {
mRadioProxy.getVoiceRadioTechnology(serial);
}
}
/**
* Call IRadioNetwork#getVoiceRegistrationState
* @param serial Serial number of request
* @param overrideHalVersion Radio HAL fallback compatibility override
* @throws RemoteException
*/
public void getVoiceRegistrationState(int serial, HalVersion overrideHalVersion)
throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getVoiceRegistrationState(serial);
} else if ((overrideHalVersion == null
|| overrideHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6))
&& mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6)) {
((android.hardware.radio.V1_6.IRadio) mRadioProxy)
.getVoiceRegistrationState_1_6(serial);
} else if ((overrideHalVersion == null
|| overrideHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5))
&& mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5)) {
((android.hardware.radio.V1_5.IRadio) mRadioProxy)
.getVoiceRegistrationState_1_5(serial);
} else {
mRadioProxy.getVoiceRegistrationState(serial);
}
}
/**
* Call IRadioNetwork#isNrDualConnectivityEnabled
* @param serial Serial number of request
* @throws RemoteException
*/
public void isNrDualConnectivityEnabled(int serial) throws RemoteException {
if (isEmpty() || mHalVersion.less(RIL.RADIO_HAL_VERSION_1_6)) return;
if (isAidl()) {
mNetworkProxy.isNrDualConnectivityEnabled(serial);
} else {
((android.hardware.radio.V1_6.IRadio) mRadioProxy).isNrDualConnectivityEnabled(serial);
}
}
/**
* Call IRadioNetwork#responseAcknowledgement
* @throws RemoteException
*/
@Override
public void responseAcknowledgement() throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.responseAcknowledgement();
} else {
mRadioProxy.responseAcknowledgement();
}
}
/**
* Call IRadioNetwork#setAllowedNetworkTypesBitmap
* @param serial Serial number of request
* @param networkTypeBitmask Network type bitmask to set
* @throws RemoteException
*/
public void setAllowedNetworkTypesBitmap(int serial, int networkTypeBitmask)
throws RemoteException {
if (isEmpty() || mHalVersion.less(RIL.RADIO_HAL_VERSION_1_6)) return;
if (isAidl()) {
mNetworkProxy.setAllowedNetworkTypesBitmap(serial,
RILUtils.convertToHalRadioAccessFamilyAidl(networkTypeBitmask));
} else {
((android.hardware.radio.V1_6.IRadio) mRadioProxy).setAllowedNetworkTypesBitmap(
serial, RILUtils.convertToHalRadioAccessFamily(networkTypeBitmask));
}
}
/**
* Call IRadioNetwork#setPreferredNetworkTypeBitmap
* @param serial Serial number of request
* @param networkTypesBitmask Preferred network types bitmask to set
* @throws RemoteException
*/
public void setPreferredNetworkTypeBitmap(int serial, int networkTypesBitmask)
throws RemoteException {
if (isEmpty() || mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6)) return;
if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_4)) {
((android.hardware.radio.V1_4.IRadio) mRadioProxy).setPreferredNetworkTypeBitmap(serial,
RILUtils.convertToHalRadioAccessFamily(networkTypesBitmask));
} else {
mRadioProxy.setPreferredNetworkType(serial, networkTypesBitmask);
}
}
/**
* Call IRadioNetwork#setBandMode
* @param serial Serial number of request
* @param bandMode One of BM_*_BAND
* @throws RemoteException
*/
public void setBandMode(int serial, int bandMode) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setBandMode(serial, bandMode);
} else {
mRadioProxy.setBandMode(serial, bandMode);
}
}
/**
* Call IRadioNetwork#setBarringPassword
* @param serial Serial number of request
* @param facility Facility string code
* @param oldPassword Old password
* @param newPassword New password
* @throws RemoteException
*/
public void setBarringPassword(int serial, String facility, String oldPassword,
String newPassword) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setBarringPassword(serial, facility, oldPassword, newPassword);
} else {
mRadioProxy.setBarringPassword(serial, facility, oldPassword, newPassword);
}
}
/**
* Call IRadioNetwork#setCdmaRoamingPreference
* @param serial Serial number of request
* @param cdmaRoamingType One of CDMA_RM_*
* @throws RemoteException
*/
public void setCdmaRoamingPreference(int serial, int cdmaRoamingType) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setCdmaRoamingPreference(serial, cdmaRoamingType);
} else {
mRadioProxy.setCdmaRoamingPreference(serial, cdmaRoamingType);
}
}
/**
* Call IRadioNetwork#setCellInfoListRate
* @param serial Serial number of request
* @param rate Minimum time in milliseconds to indicate time between unsolicited cellInfoList()
* @throws RemoteException
*/
public void setCellInfoListRate(int serial, int rate) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setCellInfoListRate(serial, rate);
} else {
mRadioProxy.setCellInfoListRate(serial, rate);
}
}
/**
* Call IRadioNetwork#setIndicationFilter
* @param serial Serial number of request
* @param filter Unsolicited response filter
* @throws RemoteException
*/
public void setIndicationFilter(int serial, int filter) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setIndicationFilter(serial, filter & INDICATION_FILTERS_ALL_AIDL);
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5)) {
((android.hardware.radio.V1_5.IRadio) mRadioProxy).setIndicationFilter_1_5(serial,
filter & INDICATION_FILTERS_ALL_V1_5);
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_2)) {
((android.hardware.radio.V1_2.IRadio) mRadioProxy).setIndicationFilter_1_2(serial,
filter & INDICATION_FILTERS_ALL_V1_2);
} else {
mRadioProxy.setIndicationFilter(serial, filter & INDICATION_FILTERS_ALL_V1_0);
}
}
/**
* Call IRadioNetwork#setLinkCapacityReportingCriteria
* @param serial Serial number of request
* @param hysteresisMs A hysteresis time in milliseconds. A value of 0 disables hysteresis.
* @param hysteresisDlKbps An interval in kbps defining the required magnitude change between DL
* reports. A value of 0 disables hysteresis
* @param hysteresisUlKbps An interval in kbps defining the required magnitude change between UL
* reports. A value of 0 disables hysteresis
* @param thresholdsDlKbps An array of trigger thresholds in kbps for DL reports. A size of 0
* disables thresholds
* @param thresholdsUlKbps An array of trigger thresholds in kbps for UL reports. A size of 0
* disables thresholds
* @param ran RadioAccessNetwork for which to apply criteria
* @throws RemoteException
*/
public void setLinkCapacityReportingCriteria(int serial, int hysteresisMs, int hysteresisDlKbps,
int hysteresisUlKbps, int[] thresholdsDlKbps, int[] thresholdsUlKbps, int ran)
throws RemoteException {
if (isEmpty() || mHalVersion.less(RIL.RADIO_HAL_VERSION_1_2)) return;
if (isAidl()) {
mNetworkProxy.setLinkCapacityReportingCriteria(serial, hysteresisMs, hysteresisDlKbps,
hysteresisUlKbps, thresholdsDlKbps, thresholdsUlKbps,
RILUtils.convertToHalAccessNetworkAidl(ran));
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5)) {
((android.hardware.radio.V1_5.IRadio) mRadioProxy).setLinkCapacityReportingCriteria_1_5(
serial, hysteresisMs, hysteresisDlKbps, hysteresisUlKbps,
RILUtils.primitiveArrayToArrayList(thresholdsDlKbps),
RILUtils.primitiveArrayToArrayList(thresholdsUlKbps),
RILUtils.convertToHalAccessNetwork(ran));
} else {
if (ran == AccessNetworkConstants.AccessNetworkType.NGRAN) {
throw new RuntimeException("NGRAN unsupported on IRadio version: " + mHalVersion);
}
((android.hardware.radio.V1_2.IRadio) mRadioProxy).setLinkCapacityReportingCriteria(
serial, hysteresisMs, hysteresisDlKbps, hysteresisUlKbps,
RILUtils.primitiveArrayToArrayList(thresholdsDlKbps),
RILUtils.primitiveArrayToArrayList(thresholdsUlKbps),
RILUtils.convertToHalAccessNetwork(ran));
}
}
/**
* Call IRadioNetwork#setLocationUpdates
* @param serial Serial number of request
* @param enable Whether to enable or disable network state change notifications when location
* information (lac and/or cid) has changed
* @throws RemoteException
*/
public void setLocationUpdates(int serial, boolean enable) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setLocationUpdates(serial, enable);
} else {
mRadioProxy.setLocationUpdates(serial, enable);
}
}
/**
* Call IRadioNetwork#setNetworkSelectionModeAutomatic
* @param serial Serial number of request
* @throws RemoteException
*/
public void setNetworkSelectionModeAutomatic(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setNetworkSelectionModeAutomatic(serial);
} else {
mRadioProxy.setNetworkSelectionModeAutomatic(serial);
}
}
/**
* Call IRadioNetwork#setNetworkSelectionModeManual
* @param serial Serial number of request
* @param operatorNumeric PLMN ID of the network to select
* @param ran Radio access network type
* @throws RemoteException
*/
public void setNetworkSelectionModeManual(int serial, String operatorNumeric, int ran)
throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setNetworkSelectionModeManual(serial, operatorNumeric,
RILUtils.convertToHalAccessNetworkAidl(ran));
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5)) {
((android.hardware.radio.V1_5.IRadio) mRadioProxy).setNetworkSelectionModeManual_1_5(
serial, operatorNumeric, RILUtils.convertToHalRadioAccessNetworks(ran));
} else {
mRadioProxy.setNetworkSelectionModeManual(serial, operatorNumeric);
}
}
/**
* Call IRadioNetwork#setNrDualConnectivityState
* @param serial Serial number of request
* @param nrDualConnectivityState Expected NR dual connectivity state
* @throws RemoteException
*/
public void setNrDualConnectivityState(int serial, byte nrDualConnectivityState)
throws RemoteException {
if (isEmpty() || mHalVersion.less(RIL.RADIO_HAL_VERSION_1_6)) return;
if (isAidl()) {
mNetworkProxy.setNrDualConnectivityState(serial, nrDualConnectivityState);
} else {
((android.hardware.radio.V1_6.IRadio) mRadioProxy).setNrDualConnectivityState(
serial, nrDualConnectivityState);
}
}
/**
* Call IRadioNetwork#setSignalStrengthReportingCriteria
* @param serial Serial number of request
* @param signalThresholdInfos a list of {@link SignalThresholdInfo} to set with.
* @throws RemoteException
*/
public void setSignalStrengthReportingCriteria(int serial,
@NonNull List<SignalThresholdInfo> signalThresholdInfos) throws RemoteException {
if (isEmpty() || mHalVersion.less(RIL.RADIO_HAL_VERSION_1_2)) return;
if (isAidl()) {
android.hardware.radio.network.SignalThresholdInfo[] halSignalThresholdsInfos =
new android.hardware.radio.network.SignalThresholdInfo[signalThresholdInfos.size()];
for (int i = 0; i < signalThresholdInfos.size(); i++) {
halSignalThresholdsInfos[i] = RILUtils.convertToHalSignalThresholdInfoAidl(
signalThresholdInfos.get(i));
}
mNetworkProxy.setSignalStrengthReportingCriteria(serial, halSignalThresholdsInfos);
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5)) {
for (SignalThresholdInfo signalThresholdInfo : signalThresholdInfos) {
((android.hardware.radio.V1_5.IRadio) mRadioProxy)
.setSignalStrengthReportingCriteria_1_5(serial,
RILUtils.convertToHalSignalThresholdInfo(signalThresholdInfo),
RILUtils.convertToHalAccessNetwork(
signalThresholdInfo.getRadioAccessNetworkType()));
}
} else {
for (SignalThresholdInfo signalThresholdInfo : signalThresholdInfos) {
((android.hardware.radio.V1_2.IRadio) mRadioProxy)
.setSignalStrengthReportingCriteria(serial,
signalThresholdInfo.getHysteresisMs(),
signalThresholdInfo.getHysteresisDb(),
RILUtils.primitiveArrayToArrayList(
signalThresholdInfo.getThresholds()),
RILUtils.convertToHalAccessNetwork(
signalThresholdInfo.getRadioAccessNetworkType()));
}
}
}
/**
* Call IRadioNetwork#setSuppServiceNotifications
* @param serial Serial number of request
* @param enable True to enable notifications, false to disable
* @throws RemoteException
*/
public void setSuppServiceNotifications(int serial, boolean enable) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setSuppServiceNotifications(serial, enable);
} else {
mRadioProxy.setSuppServiceNotifications(serial, enable);
}
}
/**
* Call IRadioNetwork#setSystemSelectionChannels
* @param serial Serial number of request
* @param specifiers Which bands to scan
* @throws RemoteException
*/
public void setSystemSelectionChannels(int serial, List<RadioAccessSpecifier> specifiers)
throws RemoteException {
if (isEmpty() || mHalVersion.less(RIL.RADIO_HAL_VERSION_1_3)) return;
if (isAidl()) {
mNetworkProxy.setSystemSelectionChannels(serial, !specifiers.isEmpty(),
specifiers.stream().map(RILUtils::convertToHalRadioAccessSpecifierAidl)
.toArray(android.hardware.radio.network.RadioAccessSpecifier[]::new));
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5)) {
((android.hardware.radio.V1_5.IRadio) mRadioProxy).setSystemSelectionChannels_1_5(
serial, !specifiers.isEmpty(), specifiers.stream()
.map(RILUtils::convertToHalRadioAccessSpecifier15)
.collect(Collectors.toCollection(ArrayList::new)));
} else {
((android.hardware.radio.V1_3.IRadio) mRadioProxy).setSystemSelectionChannels(
serial, !specifiers.isEmpty(), specifiers.stream()
.map(RILUtils::convertToHalRadioAccessSpecifier11)
.collect(Collectors.toCollection(ArrayList::new)));
}
}
/**
* Call IRadioNetwork#startNetworkScan
* @param serial Serial number of request
* @param request Defines the radio networks/bands/channels which need to be scanned
* @param overrideHalVersion Radio HAL fallback compatibility override
* @throws RemoteException
*/
public void startNetworkScan(int serial, NetworkScanRequest request,
HalVersion overrideHalVersion, Message result) throws RemoteException {
if (isEmpty() || mHalVersion.less(RIL.RADIO_HAL_VERSION_1_1)) return;
if (isAidl()) {
android.hardware.radio.network.NetworkScanRequest halRequest =
new android.hardware.radio.network.NetworkScanRequest();
halRequest.type = request.getScanType();
halRequest.interval = request.getSearchPeriodicity();
halRequest.maxSearchTime = request.getMaxSearchTime();
halRequest.incrementalResultsPeriodicity = request.getIncrementalResultsPeriodicity();
halRequest.incrementalResults = request.getIncrementalResults();
halRequest.mccMncs = request.getPlmns().stream().toArray(String[]::new);
ArrayList<android.hardware.radio.network.RadioAccessSpecifier> specifiers =
new ArrayList<>();
for (RadioAccessSpecifier ras : request.getSpecifiers()) {
android.hardware.radio.network.RadioAccessSpecifier rasInHalFormat =
RILUtils.convertToHalRadioAccessSpecifierAidl(ras);
if (rasInHalFormat == null) {
AsyncResult.forMessage(result, null,
CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
result.sendToTarget();
return;
}
specifiers.add(rasInHalFormat);
}
halRequest.specifiers = specifiers.stream().toArray(
android.hardware.radio.network.RadioAccessSpecifier[]::new);
mNetworkProxy.startNetworkScan(serial, halRequest);
} else if ((overrideHalVersion == null
|| overrideHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5))
&& mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_5)) {
android.hardware.radio.V1_5.NetworkScanRequest halRequest =
new android.hardware.radio.V1_5.NetworkScanRequest();
halRequest.type = request.getScanType();
halRequest.interval = request.getSearchPeriodicity();
halRequest.maxSearchTime = request.getMaxSearchTime();
halRequest.incrementalResultsPeriodicity = request.getIncrementalResultsPeriodicity();
halRequest.incrementalResults = request.getIncrementalResults();
halRequest.mccMncs.addAll(request.getPlmns());
for (RadioAccessSpecifier ras : request.getSpecifiers()) {
android.hardware.radio.V1_5.RadioAccessSpecifier rasInHalFormat =
RILUtils.convertToHalRadioAccessSpecifier15(ras);
if (rasInHalFormat == null) {
AsyncResult.forMessage(result, null,
CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
result.sendToTarget();
return;
}
halRequest.specifiers.add(rasInHalFormat);
}
((android.hardware.radio.V1_5.IRadio) mRadioProxy).startNetworkScan_1_5(
serial, halRequest);
} else if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_2)) {
android.hardware.radio.V1_2.NetworkScanRequest halRequest =
new android.hardware.radio.V1_2.NetworkScanRequest();
halRequest.type = request.getScanType();
halRequest.interval = request.getSearchPeriodicity();
halRequest.maxSearchTime = request.getMaxSearchTime();
halRequest.incrementalResultsPeriodicity = request.getIncrementalResultsPeriodicity();
halRequest.incrementalResults = request.getIncrementalResults();
halRequest.mccMncs.addAll(request.getPlmns());
for (RadioAccessSpecifier ras : request.getSpecifiers()) {
android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat =
RILUtils.convertToHalRadioAccessSpecifier11(ras);
if (rasInHalFormat == null) {
AsyncResult.forMessage(result, null,
CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
result.sendToTarget();
return;
}
halRequest.specifiers.add(rasInHalFormat);
}
if (mHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_4)) {
((android.hardware.radio.V1_4.IRadio) mRadioProxy).startNetworkScan_1_4(
serial, halRequest);
} else {
((android.hardware.radio.V1_2.IRadio) mRadioProxy).startNetworkScan_1_2(
serial, halRequest);
}
} else {
android.hardware.radio.V1_1.NetworkScanRequest halRequest =
new android.hardware.radio.V1_1.NetworkScanRequest();
halRequest.type = request.getScanType();
halRequest.interval = request.getSearchPeriodicity();
for (RadioAccessSpecifier ras : request.getSpecifiers()) {
android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat =
RILUtils.convertToHalRadioAccessSpecifier11(ras);
if (rasInHalFormat == null) {
AsyncResult.forMessage(result, null,
CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
result.sendToTarget();
return;
}
halRequest.specifiers.add(rasInHalFormat);
}
((android.hardware.radio.V1_1.IRadio) mRadioProxy).startNetworkScan(serial, halRequest);
}
}
/**
* Call IRadioNetwork#stopNetworkScan
* @param serial Serial number of request
* @throws RemoteException
*/
public void stopNetworkScan(int serial) throws RemoteException {
if (isEmpty() || mHalVersion.less(RIL.RADIO_HAL_VERSION_1_1)) return;
if (isAidl()) {
mNetworkProxy.stopNetworkScan(serial);
} else {
((android.hardware.radio.V1_1.IRadio) mRadioProxy).stopNetworkScan(serial);
}
}
/**
* Call IRadioNetwork#supplyNetworkDepersonalization
* @param serial Serial number of request
* @param netPin Network depersonalization code
* @throws RemoteException
*/
public void supplyNetworkDepersonalization(int serial, String netPin) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.supplyNetworkDepersonalization(serial, netPin);
} else {
mRadioProxy.supplyNetworkDepersonalization(serial, netPin);
}
}
/**
* Call IRadioNetwork#getUsageSetting()
* @param serial Serial number of request
* @throws RemoteException
*/
public void getUsageSetting(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.getUsageSetting(serial);
}
// Only supported on AIDL.
}
/**
* Call IRadioNetwork#setUsageSetting()
* @param serial Serial number of request
* @throws RemoteException
*/
public void setUsageSetting(int serial,
/* TelephonyManager.UsageSetting */ int usageSetting) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setUsageSetting(serial, usageSetting);
}
// Only supported on AIDL.
}
/**
* Set the Emergency Mode
*
* @param serial Serial number of the request.
* @param emcModeType Defines the radio emergency mode type.
* @throws RemoteException
*/
public void setEmergencyMode(int serial, int emcModeType) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setEmergencyMode(serial, emcModeType);
}
// Only supported on AIDL.
}
/**
* Triggers an Emergency network scan.
*
* @param serial Serial number of the request.
* @param scanRequest Contains the preferred networks and type of service to be scanned.
* @throws RemoteException
*/
public void triggerEmergencyNetworkScan(int serial,
android.hardware.radio.network.EmergencyNetworkScanTrigger scanRequest)
throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.triggerEmergencyNetworkScan(serial, scanRequest);
}
// Only supported on AIDL.
}
/**
* Cancels ongoing Emergency network scan
*
* @param serial Serial number of the request.
* @param resetScan Indicates how the next {@link #triggerEmergencyNetworkScan} should work.
* If {@code true}, then the modem shall start the new scan from the beginning,
* otherwise the modem shall resume from the last search.
*
* @throws RemoteException
*/
public void cancelEmergencyNetworkScan(int serial, boolean resetScan) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.cancelEmergencyNetworkScan(serial, resetScan);
}
// Only supported on AIDL.
}
/**
* Exits ongoing Emergency Mode
*
* @param serial Serial number of the request.
* @throws RemoteException
*/
public void exitEmergencyMode(int serial) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.exitEmergencyMode(serial);
}
// Only supported on AIDL.
}
/**
* Set if null ciphering / null integrity is permitted.
*
* @param serial Serial number of the request.
* @param enabled true if null modes are allowed, false otherwise
* @throws RemoteException
*/
public void setNullCipherAndIntegrityEnabled(int serial,
boolean enabled) throws RemoteException {
if (isEmpty()) return;
if (isAidl()) {
mNetworkProxy.setNullCipherAndIntegrityEnabled(serial, enabled);
}
// Only supported on AIDL.
}
}