blob: 31a009ea8d11b01aa555248b8542bb349ee2b5b8 [file] [log] [blame]
Santos Cordone3d76ab2014-01-28 17:25:20 -08001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Ben Gilad9f2bed32013-12-12 17:43:26 -080017package com.android.telecomm;
18
Santos Cordone3d76ab2014-01-28 17:25:20 -080019import android.os.Handler;
Sailesh Nepal10ea4602014-04-01 17:23:32 -070020import android.os.Message;
Evan Charlton89176372014-07-19 18:23:09 -070021import android.telecomm.PhoneAccountHandle;
Sailesh Nepala439e1b2014-03-11 18:19:58 -070022
Evan Charlton352105c2014-06-03 14:10:54 -070023import com.android.internal.os.SomeArgs;
Sailesh Nepala439e1b2014-03-11 18:19:58 -070024import com.android.internal.telecomm.IInCallAdapter;
Ben Gilad9f2bed32013-12-12 17:43:26 -080025
Santos Cordone3d76ab2014-01-28 17:25:20 -080026/**
27 * Receives call commands and updates from in-call app and passes them through to CallsManager.
28 * {@link InCallController} creates an instance of this class and passes it to the in-call app after
29 * binding to it. This adapter can receive commands and updates until the in-call app is unbound.
30 */
31class InCallAdapter extends IInCallAdapter.Stub {
Sailesh Nepal10ea4602014-04-01 17:23:32 -070032 private static final int MSG_ANSWER_CALL = 0;
33 private static final int MSG_REJECT_CALL = 1;
34 private static final int MSG_PLAY_DTMF_TONE = 2;
35 private static final int MSG_STOP_DTMF_TONE = 3;
36 private static final int MSG_POST_DIAL_CONTINUE = 4;
37 private static final int MSG_DISCONNECT_CALL = 5;
38 private static final int MSG_HOLD_CALL = 6;
39 private static final int MSG_UNHOLD_CALL = 7;
Sailesh Nepal77da19e2014-07-02 21:31:16 -070040 private static final int MSG_PHONE_ACCOUNT_CLICKED = 8;
Sailesh Nepal84fa5f82014-04-02 11:01:11 -070041 private static final int MSG_MUTE = 9;
42 private static final int MSG_SET_AUDIO_ROUTE = 10;
Santos Cordona1610702014-06-04 20:22:56 -070043 private static final int MSG_CONFERENCE = 11;
44 private static final int MSG_SPLIT_FROM_CONFERENCE = 12;
Sailesh Nepale8ecb982014-07-11 17:19:42 -070045 private static final int MSG_SWAP_WITH_BACKGROUND_CALL = 13;
Nancy Chen53ceedc2014-07-08 18:56:51 -070046 private static final int MSG_PHONE_ACCOUNT_SELECTED = 14;
Sailesh Nepal10ea4602014-04-01 17:23:32 -070047
48 private final class InCallAdapterHandler extends Handler {
49 @Override
50 public void handleMessage(Message msg) {
Ihab Awadff7493a2014-06-10 13:47:44 -070051 Call call;
Sailesh Nepal10ea4602014-04-01 17:23:32 -070052 switch (msg.what) {
Andrew Lee38931d02014-07-16 10:17:36 -070053 case MSG_ANSWER_CALL: {
54 SomeArgs args = (SomeArgs) msg.obj;
55 try {
56 call = mCallIdMapper.getCall(args.arg1);
57 int videoState = (int) args.arg2;
58 if (call != null) {
59 mCallsManager.answerCall(call, videoState);
60 } else {
61 Log.w(this, "answerCall, unknown call id: %s", msg.obj);
62 }
63 } finally {
64 args.recycle();
Ihab Awadff7493a2014-06-10 13:47:44 -070065 }
Sailesh Nepal10ea4602014-04-01 17:23:32 -070066 break;
Andrew Lee38931d02014-07-16 10:17:36 -070067 }
Nancy Chen53ceedc2014-07-08 18:56:51 -070068 case MSG_REJECT_CALL: {
Ihab Awadff7493a2014-06-10 13:47:44 -070069 SomeArgs args = (SomeArgs) msg.obj;
70 try {
71 call = mCallIdMapper.getCall(args.arg1);
72 boolean rejectWithMessage = args.argi1 == 1;
73 String textMessage = (String) args.arg2;
74 if (call != null) {
75 mCallsManager.rejectCall(call, rejectWithMessage, textMessage);
76 } else {
77 Log.w(this, "setRingback, unknown call id: %s", args.arg1);
78 }
79 } finally {
80 args.recycle();
81 }
Sailesh Nepal10ea4602014-04-01 17:23:32 -070082 break;
Nancy Chen53ceedc2014-07-08 18:56:51 -070083 }
Sailesh Nepal10ea4602014-04-01 17:23:32 -070084 case MSG_PLAY_DTMF_TONE:
Ihab Awadff7493a2014-06-10 13:47:44 -070085 call = mCallIdMapper.getCall(msg.obj);
86 if (call != null) {
87 mCallsManager.playDtmfTone(call, (char) msg.arg1);
88 } else {
89 Log.w(this, "playDtmfTone, unknown call id: %s", msg.obj);
90 }
Sailesh Nepal10ea4602014-04-01 17:23:32 -070091 break;
92 case MSG_STOP_DTMF_TONE:
Ihab Awadff7493a2014-06-10 13:47:44 -070093 call = mCallIdMapper.getCall(msg.obj);
94 if (call != null) {
95 mCallsManager.stopDtmfTone(call);
96 } else {
97 Log.w(this, "stopDtmfTone, unknown call id: %s", msg.obj);
98 }
Sailesh Nepal10ea4602014-04-01 17:23:32 -070099 break;
100 case MSG_POST_DIAL_CONTINUE:
Ihab Awadff7493a2014-06-10 13:47:44 -0700101 call = mCallIdMapper.getCall(msg.obj);
Evan Charlton352105c2014-06-03 14:10:54 -0700102 mCallsManager.postDialContinue(call, msg.arg1 == 1);
Ihab Awadff7493a2014-06-10 13:47:44 -0700103 call = mCallIdMapper.getCall(msg.obj);
104 if (call != null) {
105 mCallsManager.postDialContinue(call, msg.arg1 == 1);
106 } else {
107 Log.w(this, "postDialContinue, unknown call id: %s", msg.obj);
108 }
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700109 break;
110 case MSG_DISCONNECT_CALL:
Ihab Awadff7493a2014-06-10 13:47:44 -0700111 call = mCallIdMapper.getCall(msg.obj);
112 if (call != null) {
113 mCallsManager.disconnectCall(call);
114 } else {
115 Log.w(this, "disconnectCall, unknown call id: %s", msg.obj);
116 }
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700117 break;
118 case MSG_HOLD_CALL:
Ihab Awadff7493a2014-06-10 13:47:44 -0700119 call = mCallIdMapper.getCall(msg.obj);
120 if (call != null) {
121 mCallsManager.holdCall(call);
122 } else {
123 Log.w(this, "holdCall, unknown call id: %s", msg.obj);
124 }
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700125 break;
126 case MSG_UNHOLD_CALL:
Ihab Awadff7493a2014-06-10 13:47:44 -0700127 call = mCallIdMapper.getCall(msg.obj);
128 if (call != null) {
129 mCallsManager.unholdCall(call);
130 } else {
131 Log.w(this, "unholdCall, unknown call id: %s", msg.obj);
132 }
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700133 break;
Sailesh Nepal77da19e2014-07-02 21:31:16 -0700134 case MSG_PHONE_ACCOUNT_CLICKED:
Ihab Awadff7493a2014-06-10 13:47:44 -0700135 call = mCallIdMapper.getCall(msg.obj);
136 if (call != null) {
Sailesh Nepal77da19e2014-07-02 21:31:16 -0700137 mCallsManager.phoneAccountClicked(call);
Ihab Awadff7493a2014-06-10 13:47:44 -0700138 } else {
Sailesh Nepal77da19e2014-07-02 21:31:16 -0700139 Log.w(this, "phoneAccountClicked, unknown call id: %s", msg.obj);
Ihab Awadff7493a2014-06-10 13:47:44 -0700140 }
Sailesh Nepal84fa5f82014-04-02 11:01:11 -0700141 break;
Nancy Chen53ceedc2014-07-08 18:56:51 -0700142 case MSG_PHONE_ACCOUNT_SELECTED: {
143 SomeArgs args = (SomeArgs) msg.obj;
144 try {
145 call = mCallIdMapper.getCall(args.arg1);
146 if (call != null) {
Evan Charlton89176372014-07-19 18:23:09 -0700147 mCallsManager.phoneAccountSelected(call, (PhoneAccountHandle) args.arg2);
Nancy Chen53ceedc2014-07-08 18:56:51 -0700148 } else {
149 Log.w(this, "phoneAccountSelected, unknown call id: %s", args.arg1);
150 }
151 } finally {
152 args.recycle();
153 }
154 break;
155 }
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700156 case MSG_MUTE:
Ihab Awadff7493a2014-06-10 13:47:44 -0700157 mCallsManager.mute(msg.arg1 == 1);
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700158 break;
159 case MSG_SET_AUDIO_ROUTE:
160 mCallsManager.setAudioRoute(msg.arg1);
161 break;
Santos Cordona1610702014-06-04 20:22:56 -0700162 case MSG_CONFERENCE:
Ihab Awadff7493a2014-06-10 13:47:44 -0700163 call = mCallIdMapper.getCall(msg.obj);
164 if (call != null) {
165 mCallsManager.conference(call);
166 } else {
167 Log.w(this, "conference, unknown call id: %s", msg.obj);
168 }
Santos Cordona1610702014-06-04 20:22:56 -0700169 break;
170 case MSG_SPLIT_FROM_CONFERENCE:
Ihab Awadff7493a2014-06-10 13:47:44 -0700171 call = mCallIdMapper.getCall(msg.obj);
172 if (call != null) {
173 call.splitFromConference();
174 } else {
175 Log.w(this, "splitFromConference, unknown call id: %s", msg.obj);
176 }
Santos Cordona1610702014-06-04 20:22:56 -0700177 break;
Sailesh Nepale8ecb982014-07-11 17:19:42 -0700178 case MSG_SWAP_WITH_BACKGROUND_CALL:
179 call = mCallIdMapper.getCall(msg.obj);
180 if (call != null) {
181 call.swapWithBackgroundCall();
182 } else {
183 Log.w(this, "swapWithBackgroundCall, unknown call id: %s", msg.obj);
184 }
185 break;
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700186 }
187 }
188 }
Santos Cordon61d0f702014-02-19 02:52:23 -0800189
Santos Cordone3d76ab2014-01-28 17:25:20 -0800190 private final CallsManager mCallsManager;
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700191 private final Handler mHandler = new InCallAdapterHandler();
Sailesh Nepale59bb192014-04-01 18:33:59 -0700192 private final CallIdMapper mCallIdMapper;
Santos Cordone3d76ab2014-01-28 17:25:20 -0800193
194 /** Persists the specified parameters. */
Sailesh Nepale59bb192014-04-01 18:33:59 -0700195 public InCallAdapter(CallsManager callsManager, CallIdMapper callIdMapper) {
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700196 ThreadUtil.checkOnMainThread();
Santos Cordone3d76ab2014-01-28 17:25:20 -0800197 mCallsManager = callsManager;
Sailesh Nepale59bb192014-04-01 18:33:59 -0700198 mCallIdMapper = callIdMapper;
Santos Cordone3d76ab2014-01-28 17:25:20 -0800199 }
200
Santos Cordone3d76ab2014-01-28 17:25:20 -0800201 @Override
Andrew Lee38931d02014-07-16 10:17:36 -0700202 public void answerCall(String callId, int videoState) {
203 Log.d(this, "answerCall(%s,%d)", callId, videoState);
Sailesh Nepale59bb192014-04-01 18:33:59 -0700204 mCallIdMapper.checkValidCallId(callId);
Andrew Lee38931d02014-07-16 10:17:36 -0700205 SomeArgs args = SomeArgs.obtain();
206 args.arg1 = callId;
207 args.arg2 = videoState;
208 mHandler.obtainMessage(MSG_ANSWER_CALL, args).sendToTarget();
Santos Cordone3d76ab2014-01-28 17:25:20 -0800209 }
210
Santos Cordone3d76ab2014-01-28 17:25:20 -0800211 @Override
Ihab Awadff7493a2014-06-10 13:47:44 -0700212 public void rejectCall(String callId, boolean rejectWithMessage, String textMessage) {
213 Log.d(this, "rejectCall(%s,%b,%s)", callId, rejectWithMessage, textMessage);
Sailesh Nepale59bb192014-04-01 18:33:59 -0700214 mCallIdMapper.checkValidCallId(callId);
Ihab Awadff7493a2014-06-10 13:47:44 -0700215 SomeArgs args = SomeArgs.obtain();
216 args.arg1 = callId;
217 args.argi1 = rejectWithMessage ? 1 : 0;
218 args.arg2 = textMessage;
219 mHandler.obtainMessage(MSG_REJECT_CALL, args).sendToTarget();
Santos Cordone3d76ab2014-01-28 17:25:20 -0800220 }
221
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700222 @Override
223 public void playDtmfTone(String callId, char digit) {
Ihab Awad74549ec2014-03-10 15:33:25 -0700224 Log.d(this, "playDtmfTone(%s,%c)", callId, digit);
Sailesh Nepale59bb192014-04-01 18:33:59 -0700225 mCallIdMapper.checkValidCallId(callId);
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700226 mHandler.obtainMessage(MSG_PLAY_DTMF_TONE, (int) digit, 0, callId).sendToTarget();
Ihab Awad74549ec2014-03-10 15:33:25 -0700227 }
228
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700229 @Override
230 public void stopDtmfTone(String callId) {
Ihab Awad74549ec2014-03-10 15:33:25 -0700231 Log.d(this, "stopDtmfTone(%s)", callId);
Sailesh Nepale59bb192014-04-01 18:33:59 -0700232 mCallIdMapper.checkValidCallId(callId);
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700233 mHandler.obtainMessage(MSG_STOP_DTMF_TONE, callId).sendToTarget();
Ihab Awad74549ec2014-03-10 15:33:25 -0700234 }
235
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700236 @Override
Evan Charlton352105c2014-06-03 14:10:54 -0700237 public void postDialContinue(String callId, boolean proceed) {
Ihab Awad74549ec2014-03-10 15:33:25 -0700238 Log.d(this, "postDialContinue(%s)", callId);
Sailesh Nepale59bb192014-04-01 18:33:59 -0700239 mCallIdMapper.checkValidCallId(callId);
Evan Charlton352105c2014-06-03 14:10:54 -0700240 mHandler.obtainMessage(MSG_POST_DIAL_CONTINUE, proceed ? 1 : 0, 0, callId).sendToTarget();
Ihab Awad74549ec2014-03-10 15:33:25 -0700241 }
242
Santos Cordone3d76ab2014-01-28 17:25:20 -0800243 @Override
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700244 public void disconnectCall(String callId) {
Sailesh Nepale59bb192014-04-01 18:33:59 -0700245 Log.v(this, "disconnectCall: %s", callId);
246 mCallIdMapper.checkValidCallId(callId);
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700247 mHandler.obtainMessage(MSG_DISCONNECT_CALL, callId).sendToTarget();
Santos Cordone3d76ab2014-01-28 17:25:20 -0800248 }
Yorke Leecdf3ebd2014-03-12 18:31:41 -0700249
Yorke Leecdf3ebd2014-03-12 18:31:41 -0700250 @Override
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700251 public void holdCall(String callId) {
Sailesh Nepale59bb192014-04-01 18:33:59 -0700252 mCallIdMapper.checkValidCallId(callId);
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700253 mHandler.obtainMessage(MSG_HOLD_CALL, callId).sendToTarget();
Yorke Leecdf3ebd2014-03-12 18:31:41 -0700254 }
255
Yorke Leecdf3ebd2014-03-12 18:31:41 -0700256 @Override
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700257 public void unholdCall(String callId) {
Sailesh Nepale59bb192014-04-01 18:33:59 -0700258 mCallIdMapper.checkValidCallId(callId);
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700259 mHandler.obtainMessage(MSG_UNHOLD_CALL, callId).sendToTarget();
Yorke Leecdf3ebd2014-03-12 18:31:41 -0700260 }
Sailesh Nepal6aca10a2014-03-24 16:11:02 -0700261
Sailesh Nepal6aca10a2014-03-24 16:11:02 -0700262 @Override
Sailesh Nepal77da19e2014-07-02 21:31:16 -0700263 public void phoneAccountClicked(String callId) {
Sailesh Nepal84fa5f82014-04-02 11:01:11 -0700264 mCallIdMapper.checkValidCallId(callId);
Sailesh Nepal77da19e2014-07-02 21:31:16 -0700265 mHandler.obtainMessage(MSG_PHONE_ACCOUNT_CLICKED, callId).sendToTarget();
Sailesh Nepal84fa5f82014-04-02 11:01:11 -0700266 }
267
Sailesh Nepal84fa5f82014-04-02 11:01:11 -0700268 @Override
Evan Charlton89176372014-07-19 18:23:09 -0700269 public void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle) {
Nancy Chen53ceedc2014-07-08 18:56:51 -0700270 mCallIdMapper.checkValidCallId(callId);
271 SomeArgs args = SomeArgs.obtain();
272 args.arg1 = callId;
Evan Charlton89176372014-07-19 18:23:09 -0700273 args.arg2 = accountHandle;
Nancy Chen53ceedc2014-07-08 18:56:51 -0700274 mHandler.obtainMessage(MSG_PHONE_ACCOUNT_SELECTED, args).sendToTarget();
275 }
276
277 @Override
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700278 public void mute(boolean shouldMute) {
279 mHandler.obtainMessage(MSG_MUTE, shouldMute ? 1 : 0, 0).sendToTarget();
Sailesh Nepal6aca10a2014-03-24 16:11:02 -0700280 }
281
Sailesh Nepal6aca10a2014-03-24 16:11:02 -0700282 @Override
Sailesh Nepal10ea4602014-04-01 17:23:32 -0700283 public void setAudioRoute(int route) {
284 mHandler.obtainMessage(MSG_SET_AUDIO_ROUTE, route, 0).sendToTarget();
Sailesh Nepal6aca10a2014-03-24 16:11:02 -0700285 }
Santos Cordon8f3282c2014-06-01 13:56:02 -0700286
Santos Cordon8f3282c2014-06-01 13:56:02 -0700287 @Override
Santos Cordona1610702014-06-04 20:22:56 -0700288 public void conference(String callId) {
289 mHandler.obtainMessage(MSG_CONFERENCE, callId).sendToTarget();
Santos Cordon8f3282c2014-06-01 13:56:02 -0700290 }
291
Santos Cordon8f3282c2014-06-01 13:56:02 -0700292 @Override
Santos Cordona1610702014-06-04 20:22:56 -0700293 public void splitFromConference(String callId) {
294 mHandler.obtainMessage(MSG_SPLIT_FROM_CONFERENCE, callId).sendToTarget();
Santos Cordon8f3282c2014-06-01 13:56:02 -0700295 }
Sailesh Nepale8ecb982014-07-11 17:19:42 -0700296
297 @Override
298 public void swapWithBackgroundCall(String callId) {
299 mHandler.obtainMessage(MSG_SWAP_WITH_BACKGROUND_CALL, callId).sendToTarget();
300 }
Ben Gilad9f2bed32013-12-12 17:43:26 -0800301}