blob: 0e75c72483d3312e3a6be39abbf08f361ee11967 [file] [log] [blame]
/*
* Copyright (C) 2010, 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.mockril;
import android.os.Bundle;
import android.util.Log;
import com.android.internal.communication.MsgHeader;
import com.android.internal.communication.Msg;
import com.android.internal.telephony.RilChannel;
import com.android.internal.telephony.ril_proto.RilCtrlCmds;
import com.android.internal.telephony.ril_proto.RilCmds;
import com.google.protobuf.micro.MessageMicro;
import java.io.IOException;
/**
* Contain a list of commands to control Mock RIL. Before using these commands the devices
* needs to be set with Mock RIL. Refer to hardware/ril/mockril/README.txt for details.
*
*/
public class MockRilController {
private static final String TAG = "MockRILController";
private RilChannel mRilChannel = null;
private Msg mMessage = null;
public MockRilController() throws IOException {
mRilChannel = RilChannel.makeRilChannel();
}
/**
* Close the channel after the communication is done.
* This method has to be called after the test is finished.
*/
public void closeChannel() {
mRilChannel.close();
}
/**
* Send commands and return true on success
* @param cmd for MsgHeader
* @param token for MsgHeader
* @param status for MsgHeader
* @param pbData for Msg data
* @return true if command is sent successfully, false if it fails
*/
private boolean sendCtrlCommand(int cmd, long token, int status, MessageMicro pbData) {
try {
Msg.send(mRilChannel, cmd, token, status, pbData);
} catch (IOException e) {
Log.v(TAG, "send command : %d failed: " + e.getStackTrace());
return false;
}
return true;
}
/**
* Get control response
* @return Msg if response is received, else return null.
*/
private Msg getCtrlResponse() {
Msg response = null;
try {
response = Msg.recv(mRilChannel);
} catch (IOException e) {
Log.v(TAG, "receive response for getRadioState() error: " + e.getStackTrace());
return null;
}
return response;
}
/**
* @return the radio state if it is valid, otherwise return -1
*/
public int getRadioState() {
if (!sendCtrlCommand(RilCtrlCmds.CTRL_CMD_GET_RADIO_STATE, 0, 0, null)) {
return -1;
}
Msg response = getCtrlResponse();
if (response == null) {
Log.v(TAG, "failed to get response");
return -1;
}
response.printHeader(TAG);
RilCtrlCmds.CtrlRspRadioState resp =
response.getDataAs(RilCtrlCmds.CtrlRspRadioState.class);
int state = resp.getState();
if ((state >= RilCmds.RADIOSTATE_OFF) && (state <= RilCmds.RADIOSTATE_NV_READY))
return state;
else
return -1;
}
/**
* Set the radio state of mock ril to the given state
* @param state for given radio state
* @return true if the state is set successful, false if it fails
*/
public boolean setRadioState(int state) {
RilCtrlCmds.CtrlReqRadioState req = new RilCtrlCmds.CtrlReqRadioState();
if (state < 0 || state > RilCmds.RADIOSTATE_NV_READY) {
Log.v(TAG, "the give radio state is not valid.");
return false;
}
req.setState(state);
if (!sendCtrlCommand(RilCtrlCmds.CTRL_CMD_SET_RADIO_STATE, 0, 0, req)) {
Log.v(TAG, "send set radio state request failed.");
return false;
}
Msg response = getCtrlResponse();
if (response == null) {
Log.v(TAG, "failed to get response for setRadioState");
return false;
}
response.printHeader(TAG);
RilCtrlCmds.CtrlRspRadioState resp =
response.getDataAs(RilCtrlCmds.CtrlRspRadioState.class);
int curstate = resp.getState();
return curstate == state;
}
/**
* Start an incoming call for the given phone number
*
* @param phoneNumber is the number to show as incoming call
* @return true if the incoming call is started successfully, false if it fails.
*/
public boolean startIncomingCall(String phoneNumber) {
RilCtrlCmds.CtrlReqSetMTCall req = new RilCtrlCmds.CtrlReqSetMTCall();
req.setPhoneNumber(phoneNumber);
if (!sendCtrlCommand(RilCtrlCmds.CTRL_CMD_SET_MT_CALL, 0, 0, req)) {
Log.v(TAG, "send CMD_SET_MT_CALL request failed");
return false;
}
return true;
}
/**
* Hang up a connection remotelly for the given call fail cause
*
* @param connectionID is the connection to be hung up
* @param failCause is the call fail cause defined in ril.h
* @return true if the hangup is successful, false if it fails
*/
public boolean hangupRemote(int connectionId, int failCause) {
RilCtrlCmds.CtrlHangupConnRemote req = new RilCtrlCmds.CtrlHangupConnRemote();
req.setConnectionId(connectionId);
req.setCallFailCause(failCause);
if (!sendCtrlCommand(RilCtrlCmds.CTRL_CMD_HANGUP_CONN_REMOTE, 0, 0, req)) {
Log.v(TAG, "send CTRL_CMD_HANGUP_CONN_REMOTE request failed");
return false;
}
return true;
}
/**
* Set call transition flag to the Mock Ril
*
* @param flag is a boolean value for the call transiton flag
* true: call transition: dialing->alert, alert->active is controlled
* false: call transition is automatically handled by Mock Ril
* @return true if the request is successful, false if it failed to set the flag
*/
public boolean setCallTransitionFlag(boolean flag) {
RilCtrlCmds.CtrlSetCallTransitionFlag req = new RilCtrlCmds.CtrlSetCallTransitionFlag();
req.setFlag(flag);
if (!sendCtrlCommand(RilCtrlCmds.CTRL_CMD_SET_CALL_TRANSITION_FLAG, 0, 0, req)) {
Log.v(TAG, "send CTRL_CMD_SET_CALL_TRANSITION_FLAG request failed");
return false;
}
return true;
}
/**
* Set the dialing call to alert if the call transition flag is true
*
* @return true if the call transition is successful, false if it fails
*/
public boolean setDialCallToAlert() {
if (!sendCtrlCommand(RilCtrlCmds.CTRL_CMD_SET_CALL_ALERT, 0, 0, null)) {
Log.v(TAG, "send CTRL_CMD_SET_CALL_ALERT request failed");
return false;
}
return true;
}
/**
* Set the alert call to active if the call transition flag is true
*
* @return true if the call transition is successful, false if it fails
*/
public boolean setAlertCallToActive() {
if (!sendCtrlCommand(RilCtrlCmds.CTRL_CMD_SET_CALL_ACTIVE, 0, 0, null)) {
Log.v(TAG, "send CTRL_CMD_SET_CALL_ACTIVE request failed");
return false;
}
return true;
}
}