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 android.telecom;
18 
19 import android.net.Uri;
20 import android.bluetooth.BluetoothDevice;
21 import android.os.Bundle;
22 import android.os.RemoteException;
23 
24 import com.android.internal.telecom.IInCallAdapter;
25 
26 import java.util.List;
27 
28 /**
29  * Receives commands from {@link InCallService} implementations which should be executed by
30  * Telecom. When Telecom binds to a {@link InCallService}, an instance of this class is given to
31  * the in-call service through which it can manipulate live (active, dialing, ringing) calls. When
32  * the in-call service is notified of new calls, it can use the
33  * given call IDs to execute commands such as {@link #answerCall} for incoming calls or
34  * {@link #disconnectCall} for active calls the user would like to end. Some commands are only
35  * appropriate for calls in certain states; please consult each method for such limitations.
36  * <p>
37  * The adapter will stop functioning when there are no more calls.
38  *
39  * @hide
40  */
41 public final class InCallAdapter {
42     private final IInCallAdapter mAdapter;
43 
44     /**
45      * {@hide}
46      */
InCallAdapter(IInCallAdapter adapter)47     public InCallAdapter(IInCallAdapter adapter) {
48         mAdapter = adapter;
49     }
50 
51     /**
52      * Instructs Telecom to answer the specified call.
53      *
54      * @param callId The identifier of the call to answer.
55      * @param videoState The video state in which to answer the call.
56      */
answerCall(String callId, int videoState)57     public void answerCall(String callId, int videoState) {
58         try {
59             mAdapter.answerCall(callId, videoState);
60         } catch (RemoteException e) {
61         }
62     }
63 
64     /**
65      * Instructs Telecom to deflect the specified call.
66      *
67      * @param callId The identifier of the call to deflect.
68      * @param address The address to deflect.
69      */
deflectCall(String callId, Uri address)70     public void deflectCall(String callId, Uri address) {
71         try {
72             mAdapter.deflectCall(callId, address);
73         } catch (RemoteException e) {
74         }
75     }
76 
77     /**
78      * Instructs Telecom to reject the specified call.
79      *
80      * @param callId The identifier of the call to reject.
81      * @param rejectWithMessage Whether to reject with a text message.
82      * @param textMessage An optional text message with which to respond.
83      */
rejectCall(String callId, boolean rejectWithMessage, String textMessage)84     public void rejectCall(String callId, boolean rejectWithMessage, String textMessage) {
85         try {
86             mAdapter.rejectCall(callId, rejectWithMessage, textMessage);
87         } catch (RemoteException e) {
88         }
89     }
90 
91     /**
92      * Instructs Telecom to disconnect the specified call.
93      *
94      * @param callId The identifier of the call to disconnect.
95      */
disconnectCall(String callId)96     public void disconnectCall(String callId) {
97         try {
98             mAdapter.disconnectCall(callId);
99         } catch (RemoteException e) {
100         }
101     }
102 
103     /**
104      * Instructs Telecom to put the specified call on hold.
105      *
106      * @param callId The identifier of the call to put on hold.
107      */
holdCall(String callId)108     public void holdCall(String callId) {
109         try {
110             mAdapter.holdCall(callId);
111         } catch (RemoteException e) {
112         }
113     }
114 
115     /**
116      * Instructs Telecom to release the specified call from hold.
117      *
118      * @param callId The identifier of the call to release from hold.
119      */
unholdCall(String callId)120     public void unholdCall(String callId) {
121         try {
122             mAdapter.unholdCall(callId);
123         } catch (RemoteException e) {
124         }
125     }
126 
127     /**
128      * Mute the microphone.
129      *
130      * @param shouldMute True if the microphone should be muted.
131      */
mute(boolean shouldMute)132     public void mute(boolean shouldMute) {
133         try {
134             mAdapter.mute(shouldMute);
135         } catch (RemoteException e) {
136         }
137     }
138 
139     /**
140      * Sets the audio route (speaker, bluetooth, etc...). See {@link CallAudioState}.
141      *
142      * @param route The audio route to use.
143      */
setAudioRoute(int route)144     public void setAudioRoute(int route) {
145         try {
146             mAdapter.setAudioRoute(route, null);
147         } catch (RemoteException e) {
148         }
149     }
150 
151     /**
152      * Request audio routing to a specific bluetooth device. Calling this method may result in
153      * the device routing audio to a different bluetooth device than the one specified. A list of
154      * available devices can be obtained via {@link CallAudioState#getSupportedBluetoothDevices()}
155      *
156      * @param bluetoothAddress The address of the bluetooth device to connect to, as returned by
157      * {@link BluetoothDevice#getAddress()}, or {@code null} if no device is preferred.
158      */
requestBluetoothAudio(String bluetoothAddress)159     public void requestBluetoothAudio(String bluetoothAddress) {
160         try {
161             mAdapter.setAudioRoute(CallAudioState.ROUTE_BLUETOOTH, bluetoothAddress);
162         } catch (RemoteException e) {
163         }
164     }
165 
166     /**
167      * Instructs Telecom to play a dual-tone multi-frequency signaling (DTMF) tone in a call.
168      *
169      * Any other currently playing DTMF tone in the specified call is immediately stopped.
170      *
171      * @param callId The unique ID of the call in which the tone will be played.
172      * @param digit A character representing the DTMF digit for which to play the tone. This
173      *         value must be one of {@code '0'} through {@code '9'}, {@code '*'} or {@code '#'}.
174      */
playDtmfTone(String callId, char digit)175     public void playDtmfTone(String callId, char digit) {
176         try {
177             mAdapter.playDtmfTone(callId, digit);
178         } catch (RemoteException e) {
179         }
180     }
181 
182     /**
183      * Instructs Telecom to stop any dual-tone multi-frequency signaling (DTMF) tone currently
184      * playing.
185      *
186      * DTMF tones are played by calling {@link #playDtmfTone(String,char)}. If no DTMF tone is
187      * currently playing, this method will do nothing.
188      *
189      * @param callId The unique ID of the call in which any currently playing tone will be stopped.
190      */
stopDtmfTone(String callId)191     public void stopDtmfTone(String callId) {
192         try {
193             mAdapter.stopDtmfTone(callId);
194         } catch (RemoteException e) {
195         }
196     }
197 
198     /**
199      * Instructs Telecom to continue playing a post-dial DTMF string.
200      *
201      * A post-dial DTMF string is a string of digits entered after a phone number, when dialed,
202      * that are immediately sent as DTMF tones to the recipient as soon as the connection is made.
203      * While these tones are playing, Telecom will notify the {@link InCallService} that the call
204      * is in the post dial state.
205      *
206      * If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_PAUSE} symbol, Telecom
207      * will temporarily pause playing the tones for a pre-defined period of time.
208      *
209      * If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_WAIT} symbol, Telecom
210      * will pause playing the tones and notify the {@link InCallService} that the call is in the
211      * post dial wait state. When the user decides to continue the postdial sequence, the
212      * {@link InCallService} should invoke the {@link #postDialContinue(String,boolean)} method.
213      *
214      * @param callId The unique ID of the call for which postdial string playing should continue.
215      * @param proceed Whether or not to continue with the post-dial sequence.
216      */
postDialContinue(String callId, boolean proceed)217     public void postDialContinue(String callId, boolean proceed) {
218         try {
219             mAdapter.postDialContinue(callId, proceed);
220         } catch (RemoteException e) {
221         }
222     }
223 
224     /**
225      * Instructs Telecom to add a PhoneAccountHandle to the specified call.
226      *
227      * @param callId The identifier of the call.
228      * @param accountHandle The PhoneAccountHandle through which to place the call.
229      * @param setDefault {@code True} if this account should be set as the default for calls.
230      */
phoneAccountSelected(String callId, PhoneAccountHandle accountHandle, boolean setDefault)231     public void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle,
232             boolean setDefault) {
233         try {
234             mAdapter.phoneAccountSelected(callId, accountHandle, setDefault);
235         } catch (RemoteException e) {
236         }
237     }
238 
239     /**
240      * Instructs Telecom to conference the specified call.
241      *
242      * @param callId The unique ID of the call.
243      * @hide
244      */
conference(String callId, String otherCallId)245     public void conference(String callId, String otherCallId) {
246         try {
247             mAdapter.conference(callId, otherCallId);
248         } catch (RemoteException ignored) {
249         }
250     }
251 
252     /**
253      * Instructs Telecom to split the specified call from any conference call with which it may be
254      * connected.
255      *
256      * @param callId The unique ID of the call.
257      * @hide
258      */
splitFromConference(String callId)259     public void splitFromConference(String callId) {
260         try {
261             mAdapter.splitFromConference(callId);
262         } catch (RemoteException ignored) {
263         }
264     }
265 
266     /**
267      * Instructs Telecom to merge child calls of the specified conference call.
268      */
mergeConference(String callId)269     public void mergeConference(String callId) {
270         try {
271             mAdapter.mergeConference(callId);
272         } catch (RemoteException ignored) {
273         }
274     }
275 
276     /**
277      * Instructs Telecom to swap the child calls of the specified conference call.
278      */
swapConference(String callId)279     public void swapConference(String callId) {
280         try {
281             mAdapter.swapConference(callId);
282         } catch (RemoteException ignored) {
283         }
284     }
285 
286     /**
287      * Instructs Telecom to pull an external call to the local device.
288      *
289      * @param callId The callId to pull.
290      */
pullExternalCall(String callId)291     public void pullExternalCall(String callId) {
292         try {
293             mAdapter.pullExternalCall(callId);
294         } catch (RemoteException ignored) {
295         }
296     }
297 
298     /**
299      * Intructs Telecom to send a call event.
300      *
301      * @param callId The callId to send the event for.
302      * @param event The event.
303      * @param targetSdkVer Target sdk version of the app calling this api
304      * @param extras Extras associated with the event.
305      */
sendCallEvent(String callId, String event, int targetSdkVer, Bundle extras)306     public void sendCallEvent(String callId, String event, int targetSdkVer, Bundle extras) {
307         try {
308             mAdapter.sendCallEvent(callId, event, targetSdkVer, extras);
309         } catch (RemoteException ignored) {
310         }
311     }
312 
313     /**
314      * Intructs Telecom to add extras to a call.
315      *
316      * @param callId The callId to add the extras to.
317      * @param extras The extras.
318      */
putExtras(String callId, Bundle extras)319     public void putExtras(String callId, Bundle extras) {
320         try {
321             mAdapter.putExtras(callId, extras);
322         } catch (RemoteException ignored) {
323         }
324     }
325 
326     /**
327      * Intructs Telecom to add an extra to a call.
328      *
329      * @param callId The callId to add the extras to.
330      * @param key The extra key.
331      * @param value The extra value.
332      */
putExtra(String callId, String key, boolean value)333     public void putExtra(String callId, String key, boolean value) {
334         try {
335             Bundle bundle = new Bundle();
336             bundle.putBoolean(key, value);
337             mAdapter.putExtras(callId, bundle);
338         } catch (RemoteException ignored) {
339         }
340     }
341 
342     /**
343      * Intructs Telecom to add an extra to a call.
344      *
345      * @param callId The callId to add the extras to.
346      * @param key The extra key.
347      * @param value The extra value.
348      */
putExtra(String callId, String key, int value)349     public void putExtra(String callId, String key, int value) {
350         try {
351             Bundle bundle = new Bundle();
352             bundle.putInt(key, value);
353             mAdapter.putExtras(callId, bundle);
354         } catch (RemoteException ignored) {
355         }
356     }
357 
358     /**
359      * Intructs Telecom to add an extra to a call.
360      *
361      * @param callId The callId to add the extras to.
362      * @param key The extra key.
363      * @param value The extra value.
364      */
putExtra(String callId, String key, String value)365     public void putExtra(String callId, String key, String value) {
366         try {
367             Bundle bundle = new Bundle();
368             bundle.putString(key, value);
369             mAdapter.putExtras(callId, bundle);
370         } catch (RemoteException ignored) {
371         }
372     }
373 
374     /**
375      * Intructs Telecom to remove extras from a call.
376      * @param callId The callId to remove the extras from.
377      * @param keys The extra keys to remove.
378      */
removeExtras(String callId, List<String> keys)379     public void removeExtras(String callId, List<String> keys) {
380         try {
381             mAdapter.removeExtras(callId, keys);
382         } catch (RemoteException ignored) {
383         }
384     }
385 
386     /**
387      * Instructs Telecom to turn the proximity sensor on.
388      */
turnProximitySensorOn()389     public void turnProximitySensorOn() {
390         try {
391             mAdapter.turnOnProximitySensor();
392         } catch (RemoteException ignored) {
393         }
394     }
395 
396     /**
397      * Instructs Telecom to turn the proximity sensor off.
398      *
399      * @param screenOnImmediately If true, the screen will be turned on immediately if it was
400      * previously off. Otherwise, the screen will only be turned on after the proximity sensor
401      * is no longer triggered.
402      */
turnProximitySensorOff(boolean screenOnImmediately)403     public void turnProximitySensorOff(boolean screenOnImmediately) {
404         try {
405             mAdapter.turnOffProximitySensor(screenOnImmediately);
406         } catch (RemoteException ignored) {
407         }
408     }
409 
410     /**
411      * Sends an RTT upgrade request to the remote end of the connection.
412      */
sendRttRequest(String callId)413     public void sendRttRequest(String callId) {
414         try {
415             mAdapter.sendRttRequest(callId);
416         } catch (RemoteException ignored) {
417         }
418     }
419 
420     /**
421      * Responds to an RTT upgrade request initiated from the remote end.
422      *
423      * @param id the ID of the request as specified by Telecom
424      * @param accept Whether the request should be accepted.
425      */
respondToRttRequest(String callId, int id, boolean accept)426     public void respondToRttRequest(String callId, int id, boolean accept) {
427         try {
428             mAdapter.respondToRttRequest(callId, id, accept);
429         } catch (RemoteException ignored) {
430         }
431     }
432 
433     /**
434      * Instructs Telecom to shut down the RTT communication channel.
435      */
stopRtt(String callId)436     public void stopRtt(String callId) {
437         try {
438             mAdapter.stopRtt(callId);
439         } catch (RemoteException ignored) {
440         }
441     }
442 
443     /**
444      * Sets the RTT audio mode.
445      * @param mode the desired RTT audio mode
446      */
setRttMode(String callId, int mode)447     public void setRttMode(String callId, int mode) {
448         try {
449             mAdapter.setRttMode(callId, mode);
450         } catch (RemoteException ignored) {
451         }
452     }
453 
454 
455     /**
456      * Initiates a handover of this {@link Call} to the {@link ConnectionService} identified
457      * by destAcct.
458      * @param callId The callId of the Call which calls this function.
459      * @param destAcct ConnectionService to which the call should be handed over.
460      * @param videoState The video state desired after the handover.
461      * @param extras Extra information to be passed to ConnectionService
462      */
handoverTo(String callId, PhoneAccountHandle destAcct, int videoState, Bundle extras)463     public void handoverTo(String callId, PhoneAccountHandle destAcct, int videoState,
464                            Bundle extras) {
465         try {
466             mAdapter.handoverTo(callId, destAcct, videoState, extras);
467         } catch (RemoteException ignored) {
468         }
469     }
470 }
471