• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
17 package com.android.server.telecom;
18 
19 import android.os.Binder;
20 import android.os.Bundle;
21 import android.telecom.Log;
22 import android.telecom.PhoneAccountHandle;
23 
24 import com.android.internal.telecom.IInCallAdapter;
25 
26 import java.util.List;
27 
28 /**
29  * Receives call commands and updates from in-call app and passes them through to CallsManager.
30  * {@link InCallController} creates an instance of this class and passes it to the in-call app after
31  * binding to it. This adapter can receive commands and updates until the in-call app is unbound.
32  */
33 class InCallAdapter extends IInCallAdapter.Stub {
34     private final CallsManager mCallsManager;
35     private final CallIdMapper mCallIdMapper;
36     private final TelecomSystem.SyncRoot mLock;
37     private final String mOwnerComponentName;
38 
39     /** Persists the specified parameters. */
InCallAdapter(CallsManager callsManager, CallIdMapper callIdMapper, TelecomSystem.SyncRoot lock, String ownerComponentName)40     public InCallAdapter(CallsManager callsManager, CallIdMapper callIdMapper,
41             TelecomSystem.SyncRoot lock, String ownerComponentName) {
42         mCallsManager = callsManager;
43         mCallIdMapper = callIdMapper;
44         mLock = lock;
45         mOwnerComponentName = ownerComponentName;
46     }
47 
48     @Override
answerCall(String callId, int videoState)49     public void answerCall(String callId, int videoState) {
50         try {
51             Log.startSession(LogUtils.Sessions.ICA_ANSWER_CALL, mOwnerComponentName);
52             long token = Binder.clearCallingIdentity();
53             try {
54                 synchronized (mLock) {
55                     Log.d(this, "answerCall(%s,%d)", callId, videoState);
56                     Call call = mCallIdMapper.getCall(callId);
57                     if (call != null) {
58                         mCallsManager.answerCall(call, videoState);
59                     } else {
60                         Log.w(this, "answerCall, unknown call id: %s", callId);
61                     }
62                 }
63             } finally {
64                 Binder.restoreCallingIdentity(token);
65             }
66         } finally {
67             Log.endSession();
68         }
69     }
70 
71     @Override
rejectCall(String callId, boolean rejectWithMessage, String textMessage)72     public void rejectCall(String callId, boolean rejectWithMessage, String textMessage) {
73         try {
74             Log.startSession(LogUtils.Sessions.ICA_REJECT_CALL, mOwnerComponentName);
75             long token = Binder.clearCallingIdentity();
76             try {
77                 synchronized (mLock) {
78                     Log.d(this, "rejectCall(%s,%b,%s)", callId, rejectWithMessage, textMessage);
79                     Call call = mCallIdMapper.getCall(callId);
80                     if (call != null) {
81                         mCallsManager.rejectCall(call, rejectWithMessage, textMessage);
82                     } else {
83                         Log.w(this, "setRingback, unknown call id: %s", callId);
84                     }
85                 }
86             } finally {
87                 Binder.restoreCallingIdentity(token);
88             }
89         } finally {
90             Log.endSession();
91         }
92     }
93 
94     @Override
playDtmfTone(String callId, char digit)95     public void playDtmfTone(String callId, char digit) {
96         try {
97             Log.startSession("ICA.pDT", mOwnerComponentName);
98             long token = Binder.clearCallingIdentity();
99             try {
100                 synchronized (mLock) {
101                     Log.d(this, "playDtmfTone(%s,%c)", callId, digit);
102                     Call call = mCallIdMapper.getCall(callId);
103                     if (call != null) {
104                         mCallsManager.playDtmfTone(call, digit);
105                     } else {
106                         Log.w(this, "playDtmfTone, unknown call id: %s", callId);
107                     }
108                 }
109             } finally {
110                 Binder.restoreCallingIdentity(token);
111             }
112         } finally {
113             Log.endSession();
114         }
115     }
116 
117     @Override
stopDtmfTone(String callId)118     public void stopDtmfTone(String callId) {
119         try {
120             Log.startSession("ICA.sDT", mOwnerComponentName);
121             long token = Binder.clearCallingIdentity();
122             try {
123                 synchronized (mLock) {
124                     Log.d(this, "stopDtmfTone(%s)", callId);
125                     Call call = mCallIdMapper.getCall(callId);
126                     if (call != null) {
127                         mCallsManager.stopDtmfTone(call);
128                     } else {
129                         Log.w(this, "stopDtmfTone, unknown call id: %s", callId);
130                     }
131                 }
132             } finally {
133                 Binder.restoreCallingIdentity(token);
134             }
135         } finally {
136             Log.endSession();
137         }
138     }
139 
140     @Override
postDialContinue(String callId, boolean proceed)141     public void postDialContinue(String callId, boolean proceed) {
142         try {
143             Log.startSession("ICA.pDC", mOwnerComponentName);
144             long token = Binder.clearCallingIdentity();
145             try {
146                 synchronized (mLock) {
147                     Log.d(this, "postDialContinue(%s)", callId);
148                     Call call = mCallIdMapper.getCall(callId);
149                     if (call != null) {
150                         mCallsManager.postDialContinue(call, proceed);
151                     } else {
152                         Log.w(this, "postDialContinue, unknown call id: %s", callId);
153                     }
154                 }
155             } finally {
156                 Binder.restoreCallingIdentity(token);
157             }
158         } finally {
159             Log.endSession();
160         }
161     }
162 
163     @Override
disconnectCall(String callId)164     public void disconnectCall(String callId) {
165         try {
166             Log.startSession(LogUtils.Sessions.ICA_DISCONNECT_CALL, mOwnerComponentName);
167             long token = Binder.clearCallingIdentity();
168             try {
169                 synchronized (mLock) {
170                     Log.v(this, "disconnectCall: %s", callId);
171                     Call call = mCallIdMapper.getCall(callId);
172                     if (call != null) {
173                         mCallsManager.disconnectCall(call);
174                     } else {
175                         Log.w(this, "disconnectCall, unknown call id: %s", callId);
176                     }
177                 }
178             } finally {
179                 Binder.restoreCallingIdentity(token);
180             }
181         } finally {
182             Log.endSession();
183         }
184     }
185 
186     @Override
holdCall(String callId)187     public void holdCall(String callId) {
188         try {
189             Log.startSession(LogUtils.Sessions.ICA_HOLD_CALL, mOwnerComponentName);
190             long token = Binder.clearCallingIdentity();
191             try {
192                 synchronized (mLock) {
193                     Call call = mCallIdMapper.getCall(callId);
194                     if (call != null) {
195                         mCallsManager.holdCall(call);
196                     } else {
197                         Log.w(this, "holdCall, unknown call id: %s", callId);
198                     }
199                 }
200             } finally {
201                 Binder.restoreCallingIdentity(token);
202             }
203         } finally {
204             Log.endSession();
205         }
206     }
207 
208     @Override
unholdCall(String callId)209     public void unholdCall(String callId) {
210         try {
211             Log.startSession(LogUtils.Sessions.ICA_UNHOLD_CALL, mOwnerComponentName);
212             long token = Binder.clearCallingIdentity();
213             try {
214                 synchronized (mLock) {
215                     Call call = mCallIdMapper.getCall(callId);
216                     if (call != null) {
217                         mCallsManager.unholdCall(call);
218                     } else {
219                         Log.w(this, "unholdCall, unknown call id: %s", callId);
220                     }
221                 }
222             } finally {
223                 Binder.restoreCallingIdentity(token);
224             }
225         } finally {
226             Log.endSession();
227         }
228     }
229 
230     @Override
phoneAccountSelected(String callId, PhoneAccountHandle accountHandle, boolean setDefault)231     public void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle,
232             boolean setDefault) {
233         try {
234             Log.startSession("ICA.pAS", mOwnerComponentName);
235             long token = Binder.clearCallingIdentity();
236             try {
237                 synchronized (mLock) {
238                     Call call = mCallIdMapper.getCall(callId);
239                     if (call != null) {
240                         mCallsManager.phoneAccountSelected(call, accountHandle, setDefault);
241                     } else {
242                         Log.w(this, "phoneAccountSelected, unknown call id: %s", callId);
243                     }
244                 }
245             } finally {
246                 Binder.restoreCallingIdentity(token);
247             }
248         } finally {
249             Log.endSession();
250         }
251     }
252 
253     @Override
mute(boolean shouldMute)254     public void mute(boolean shouldMute) {
255         try {
256             Log.startSession(LogUtils.Sessions.ICA_MUTE, mOwnerComponentName);
257             long token = Binder.clearCallingIdentity();
258             try {
259                 synchronized (mLock) {
260                     mCallsManager.mute(shouldMute);
261                 }
262             } finally {
263                 Binder.restoreCallingIdentity(token);
264             }
265         } finally {
266             Log.endSession();
267         }
268     }
269 
270     @Override
setAudioRoute(int route)271     public void setAudioRoute(int route) {
272         try {
273             Log.startSession(LogUtils.Sessions.ICA_SET_AUDIO_ROUTE, mOwnerComponentName);
274             long token = Binder.clearCallingIdentity();
275             try {
276                 synchronized (mLock) {
277                     mCallsManager.setAudioRoute(route);
278                 }
279             } finally {
280                 Binder.restoreCallingIdentity(token);
281             }
282         } finally {
283             Log.endSession();
284         }
285     }
286 
287     @Override
conference(String callId, String otherCallId)288     public void conference(String callId, String otherCallId) {
289         try {
290             Log.startSession(LogUtils.Sessions.ICA_CONFERENCE, mOwnerComponentName);
291             long token = Binder.clearCallingIdentity();
292             try {
293                 synchronized (mLock) {
294                     Call call = mCallIdMapper.getCall(callId);
295                     Call otherCall = mCallIdMapper.getCall(otherCallId);
296                     if (call != null && otherCall != null) {
297                         mCallsManager.conference(call, otherCall);
298                     } else {
299                         Log.w(this, "conference, unknown call id: %s or %s", callId, otherCallId);
300                     }
301                 }
302             } finally {
303                 Binder.restoreCallingIdentity(token);
304             }
305         } finally {
306             Log.endSession();
307         }
308     }
309 
310     @Override
splitFromConference(String callId)311     public void splitFromConference(String callId) {
312         try {
313             Log.startSession("ICA.sFC", mOwnerComponentName);
314             long token = Binder.clearCallingIdentity();
315             try {
316                 synchronized (mLock) {
317                     Call call = mCallIdMapper.getCall(callId);
318                     if (call != null) {
319                         call.splitFromConference();
320                     } else {
321                         Log.w(this, "splitFromConference, unknown call id: %s", callId);
322                     }
323                 }
324             } finally {
325                 Binder.restoreCallingIdentity(token);
326             }
327         } finally {
328             Log.endSession();
329         }
330     }
331 
332     @Override
mergeConference(String callId)333     public void mergeConference(String callId) {
334         try {
335             Log.startSession("ICA.mC", mOwnerComponentName);
336             long token = Binder.clearCallingIdentity();
337             try {
338                 synchronized (mLock) {
339                     Call call = mCallIdMapper.getCall(callId);
340                     if (call != null) {
341                         call.mergeConference();
342                     } else {
343                         Log.w(this, "mergeConference, unknown call id: %s", callId);
344                     }
345                 }
346             } finally {
347                 Binder.restoreCallingIdentity(token);
348             }
349         } finally {
350             Log.endSession();
351         }
352     }
353 
354     @Override
swapConference(String callId)355     public void swapConference(String callId) {
356         try {
357             Log.startSession("ICA.sC", mOwnerComponentName);
358             long token = Binder.clearCallingIdentity();
359             try {
360                 synchronized (mLock) {
361                     Call call = mCallIdMapper.getCall(callId);
362                     if (call != null) {
363                         call.swapConference();
364                     } else {
365                         Log.w(this, "swapConference, unknown call id: %s", callId);
366                     }
367                 }
368             } finally {
369                 Binder.restoreCallingIdentity(token);
370             }
371         } finally {
372             Log.endSession();
373         }
374     }
375 
376     @Override
pullExternalCall(String callId)377     public void pullExternalCall(String callId) {
378         try {
379             Log.startSession("ICA.pEC", mOwnerComponentName);
380             long token = Binder.clearCallingIdentity();
381             try {
382                 synchronized (mLock) {
383                     Call call = mCallIdMapper.getCall(callId);
384                     if (call != null) {
385                         call.pullExternalCall();
386                     } else {
387                         Log.w(this, "pullExternalCall, unknown call id: %s", callId);
388                     }
389                 }
390             } finally {
391                 Binder.restoreCallingIdentity(token);
392             }
393         } finally {
394             Log.endSession();
395         }
396     }
397 
398     @Override
sendCallEvent(String callId, String event, Bundle extras)399     public void sendCallEvent(String callId, String event, Bundle extras) {
400         try {
401             Log.startSession("ICA.sCE", mOwnerComponentName);
402             long token = Binder.clearCallingIdentity();
403             try {
404                 synchronized (mLock) {
405                     Call call = mCallIdMapper.getCall(callId);
406                     if (call != null) {
407                         call.sendCallEvent(event, extras);
408                     } else {
409                         Log.w(this, "sendCallEvent, unknown call id: %s", callId);
410                     }
411                 }
412             } finally {
413                 Binder.restoreCallingIdentity(token);
414             }
415         } finally {
416             Log.endSession();
417         }
418     }
419 
420     @Override
putExtras(String callId, Bundle extras)421     public void putExtras(String callId, Bundle extras) {
422         try {
423             Log.startSession("ICA.pE", mOwnerComponentName);
424             long token = Binder.clearCallingIdentity();
425             try {
426                 synchronized (mLock) {
427                     Call call = mCallIdMapper.getCall(callId);
428                     if (call != null) {
429                         call.putExtras(Call.SOURCE_INCALL_SERVICE, extras);
430                     } else {
431                         Log.w(this, "putExtras, unknown call id: %s", callId);
432                     }
433                 }
434             } finally {
435                 Binder.restoreCallingIdentity(token);
436             }
437         } finally {
438             Log.endSession();
439         }
440     }
441 
442     @Override
removeExtras(String callId, List<String> keys)443     public void removeExtras(String callId, List<String> keys) {
444         try {
445             Log.startSession("ICA.rE", mOwnerComponentName);
446             long token = Binder.clearCallingIdentity();
447             try {
448                 synchronized (mLock) {
449                     Call call = mCallIdMapper.getCall(callId);
450                     if (call != null) {
451                         call.removeExtras(Call.SOURCE_INCALL_SERVICE, keys);
452                     } else {
453                         Log.w(this, "removeExtra, unknown call id: %s", callId);
454                     }
455                 }
456             } finally {
457                 Binder.restoreCallingIdentity(token);
458             }
459         } finally {
460             Log.endSession();
461         }
462     }
463 
464     @Override
turnOnProximitySensor()465     public void turnOnProximitySensor() {
466         try {
467             Log.startSession("ICA.tOnPS", mOwnerComponentName);
468             long token = Binder.clearCallingIdentity();
469             try {
470                 synchronized (mLock) {
471                     mCallsManager.turnOnProximitySensor();
472                 }
473             } finally {
474                 Binder.restoreCallingIdentity(token);
475             }
476         } finally {
477             Log.endSession();
478         }
479     }
480 
481     @Override
turnOffProximitySensor(boolean screenOnImmediately)482     public void turnOffProximitySensor(boolean screenOnImmediately) {
483         try {
484             Log.startSession("ICA.tOffPS", mOwnerComponentName);
485             long token = Binder.clearCallingIdentity();
486             try {
487                 synchronized (mLock) {
488                     mCallsManager.turnOffProximitySensor(screenOnImmediately);
489                 }
490             } finally {
491                 Binder.restoreCallingIdentity(token);
492             }
493         } finally {
494              Log.endSession();
495         }
496     }
497 
498     @Override
sendRttRequest(String callId)499     public void sendRttRequest(String callId) {
500         try {
501             Log.startSession("ICA.sRR");
502             long token = Binder.clearCallingIdentity();
503             try {
504                 synchronized (mLock) {
505                     Call call = mCallIdMapper.getCall(callId);
506                     if (call != null) {
507                         call.sendRttRequest();
508                     } else {
509                         Log.w(this, "stopRtt(): call %s not found", callId);
510                     }
511                 }
512             } finally {
513                 Binder.restoreCallingIdentity(token);
514             }
515         } finally {
516             Log.endSession();
517         }
518     }
519 
520     @Override
respondToRttRequest(String callId, int id, boolean accept)521     public void respondToRttRequest(String callId, int id, boolean accept) {
522         try {
523             Log.startSession("ICA.rTRR");
524             long token = Binder.clearCallingIdentity();
525             try {
526                 synchronized (mLock) {
527                     Call call = mCallIdMapper.getCall(callId);
528                     if (call != null) {
529                         call.handleRttRequestResponse(id, accept);
530                     } else {
531                         Log.w(this, "respondToRttRequest(): call %s not found", callId);
532                     }
533                 }
534             } finally {
535                 Binder.restoreCallingIdentity(token);
536             }
537         } finally {
538             Log.endSession();
539         }
540     }
541 
542     @Override
stopRtt(String callId)543     public void stopRtt(String callId) {
544         try {
545             Log.startSession("ICA.sRTT");
546             long token = Binder.clearCallingIdentity();
547             try {
548                 synchronized (mLock) {
549                     Call call = mCallIdMapper.getCall(callId);
550                     if (call != null) {
551                         call.stopRtt();
552                     } else {
553                         Log.w(this, "stopRtt(): call %s not found", callId);
554                     }
555                 }
556             } finally {
557                 Binder.restoreCallingIdentity(token);
558             }
559         } finally {
560             Log.endSession();
561         }
562     }
563 
564     @Override
setRttMode(String callId, int mode)565     public void setRttMode(String callId, int mode) {
566         try {
567             Log.startSession("ICA.sRM");
568             long token = Binder.clearCallingIdentity();
569             try {
570                 synchronized (mLock) {
571                     // TODO
572                 }
573             } finally {
574                 Binder.restoreCallingIdentity(token);
575             }
576         } finally {
577             Log.endSession();
578         }
579     }
580 }
581