184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan/* 284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Copyright (C) 2010 The Android Open Source Project 384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Licensed under the Apache License, Version 2.0 (the "License"); 584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * you may not use this file except in compliance with the License. 684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * You may obtain a copy of the License at 784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * http://www.apache.org/licenses/LICENSE-2.0 984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 1084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Unless required by applicable law or agreed to in writing, software 1184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * distributed under the License is distributed on an "AS IS" BASIS, 1284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * See the License for the specific language governing permissions and 1484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * limitations under the License. 1584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 1684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 1784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyanpackage android.net.sip; 1884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 1984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyanimport android.os.RemoteException; 2084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyanimport android.util.Log; 2184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 2284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan/** 2302b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * Represents a SIP session that is associated with a SIP dialog or a standalone 2484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * transaction not within a dialog. 2502b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * <p>You can get a {@link SipSession} from {@link SipManager} with {@link 2602b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * SipManager#createSipSession createSipSession()} (when initiating calls) or {@link 2702b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * SipManager#getSessionFor getSessionFor()} (when receiving calls).</p> 2884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 2984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyanpublic final class SipSession { 3084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan private static final String TAG = "SipSession"; 3184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 3284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 3302b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * Defines SIP session states, such as "registering", "outgoing call", and "in call". 3484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 3584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static class State { 3684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** When session is ready to initiate a call or transaction. */ 3784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int READY_TO_CALL = 0; 3884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 3984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** When the registration request is sent out. */ 4084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int REGISTERING = 1; 4184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 4284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** When the unregistration request is sent out. */ 4384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int DEREGISTERING = 2; 4484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 4584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** When an INVITE request is received. */ 4684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int INCOMING_CALL = 3; 4784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 4884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** When an OK response is sent for the INVITE request received. */ 4984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int INCOMING_CALL_ANSWERING = 4; 5084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 5184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** When an INVITE request is sent. */ 5284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int OUTGOING_CALL = 5; 5384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 5484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** When a RINGING response is received for the INVITE request sent. */ 5584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int OUTGOING_CALL_RING_BACK = 6; 5684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 5784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** When a CANCEL request is sent for the INVITE request sent. */ 5884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int OUTGOING_CALL_CANCELING = 7; 5984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 6084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** When a call is established. */ 6184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int IN_CALL = 8; 6284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 6384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** When an OPTIONS request is sent. */ 6484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int PINGING = 9; 6584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 66dc5bbe965f7a66238c3f9a6694f4410b3d52af3bHung-ying Tyan /** When ending a call. @hide */ 67dc5bbe965f7a66238c3f9a6694f4410b3d52af3bHung-ying Tyan public static final int ENDING_CALL = 10; 68dc5bbe965f7a66238c3f9a6694f4410b3d52af3bHung-ying Tyan 6984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** Not defined. */ 7084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static final int NOT_DEFINED = 101; 7184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 7284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 7384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Converts the state to string. 7484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 7584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static String toString(int state) { 7684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan switch (state) { 7784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan case READY_TO_CALL: 7884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "READY_TO_CALL"; 7984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan case REGISTERING: 8084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "REGISTERING"; 8184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan case DEREGISTERING: 8284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "DEREGISTERING"; 8384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan case INCOMING_CALL: 8484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "INCOMING_CALL"; 8584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan case INCOMING_CALL_ANSWERING: 8684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "INCOMING_CALL_ANSWERING"; 8784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan case OUTGOING_CALL: 8884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "OUTGOING_CALL"; 8984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan case OUTGOING_CALL_RING_BACK: 9084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "OUTGOING_CALL_RING_BACK"; 9184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan case OUTGOING_CALL_CANCELING: 9284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "OUTGOING_CALL_CANCELING"; 9384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan case IN_CALL: 9484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "IN_CALL"; 9584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan case PINGING: 9684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "PINGING"; 9784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan default: 9884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "NOT_DEFINED"; 9984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 10084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 10184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 10284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan private State() { 10384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 10484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 10584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 10684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 10702b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * Listener for events relating to a SIP session, such as when a session is being registered 10802b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * ("on registering") or a call is outgoing ("on calling"). 10902b1d685cc287d7c53141872b3d80be4ee5dd59eScott Main * <p>Many of these events are also received by {@link SipAudioCall.Listener}.</p> 11084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 11184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public static class Listener { 11284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 11384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when an INVITE request is sent to initiate a new call. 11484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 11584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that carries out the transaction 11684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 11784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onCalling(SipSession session) { 11884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 11984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 12084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 12184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when an INVITE request is received. 12284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 12384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that carries out the transaction 12484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param caller the SIP profile of the caller 12584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param sessionDescription the caller's session description 12684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 12784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRinging(SipSession session, SipProfile caller, 12884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan String sessionDescription) { 12984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 13084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 13184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 13284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when a RINGING response is received for the INVITE request sent 13384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 13484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that carries out the transaction 13584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 13684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRingingBack(SipSession session) { 13784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 13884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 13984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 14084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when the session is established. 14184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 14284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that is associated with the dialog 14384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param sessionDescription the peer's session description 14484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 14584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onCallEstablished(SipSession session, 14684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan String sessionDescription) { 14784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 14884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 14984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 15084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when the session is terminated. 15184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 15284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that is associated with the dialog 15384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 15484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onCallEnded(SipSession session) { 15584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 15684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 15784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 15884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when the peer is busy during session initialization. 15984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 16084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that carries out the transaction 16184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 16284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onCallBusy(SipSession session) { 16384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 16484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 16584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 1661aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync * Called when the call is being transferred to a new one. 1671aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync * 1681aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync * @hide 1691aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync * @param newSession the new session that the call will be transferred to 1701aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync * @param sessionDescription the new peer's session description 1711aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync */ 1721aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync public void onCallTransferring(SipSession newSession, 1731aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync String sessionDescription) { 1741aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync } 1751aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync 1761aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync /** 17784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when an error occurs during session initialization and 17884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * termination. 17984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 18084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that carries out the transaction 18184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param errorCode error code defined in {@link SipErrorCode} 18284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param errorMessage error message 18384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 18484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onError(SipSession session, int errorCode, 18584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan String errorMessage) { 18684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 18784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 18884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 18984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when an error occurs during session modification negotiation. 19084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 19184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that carries out the transaction 19284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param errorCode error code defined in {@link SipErrorCode} 19384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param errorMessage error message 19484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 19584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onCallChangeFailed(SipSession session, int errorCode, 19684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan String errorMessage) { 19784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 19884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 19984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 20084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when a registration request is sent. 20184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 20284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that carries out the transaction 20384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 20484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRegistering(SipSession session) { 20584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 20684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 20784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 20884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when registration is successfully done. 20984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 21084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that carries out the transaction 21184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param duration duration in second before the registration expires 21284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 21384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRegistrationDone(SipSession session, int duration) { 21484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 21584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 21684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 21784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when the registration fails. 21884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 21984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that carries out the transaction 22084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param errorCode error code defined in {@link SipErrorCode} 22184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param errorMessage error message 22284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 22384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRegistrationFailed(SipSession session, int errorCode, 22484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan String errorMessage) { 22584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 22684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 22784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 22884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Called when the registration gets timed out. 22984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 23084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param session the session object that carries out the transaction 23184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 23284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRegistrationTimeout(SipSession session) { 23384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 23484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 23584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 23684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan private final ISipSession mSession; 23784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan private Listener mListener; 23884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 23984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan SipSession(ISipSession realSession) { 24084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mSession = realSession; 24184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (realSession != null) { 24284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 24384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan realSession.setListener(createListener()); 24484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 24584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "SipSession.setListener(): " + e); 24684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 24784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 24884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 24984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 25084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan SipSession(ISipSession realSession, Listener listener) { 25184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan this(realSession); 25284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan setListener(listener); 25384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 25484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 25584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 25684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Gets the IP address of the local host on which this SIP session runs. 25784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 25884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @return the IP address of the local host 25984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 26084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public String getLocalIp() { 26184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 26284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return mSession.getLocalIp(); 26384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 26484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "getLocalIp(): " + e); 26584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return "127.0.0.1"; 26684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 26784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 26884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 26984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 27084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Gets the SIP profile that this session is associated with. 27184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 27284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @return the SIP profile that this session is associated with 27384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 27484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public SipProfile getLocalProfile() { 27584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 27684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return mSession.getLocalProfile(); 27784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 27884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "getLocalProfile(): " + e); 27984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return null; 28084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 28184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 28284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 28384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 28484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Gets the SIP profile that this session is connected to. Only available 28584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * when the session is associated with a SIP dialog. 28684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 28784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @return the SIP profile that this session is connected to 28884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 28984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public SipProfile getPeerProfile() { 29084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 29184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return mSession.getPeerProfile(); 29284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 29384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "getPeerProfile(): " + e); 29484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return null; 29584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 29684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 29784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 29884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 29984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Gets the session state. The value returned must be one of the states in 30008faac3c26e12863858e1534985dd950193f755fHung-ying Tyan * {@link State}. 30184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 30284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @return the session state 30384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 30484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public int getState() { 30584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 30684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return mSession.getState(); 30784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 30884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "getState(): " + e); 30984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return State.NOT_DEFINED; 31084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 31184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 31284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 31384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 31484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Checks if the session is in a call. 31584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 31684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @return true if the session is in a call 31784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 31884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public boolean isInCall() { 31984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 32084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return mSession.isInCall(); 32184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 32284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "isInCall(): " + e); 32384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return false; 32484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 32584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 32684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 32784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 32884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Gets the call ID of the session. 32984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 33084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @return the call ID 33184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 33284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public String getCallId() { 33384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 33484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return mSession.getCallId(); 33584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 33684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "getCallId(): " + e); 33784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return null; 33884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 33984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 34084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 34184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 34284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 34384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Sets the listener to listen to the session events. A {@code SipSession} 34484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * can only hold one listener at a time. Subsequent calls to this method 34584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * override the previous listener. 34684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 34784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param listener to listen to the session events of this object 34884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 34984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void setListener(Listener listener) { 35084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener = listener; 35184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 35284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 35384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 35484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 35584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Performs registration to the server specified by the associated local 35684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * profile. The session listener is called back upon success or failure of 35784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * registration. The method is only valid to call when the session state is 35808faac3c26e12863858e1534985dd950193f755fHung-ying Tyan * in {@link State#READY_TO_CALL}. 35984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 36084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param duration duration in second before the registration expires 36184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @see Listener 36284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 36384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void register(int duration) { 36484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 36584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mSession.register(duration); 36684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 36784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "register(): " + e); 36884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 36984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 37084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 37184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 37284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Performs unregistration to the server specified by the associated local 37384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * profile. Unregistration is technically the same as registration with zero 37484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * expiration duration. The session listener is called back upon success or 37584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * failure of unregistration. The method is only valid to call when the 37608faac3c26e12863858e1534985dd950193f755fHung-ying Tyan * session state is in {@link State#READY_TO_CALL}. 37784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 37884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @see Listener 37984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 38084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void unregister() { 38184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 38284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mSession.unregister(); 38384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 38484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "unregister(): " + e); 38584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 38684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 38784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 38884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 38984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Initiates a call to the specified profile. The session listener is called 39084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * back upon defined session events. The method is only valid to call when 39108faac3c26e12863858e1534985dd950193f755fHung-ying Tyan * the session state is in {@link State#READY_TO_CALL}. 39284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 39384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param callee the SIP profile to make the call to 39484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param sessionDescription the session description of this call 39584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param timeout the session will be timed out if the call is not 39684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * established within {@code timeout} seconds. Default value (defined 39784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * by SIP protocol) is used if {@code timeout} is zero or negative. 39884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @see Listener 39984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 40084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void makeCall(SipProfile callee, String sessionDescription, 40184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan int timeout) { 40284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 40384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mSession.makeCall(callee, sessionDescription, timeout); 40484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 40584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "makeCall(): " + e); 40684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 40784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 40884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 40984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 41084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Answers an incoming call with the specified session description. The 41184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * method is only valid to call when the session state is in 41208faac3c26e12863858e1534985dd950193f755fHung-ying Tyan * {@link State#INCOMING_CALL}. 41384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 41484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param sessionDescription the session description to answer this call 41584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param timeout the session will be timed out if the call is not 41684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * established within {@code timeout} seconds. Default value (defined 41784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * by SIP protocol) is used if {@code timeout} is zero or negative. 41884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 41984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void answerCall(String sessionDescription, int timeout) { 42084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 42184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mSession.answerCall(sessionDescription, timeout); 42284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 42384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "answerCall(): " + e); 42484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 42584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 42684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 42784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 42884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Ends an established call, terminates an outgoing call or rejects an 42984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * incoming call. The method is only valid to call when the session state is 43008faac3c26e12863858e1534985dd950193f755fHung-ying Tyan * in {@link State#IN_CALL}, 43108faac3c26e12863858e1534985dd950193f755fHung-ying Tyan * {@link State#INCOMING_CALL}, 43208faac3c26e12863858e1534985dd950193f755fHung-ying Tyan * {@link State#OUTGOING_CALL} or 43308faac3c26e12863858e1534985dd950193f755fHung-ying Tyan * {@link State#OUTGOING_CALL_RING_BACK}. 43484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 43584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void endCall() { 43684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 43784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mSession.endCall(); 43884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 43984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "endCall(): " + e); 44084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 44184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 44284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 44384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan /** 44484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * Changes the session description during a call. The method is only valid 44508faac3c26e12863858e1534985dd950193f755fHung-ying Tyan * to call when the session state is in {@link State#IN_CALL}. 44684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * 44784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param sessionDescription the new session description 44884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * @param timeout the session will be timed out if the call is not 44984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * established within {@code timeout} seconds. Default value (defined 45084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan * by SIP protocol) is used if {@code timeout} is zero or negative. 45184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan */ 45284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void changeCall(String sessionDescription, int timeout) { 45384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan try { 45484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mSession.changeCall(sessionDescription, timeout); 45584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } catch (RemoteException e) { 45684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan Log.e(TAG, "changeCall(): " + e); 45784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 45884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 45984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 46084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan ISipSession getRealSession() { 46184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return mSession; 46284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 46384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 46484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan private ISipSessionListener createListener() { 46584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan return new ISipSessionListener.Stub() { 46684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onCalling(ISipSession session) { 46784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 46884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onCalling(SipSession.this); 46984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 47084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 47184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 47284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRinging(ISipSession session, SipProfile caller, 47384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan String sessionDescription) { 47484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 47584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onRinging(SipSession.this, caller, 47684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan sessionDescription); 47784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 47884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 47984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 48084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRingingBack(ISipSession session) { 48184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 48284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onRingingBack(SipSession.this); 48384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 48484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 48584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 48684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onCallEstablished(ISipSession session, 48784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan String sessionDescription) { 48884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 48984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onCallEstablished(SipSession.this, 49084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan sessionDescription); 49184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 49284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 49384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 49484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onCallEnded(ISipSession session) { 49584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 49684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onCallEnded(SipSession.this); 49784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 49884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 49984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 50084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onCallBusy(ISipSession session) { 50184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 50284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onCallBusy(SipSession.this); 50384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 50484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 50584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 5061aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync public void onCallTransferring(ISipSession session, 5071aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync String sessionDescription) { 5081aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync if (mListener != null) { 5091aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync mListener.onCallTransferring( 5101aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync new SipSession(session, SipSession.this.mListener), 5111aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync sessionDescription); 5121aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync 5131aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync } 5141aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync } 5151aceda35cc607856ec2e960e0c6cfc6aea87ab8erepo sync 51684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onCallChangeFailed(ISipSession session, int errorCode, 51784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan String message) { 51884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 51984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onCallChangeFailed(SipSession.this, errorCode, 52084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan message); 52184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 52284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 52384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 52484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onError(ISipSession session, int errorCode, String message) { 52584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 52684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onError(SipSession.this, errorCode, message); 52784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 52884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 52984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 53084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRegistering(ISipSession session) { 53184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 53284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onRegistering(SipSession.this); 53384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 53484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 53584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 53684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRegistrationDone(ISipSession session, int duration) { 53784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 53884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onRegistrationDone(SipSession.this, duration); 53984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 54084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 54184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 54284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRegistrationFailed(ISipSession session, int errorCode, 54384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan String message) { 54484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 54584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onRegistrationFailed(SipSession.this, errorCode, 54684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan message); 54784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 54884a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 54984a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan 55084a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan public void onRegistrationTimeout(ISipSession session) { 55184a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan if (mListener != null) { 55284a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan mListener.onRegistrationTimeout(SipSession.this); 55384a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 55484a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 55584a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan }; 55684a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan } 55784a357bb6a8005e1c5e924e96a8ecf310e77c47cHung-ying Tyan} 558