Home | History | Annotate | Download | only in telecom
      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      */
     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      */
     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      */
     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      */
     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      */
     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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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