Use mapped IDs for calls
With this CL each client gets a unique ID to represent calls.
This has a couple of benefits:
- avoids one client from modifying another clients call
- allows for stricter validation of input
- allows a call to handed off to a different call service
(with a different call ID)
Bug: 13643568
Change-Id: I6e2039aead5723d01f9442a4e54f5e616711a3b3
diff --git a/src/com/android/telecomm/InCallAdapter.java b/src/com/android/telecomm/InCallAdapter.java
index c0dbb7b..14669c6 100644
--- a/src/com/android/telecomm/InCallAdapter.java
+++ b/src/com/android/telecomm/InCallAdapter.java
@@ -41,30 +41,39 @@
private final class InCallAdapterHandler extends Handler {
@Override
public void handleMessage(Message msg) {
+ Call call = null;
+ if (msg.obj != null) {
+ call = mCallIdMapper.getCall(msg.obj);
+ if (call == null) {
+ Log.w(this, "Unknown call id: %s, msg: %d", msg.obj, msg.what);
+ return;
+ }
+ }
+
switch (msg.what) {
case MSG_ANSWER_CALL:
- mCallsManager.answerCall((String) msg.obj);
+ mCallsManager.answerCall(call);
break;
case MSG_REJECT_CALL:
- mCallsManager.rejectCall((String) msg.obj);
+ mCallsManager.rejectCall(call);
break;
case MSG_PLAY_DTMF_TONE:
- mCallsManager.playDtmfTone((String) msg.obj, (char) msg.arg1);
+ mCallsManager.playDtmfTone(call, (char) msg.arg1);
break;
case MSG_STOP_DTMF_TONE:
- mCallsManager.stopDtmfTone((String) msg.obj);
+ mCallsManager.stopDtmfTone(call);
break;
case MSG_POST_DIAL_CONTINUE:
- mCallsManager.postDialContinue((String) msg.obj);
+ mCallsManager.postDialContinue(call);
break;
case MSG_DISCONNECT_CALL:
- mCallsManager.disconnectCall((String) msg.obj);
+ mCallsManager.disconnectCall(call);
break;
case MSG_HOLD_CALL:
- mCallsManager.holdCall((String) msg.obj);
+ mCallsManager.holdCall(call);
break;
case MSG_UNHOLD_CALL:
- mCallsManager.unholdCall((String) msg.obj);
+ mCallsManager.unholdCall(call);
break;
case MSG_MUTE:
mCallsManager.mute(msg.arg1 == 1 ? true : false);
@@ -78,17 +87,20 @@
private final CallsManager mCallsManager;
private final Handler mHandler = new InCallAdapterHandler();
+ private final CallIdMapper mCallIdMapper;
/** Persists the specified parameters. */
- public InCallAdapter(CallsManager callsManager) {
+ public InCallAdapter(CallsManager callsManager, CallIdMapper callIdMapper) {
ThreadUtil.checkOnMainThread();
mCallsManager = callsManager;
+ mCallIdMapper = callIdMapper;
}
/** {@inheritDoc} */
@Override
public void answerCall(String callId) {
Log.d(this, "answerCall(%s)", callId);
+ mCallIdMapper.checkValidCallId(callId);
mHandler.obtainMessage(MSG_ANSWER_CALL, callId).sendToTarget();
}
@@ -96,6 +108,7 @@
@Override
public void rejectCall(String callId) {
Log.d(this, "rejectCall(%s)", callId);
+ mCallIdMapper.checkValidCallId(callId);
mHandler.obtainMessage(MSG_REJECT_CALL, callId).sendToTarget();
}
@@ -103,6 +116,7 @@
@Override
public void playDtmfTone(String callId, char digit) {
Log.d(this, "playDtmfTone(%s,%c)", callId, digit);
+ mCallIdMapper.checkValidCallId(callId);
mHandler.obtainMessage(MSG_PLAY_DTMF_TONE, (int) digit, 0, callId).sendToTarget();
}
@@ -110,6 +124,7 @@
@Override
public void stopDtmfTone(String callId) {
Log.d(this, "stopDtmfTone(%s)", callId);
+ mCallIdMapper.checkValidCallId(callId);
mHandler.obtainMessage(MSG_STOP_DTMF_TONE, callId).sendToTarget();
}
@@ -117,24 +132,29 @@
@Override
public void postDialContinue(String callId) {
Log.d(this, "postDialContinue(%s)", callId);
+ mCallIdMapper.checkValidCallId(callId);
mHandler.obtainMessage(MSG_POST_DIAL_CONTINUE, callId).sendToTarget();
}
/** {@inheritDoc} */
@Override
public void disconnectCall(String callId) {
+ Log.v(this, "disconnectCall: %s", callId);
+ mCallIdMapper.checkValidCallId(callId);
mHandler.obtainMessage(MSG_DISCONNECT_CALL, callId).sendToTarget();
}
/** {@inheritDoc} */
@Override
public void holdCall(String callId) {
+ mCallIdMapper.checkValidCallId(callId);
mHandler.obtainMessage(MSG_HOLD_CALL, callId).sendToTarget();
}
/** {@inheritDoc} */
@Override
public void unholdCall(String callId) {
+ mCallIdMapper.checkValidCallId(callId);
mHandler.obtainMessage(MSG_UNHOLD_CALL, callId).sendToTarget();
}