blob: 9ebb405a1ab9bcaf8cf5b81fe0841f65ff87b5a0 [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 android.telephony.cts;
import android.hardware.radio.RadioError;
import android.hardware.radio.RadioIndicationType;
import android.hardware.radio.RadioResponseInfo;
import android.hardware.radio.network.IRadioNetwork;
import android.hardware.radio.network.IRadioNetworkIndication;
import android.hardware.radio.network.IRadioNetworkResponse;
import android.hardware.radio.network.NetworkScanRequest;
import android.hardware.radio.network.RadioAccessSpecifier;
import android.hardware.radio.network.RegState;
import android.hardware.radio.network.SignalThresholdInfo;
import android.hardware.radio.sim.CardStatus;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
public class IRadioNetworkImpl extends IRadioNetwork.Stub {
private static final String TAG = "MRNW";
private final MockModemService mService;
private IRadioNetworkResponse mRadioNetworkResponse;
private IRadioNetworkIndication mRadioNetworkIndication;
private static MockModemConfigInterface[] sMockModemConfigInterfaces;
private Object mCacheUpdateMutex;
private final Handler mHandler;
private int mSubId;
// ***** Events
static final int EVENT_RADIO_STATE_CHANGED = 1;
static final int EVENT_SIM_STATUS_CHANGED = 2;
static final int EVENT_PREFERRED_MODE_CHANGED = 3;
// ***** Cache of modem attributes/status
private int mNetworkTypeBitmap;
private int mReasonForDenial;
private boolean mNetworkSelectionMode;
private int mRadioState;
private boolean mSimReady;
private MockNetworkService mServiceState;
public IRadioNetworkImpl(
MockModemService service, MockModemConfigInterface[] interfaces, int instanceId) {
Log.d(TAG, "Instantiated");
this.mService = service;
sMockModemConfigInterfaces = interfaces;
mCacheUpdateMutex = new Object();
mHandler = new IRadioNetworkHandler();
mSubId = instanceId;
mServiceState = new MockNetworkService();
// Default network type GPRS|EDGE|UMTS|HSDPA|HSUPA|HSPA|LTE|HSPA+|GSM|LTE_CA|NR
mNetworkTypeBitmap =
MockNetworkService.GSM
| MockNetworkService.WCDMA
| MockNetworkService.LTE
| MockNetworkService.NR;
mServiceState.updateHighestRegisteredRat(mNetworkTypeBitmap);
sMockModemConfigInterfaces[mSubId].registerForRadioStateChanged(
mHandler, EVENT_RADIO_STATE_CHANGED, null);
sMockModemConfigInterfaces[mSubId].registerForCardStatusChanged(
mHandler, EVENT_SIM_STATUS_CHANGED, null);
}
/** Handler class to handle callbacks */
private final class IRadioNetworkHandler extends Handler {
@Override
public void handleMessage(Message msg) {
AsyncResult ar;
synchronized (mCacheUpdateMutex) {
switch (msg.what) {
case EVENT_SIM_STATUS_CHANGED:
Log.d(TAG, "Received EVENT_SIM_STATUS_CHANGED");
boolean oldSimReady = mSimReady;
ar = (AsyncResult) msg.obj;
if (ar != null && ar.exception == null) {
mSimReady = updateSimReady(ar);
if (oldSimReady != mSimReady) {
updateNetworkStatus();
}
} else {
Log.e(TAG, msg.what + " failure. Exception: " + ar.exception);
}
break;
case EVENT_RADIO_STATE_CHANGED:
Log.d(TAG, "Received EVENT_RADIO_STATE_CHANGED");
int oldRadioState = mRadioState;
ar = (AsyncResult) msg.obj;
if (ar != null && ar.exception == null) {
mRadioState = (int) ar.result;
Log.i(TAG, "Radio state: " + mRadioState);
if (oldRadioState != mRadioState) {
updateNetworkStatus();
}
} else {
Log.e(TAG, msg.what + " failure. Exception: " + ar.exception);
}
break;
case EVENT_PREFERRED_MODE_CHANGED:
Log.d(TAG, "Received EVENT_PREFERRED_MODE_CHANGED");
mServiceState.updateNetworkStatus(
MockNetworkService.NETWORK_UPDATE_PREFERRED_MODE_CHANGE);
updateNetworkStatus();
break;
}
}
}
}
// Implementation of IRadioNetwork utility functions
private void notifyServiceStateChange() {
Log.d(TAG, "notifyServiceStateChange");
Handler handler = sMockModemConfigInterfaces[mSubId].getMockModemConfigHandler();
Message msg =
handler.obtainMessage(
MockModemConfigBase.EVENT_SERVICE_STATE_CHANGE, mServiceState);
handler.sendMessage(msg);
}
private void updateNetworkStatus() {
if (mRadioState != MockModemConfigInterface.RADIO_STATE_ON) {
// Update to OOS state
mServiceState.updateServiceState(RegState.NOT_REG_MT_NOT_SEARCHING_OP);
} else if (!mSimReady) {
// Update to Searching state
mServiceState.updateServiceState(RegState.NOT_REG_MT_SEARCHING_OP);
} else if (mServiceState.isHomeCellExisted() && mServiceState.getIsHomeCamping()) {
// Update to Home state
mServiceState.updateServiceState(RegState.REG_HOME);
} else if (mServiceState.isRoamingCellExisted() && mServiceState.getIsRoamingCamping()) {
// Update to Roaming state
mServiceState.updateServiceState(RegState.REG_ROAMING);
} else {
// Update to Searching state
mServiceState.updateServiceState(RegState.NOT_REG_MT_SEARCHING_OP);
}
unsolNetworkStateChanged();
unsolCurrentSignalStrength();
unsolCellInfoList();
}
private boolean updateSimReady(AsyncResult ar) {
String simPlmn = "";
CardStatus cardStatus = new CardStatus();
cardStatus = (CardStatus) ar.result;
if (cardStatus.cardState != CardStatus.STATE_PRESENT) {
return false;
}
int numApplications = cardStatus.applications.length;
if (numApplications < 1) {
return false;
}
for (int i = 0; i < numApplications; i++) {
android.hardware.radio.sim.AppStatus rilAppStatus = cardStatus.applications[i];
if (rilAppStatus.appState == android.hardware.radio.sim.AppStatus.APP_STATE_READY) {
Log.i(TAG, "SIM is ready");
simPlmn = "46692"; // TODO: Get SIM PLMN, maybe decode from IMSI
mServiceState.updateSimPlmn(simPlmn);
return true;
}
}
mServiceState.updateSimPlmn(simPlmn);
return false;
}
public boolean changeNetworkService(int carrierId, boolean registration) {
Log.d(TAG, "changeNetworkService: carrier id(" + carrierId + "): " + registration);
synchronized (mCacheUpdateMutex) {
// TODO: compare carrierId and sim to decide home or roming
mServiceState.setServiceStatus(false, registration);
updateNetworkStatus();
}
return true;
}
// Implementation of IRadioNetwork functions
@Override
public void getAllowedNetworkTypesBitmap(int serial) {
Log.d(TAG, "getAllowedNetworkTypesBitmap");
int networkTypeBitmap = mNetworkTypeBitmap;
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getAllowedNetworkTypesBitmapResponse(rsp, networkTypeBitmap);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getAllowedNetworkTypesBitmap from AIDL. Exception" + ex);
}
}
@Override
public void getAvailableBandModes(int serial) {
Log.d(TAG, "getAvailableBandModes");
int[] bandModes = new int[0];
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getAvailableBandModesResponse(rsp, bandModes);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getAvailableBandModes from AIDL. Exception" + ex);
}
}
@Override
public void getAvailableNetworks(int serial) {
Log.d(TAG, "getAvailableNetworks");
android.hardware.radio.network.OperatorInfo[] networkInfos =
new android.hardware.radio.network.OperatorInfo[0];
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getAvailableNetworksResponse(rsp, networkInfos);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getAvailableNetworks from AIDL. Exception" + ex);
}
}
@Override
public void getBarringInfo(int serial) {
Log.d(TAG, "getBarringInfo");
android.hardware.radio.network.CellIdentity cellIdentity =
new android.hardware.radio.network.CellIdentity();
android.hardware.radio.network.BarringInfo[] barringInfos =
new android.hardware.radio.network.BarringInfo[0];
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.getBarringInfoResponse(rsp, cellIdentity, barringInfos);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getBarringInfo from AIDL. Exception" + ex);
}
}
@Override
public void getCdmaRoamingPreference(int serial) {
Log.d(TAG, "getCdmaRoamingPreference");
int type = 0;
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.getCdmaRoamingPreferenceResponse(rsp, type);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getCdmaRoamingPreference from AIDL. Exception" + ex);
}
}
@Override
public void getCellInfoList(int serial) {
Log.d(TAG, "getCellInfoList");
android.hardware.radio.network.CellInfo[] cells;
synchronized (mCacheUpdateMutex) {
cells = mServiceState.getCells();
}
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getCellInfoListResponse(rsp, cells);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getCellInfoList from AIDL. Exception" + ex);
}
}
@Override
public void getDataRegistrationState(int serial) {
Log.d(TAG, "getDataRegistrationState");
android.hardware.radio.network.RegStateResult dataRegResponse =
new android.hardware.radio.network.RegStateResult();
dataRegResponse.cellIdentity = new android.hardware.radio.network.CellIdentity();
dataRegResponse.reasonForDenial = mReasonForDenial;
synchronized (mCacheUpdateMutex) {
dataRegResponse.regState =
mServiceState.getRegistration(android.hardware.radio.network.Domain.PS);
dataRegResponse.rat = mServiceState.getRegistrationRat();
if (mServiceState.isInService()) {
dataRegResponse.registeredPlmn =
mServiceState.getPrimaryCellOperatorInfo().operatorNumeric;
}
dataRegResponse.cellIdentity = mServiceState.getPrimaryCellIdentity();
}
// TODO: support accessTechnologySpecificInfo
dataRegResponse.accessTechnologySpecificInfo =
android.hardware.radio.network.AccessTechnologySpecificInfo.noinit(true);
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getDataRegistrationStateResponse(rsp, dataRegResponse);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getRadioCapability from AIDL. Exception" + ex);
}
}
@Override
public void getImsRegistrationState(int serial) {
Log.d(TAG, "getImsRegistrationState");
boolean isRegistered = false;
int ratFamily = 0;
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.getImsRegistrationStateResponse(rsp, isRegistered, ratFamily);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getImsRegistrationState from AIDL. Exception" + ex);
}
}
@Override
public void getNetworkSelectionMode(int serial) {
Log.d(TAG, "getNetworkSelectionMode");
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getNetworkSelectionModeResponse(rsp, mNetworkSelectionMode);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getNetworkSelectionMode from AIDL. Exception" + ex);
}
}
@Override
public void getOperator(int serial) {
Log.d(TAG, "getOperator");
String longName = "";
String shortName = "";
String numeric = "";
synchronized (mCacheUpdateMutex) {
if (mServiceState.isInService()) {
android.hardware.radio.network.OperatorInfo operatorInfo =
mServiceState.getPrimaryCellOperatorInfo();
longName = operatorInfo.alphaLong;
shortName = operatorInfo.alphaShort;
numeric = operatorInfo.operatorNumeric;
}
}
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getOperatorResponse(rsp, longName, shortName, numeric);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getOperator from AIDL. Exception" + ex);
}
}
@Override
public void getSignalStrength(int serial) {
Log.d(TAG, "getSignalStrength");
android.hardware.radio.network.SignalStrength signalStrength =
new android.hardware.radio.network.SignalStrength();
synchronized (mCacheUpdateMutex) {
if (mServiceState.getIsHomeCamping()
&& mRadioState == MockModemConfigInterface.RADIO_STATE_ON) {
signalStrength = mServiceState.getSignalStrength();
}
}
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getSignalStrengthResponse(rsp, signalStrength);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getSignalStrength from AIDL. Exception" + ex);
}
}
@Override
public void getSystemSelectionChannels(int serial) {
Log.d(TAG, "getSystemSelectionChannels");
android.hardware.radio.network.RadioAccessSpecifier[] specifiers =
new android.hardware.radio.network.RadioAccessSpecifier[0];
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getSystemSelectionChannelsResponse(rsp, specifiers);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getSystemSelectionChannels from AIDL. Exception" + ex);
}
}
@Override
public void getVoiceRadioTechnology(int serial) {
Log.d(TAG, "getVoiceRadioTechnology");
int rat;
synchronized (mCacheUpdateMutex) {
rat = mServiceState.getRegistrationRat();
}
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getVoiceRadioTechnologyResponse(rsp, rat);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getVoiceRadioTechnology from AIDL. Exception" + ex);
}
}
@Override
public void getVoiceRegistrationState(int serial) {
Log.d(TAG, "getVoiceRegistrationState");
android.hardware.radio.network.RegStateResult voiceRegResponse =
new android.hardware.radio.network.RegStateResult();
voiceRegResponse.cellIdentity = new android.hardware.radio.network.CellIdentity();
voiceRegResponse.reasonForDenial = mReasonForDenial;
synchronized (mCacheUpdateMutex) {
voiceRegResponse.regState =
mServiceState.getRegistration(android.hardware.radio.network.Domain.CS);
voiceRegResponse.rat = mServiceState.getRegistrationRat();
if (mServiceState.isInService()) {
voiceRegResponse.registeredPlmn =
mServiceState.getPrimaryCellOperatorInfo().operatorNumeric;
}
voiceRegResponse.cellIdentity = mServiceState.getPrimaryCellIdentity();
}
// TODO: support accessTechnologySpecificInfo
voiceRegResponse.accessTechnologySpecificInfo =
android.hardware.radio.network.AccessTechnologySpecificInfo.noinit(true);
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.getVoiceRegistrationStateResponse(rsp, voiceRegResponse);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getVoiceRegistrationState from AIDL. Exception" + ex);
}
}
@Override
public void isNrDualConnectivityEnabled(int serial) {
Log.d(TAG, "isNrDualConnectivityEnabled");
boolean isEnabled = false;
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.isNrDualConnectivityEnabledResponse(rsp, isEnabled);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to isNrDualConnectivityEnabled from AIDL. Exception" + ex);
}
}
@Override
public void responseAcknowledgement() {
Log.d(TAG, "responseAcknowledgement");
}
@Override
public void setAllowedNetworkTypesBitmap(int serial, int networkTypeBitmap) {
Log.d(TAG, "setAllowedNetworkTypesBitmap");
boolean isModeChange = false;
if (mNetworkTypeBitmap != networkTypeBitmap) {
mNetworkTypeBitmap = networkTypeBitmap;
synchronized (mCacheUpdateMutex) {
isModeChange = mServiceState.updateHighestRegisteredRat(mNetworkTypeBitmap);
}
if (isModeChange) {
mHandler.obtainMessage(EVENT_PREFERRED_MODE_CHANGED).sendToTarget();
}
}
RadioResponseInfo rsp = mService.makeSolRsp(serial);
try {
mRadioNetworkResponse.setAllowedNetworkTypesBitmapResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setAllowedNetworkTypesBitmap from AIDL. Exception" + ex);
}
}
@Override
public void setBandMode(int serial, int mode) {
Log.d(TAG, "setBandMode");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setBandModeResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setBandMode from AIDL. Exception" + ex);
}
}
@Override
public void setBarringPassword(
int serial, String facility, String oldPassword, String newPassword) {
Log.d(TAG, "setBarringPassword");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setBarringPasswordResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setBarringPassword from AIDL. Exception" + ex);
}
}
@Override
public void setCdmaRoamingPreference(int serial, int type) {
Log.d(TAG, "setCdmaRoamingPreference");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setCdmaRoamingPreferenceResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setCdmaRoamingPreference from AIDL. Exception" + ex);
}
}
@Override
public void setCellInfoListRate(int serial, int rate) {
Log.d(TAG, "setCellInfoListRate");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setCellInfoListRateResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setCellInfoListRate from AIDL. Exception" + ex);
}
}
@Override
public void setIndicationFilter(int serial, int indicationFilter) {
Log.d(TAG, "setIndicationFilter");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setIndicationFilterResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setIndicationFilter from AIDL. Exception" + ex);
}
}
@Override
public void setLinkCapacityReportingCriteria(
int serial,
int hysteresisMs,
int hysteresisDlKbps,
int hysteresisUlKbps,
int[] thresholdsDownlinkKbps,
int[] thresholdsUplinkKbps,
int accessNetwork) {
Log.d(TAG, "setLinkCapacityReportingCriteria");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setLinkCapacityReportingCriteriaResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setLinkCapacityReportingCriteria from AIDL. Exception" + ex);
}
}
@Override
public void setLocationUpdates(int serial, boolean enable) {
Log.d(TAG, "setLocationUpdates");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setLocationUpdatesResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setLocationUpdates from AIDL. Exception" + ex);
}
}
@Override
public void setNetworkSelectionModeAutomatic(int serial) {
Log.d(TAG, "setNetworkSelectionModeAutomatic");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setNetworkSelectionModeAutomaticResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setNetworkSelectionModeAutomatic from AIDL. Exception" + ex);
}
}
@Override
public void setNetworkSelectionModeManual(int serial, String operatorNumeric, int ran) {
Log.d(TAG, "setNetworkSelectionModeManual");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setNetworkSelectionModeManualResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setNetworkSelectionModeManual from AIDL. Exception" + ex);
}
}
@Override
public void setNrDualConnectivityState(int serial, byte nrDualConnectivityState) {
Log.d(TAG, "setNrDualConnectivityState");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setNrDualConnectivityStateResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setNrDualConnectivityState from AIDL. Exception" + ex);
}
}
@Override
public void setResponseFunctions(
IRadioNetworkResponse radioNetworkResponse,
IRadioNetworkIndication radioNetworkIndication) {
Log.d(TAG, "setResponseFunctions");
mRadioNetworkResponse = radioNetworkResponse;
mRadioNetworkIndication = radioNetworkIndication;
mService.countDownLatch(MockModemService.LATCH_RADIO_INTERFACES_READY);
}
@Override
public void setSignalStrengthReportingCriteria(
int serial, SignalThresholdInfo[] signalThresholdInfos) {
Log.d(TAG, "setSignalStrengthReportingCriteria");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setSignalStrengthReportingCriteriaResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setSignalStrengthReportingCriteria from AIDL. Exception" + ex);
}
}
@Override
public void setSuppServiceNotifications(int serial, boolean enable) {
Log.d(TAG, "setSuppServiceNotifications");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setSuppServiceNotificationsResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setSuppServiceNotifications from AIDL. Exception" + ex);
}
}
@Override
public void setSystemSelectionChannels(
int serial, boolean specifyChannels, RadioAccessSpecifier[] specifiers) {
Log.d(TAG, "setSystemSelectionChannels");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setSystemSelectionChannelsResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setSystemSelectionChannels from AIDL. Exception" + ex);
}
}
@Override
public void startNetworkScan(int serial, NetworkScanRequest request) {
Log.d(TAG, "startNetworkScan");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.startNetworkScanResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to startNetworkScan from AIDL. Exception" + ex);
}
}
@Override
public void stopNetworkScan(int serial) {
Log.d(TAG, "stopNetworkScan");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.stopNetworkScanResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to stopNetworkScan from AIDL. Exception" + ex);
}
}
@Override
public void supplyNetworkDepersonalization(int serial, String netPin) {
Log.d(TAG, "supplyNetworkDepersonalization");
int remainingRetries = 0;
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.supplyNetworkDepersonalizationResponse(rsp, remainingRetries);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to supplyNetworkDepersonalization from AIDL. Exception" + ex);
}
}
@Override
public void setUsageSetting(int serial, int usageSetting) {
Log.d(TAG, "setUsageSetting");
int remainingRetries = 0;
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.setUsageSettingResponse(rsp);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to setUsageSetting from AIDL. Exception" + ex);
}
}
@Override
public void getUsageSetting(int serial) {
Log.d(TAG, "getUsageSetting");
RadioResponseInfo rsp = mService.makeSolRsp(serial, RadioError.REQUEST_NOT_SUPPORTED);
try {
mRadioNetworkResponse.getUsageSettingResponse(rsp, -1 /* Invalid value */);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to getUsageSetting from AIDL. Exception" + ex);
}
}
@Override
public String getInterfaceHash() {
return IRadioNetwork.HASH;
}
@Override
public int getInterfaceVersion() {
return IRadioNetwork.VERSION;
}
public void unsolNetworkStateChanged() {
Log.d(TAG, "unsolNetworkStateChanged");
// Notify other module
notifyServiceStateChange();
if (mRadioNetworkIndication != null) {
try {
mRadioNetworkIndication.networkStateChanged(RadioIndicationType.UNSOLICITED);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to invoke networkStateChanged from AIDL. Exception" + ex);
}
} else {
Log.e(TAG, "null mRadioNetworkIndication");
}
}
public void unsolCurrentSignalStrength() {
Log.d(TAG, "unsolCurrentSignalStrength");
if (mRadioState != MockModemConfigInterface.RADIO_STATE_ON) {
return;
}
if (mRadioNetworkIndication != null) {
android.hardware.radio.network.SignalStrength signalStrength =
new android.hardware.radio.network.SignalStrength();
synchronized (mCacheUpdateMutex) {
signalStrength = mServiceState.getSignalStrength();
}
try {
mRadioNetworkIndication.currentSignalStrength(
RadioIndicationType.UNSOLICITED, signalStrength);
} catch (RemoteException ex) {
Log.e(
TAG,
"Failed to invoke currentSignalStrength change from AIDL. Exception" + ex);
}
} else {
Log.e(TAG, "null mRadioNetworkIndication");
}
}
public void unsolCellInfoList() {
Log.d(TAG, "unsolCellInfoList");
if (mRadioState != MockModemConfigInterface.RADIO_STATE_ON) {
return;
}
if (mRadioNetworkIndication != null) {
android.hardware.radio.network.CellInfo[] cells;
synchronized (mCacheUpdateMutex) {
cells = mServiceState.getCells();
}
try {
mRadioNetworkIndication.cellInfoList(RadioIndicationType.UNSOLICITED, cells);
} catch (RemoteException ex) {
Log.e(TAG, "Failed to invoke cellInfoList change from AIDL. Exception" + ex);
}
} else {
Log.e(TAG, "null mRadioNetworkIndication");
}
}
}