13adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan/*
23adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan * Copyright (C) 2010 The Android Open Source Project
33adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan *
43adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan * Licensed under the Apache License, Version 2.0 (the "License");
53adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan * you may not use this file except in compliance with the License.
63adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan * You may obtain a copy of the License at
73adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan *
83adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan *      http://www.apache.org/licenses/LICENSE-2.0
93adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan *
103adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan * Unless required by applicable law or agreed to in writing, software
113adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan * distributed under the License is distributed on an "AS IS" BASIS,
123adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan * See the License for the specific language governing permissions and
143adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan * limitations under the License.
153adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan */
163adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
173adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyanpackage android.net.sip;
183adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
193adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyanimport android.os.RemoteException;
209329db04f13480ccdff013dcc00cdb96f12a921cWink Savilleimport android.telephony.Rlog;
213adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
223adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan/**
2316b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main * Represents a SIP session that is associated with a SIP dialog or a standalone
243adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan * transaction not within a dialog.
2516b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main * <p>You can get a {@link SipSession} from {@link SipManager} with {@link
2616b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main * SipManager#createSipSession createSipSession()} (when initiating calls) or {@link
2716b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main * SipManager#getSessionFor getSessionFor()} (when receiving calls).</p>
283adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan */
293adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyanpublic final class SipSession {
303adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    private static final String TAG = "SipSession";
313adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
323adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
3316b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main     * Defines SIP session states, such as "registering", "outgoing call", and "in call".
343adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
353adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public static class State {
363adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** When session is ready to initiate a call or transaction. */
373adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int READY_TO_CALL = 0;
383adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
393adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** When the registration request is sent out. */
403adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int REGISTERING = 1;
413adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
423adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** When the unregistration request is sent out. */
433adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int DEREGISTERING = 2;
443adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
453adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** When an INVITE request is received. */
463adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int INCOMING_CALL = 3;
473adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
483adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** When an OK response is sent for the INVITE request received. */
493adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int INCOMING_CALL_ANSWERING = 4;
503adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
513adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** When an INVITE request is sent. */
523adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int OUTGOING_CALL = 5;
533adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
543adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** When a RINGING response is received for the INVITE request sent. */
553adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int OUTGOING_CALL_RING_BACK = 6;
563adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
573adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** When a CANCEL request is sent for the INVITE request sent. */
583adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int OUTGOING_CALL_CANCELING = 7;
593adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
603adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** When a call is established. */
613adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int IN_CALL = 8;
623adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
633adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** When an OPTIONS request is sent. */
643adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int PINGING = 9;
653adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
66ceb525d85512bde884b0f01a3aa93f2943dcf5f3Hung-ying Tyan        /** When ending a call. @hide */
67ceb525d85512bde884b0f01a3aa93f2943dcf5f3Hung-ying Tyan        public static final int ENDING_CALL = 10;
68ceb525d85512bde884b0f01a3aa93f2943dcf5f3Hung-ying Tyan
693adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /** Not defined. */
703adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static final int NOT_DEFINED = 101;
713adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
723adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
733adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Converts the state to string.
743adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
753adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public static String toString(int state) {
763adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            switch (state) {
773adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                case READY_TO_CALL:
783adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "READY_TO_CALL";
793adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                case REGISTERING:
803adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "REGISTERING";
813adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                case DEREGISTERING:
823adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "DEREGISTERING";
833adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                case INCOMING_CALL:
843adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "INCOMING_CALL";
853adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                case INCOMING_CALL_ANSWERING:
863adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "INCOMING_CALL_ANSWERING";
873adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                case OUTGOING_CALL:
883adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "OUTGOING_CALL";
893adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                case OUTGOING_CALL_RING_BACK:
903adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "OUTGOING_CALL_RING_BACK";
913adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                case OUTGOING_CALL_CANCELING:
923adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "OUTGOING_CALL_CANCELING";
933adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                case IN_CALL:
943adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "IN_CALL";
953adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                case PINGING:
963adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "PINGING";
973adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                default:
983adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    return "NOT_DEFINED";
993adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
1003adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
1013adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
1023adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        private State() {
1033adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
1043adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
1053adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
1063adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
10716b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main     * Listener for events relating to a SIP session, such as when a session is being registered
10816b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main     * ("on registering") or a call is outgoing ("on calling").
10916b441b4ad92c6a5cbc6f27cb3705eaaaaee20c1Scott Main     * <p>Many of these events are also received by {@link SipAudioCall.Listener}.</p>
1103adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
1113adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public static class Listener {
1123adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
1133adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when an INVITE request is sent to initiate a new call.
1143adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
1153adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that carries out the transaction
1163adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
1173adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onCalling(SipSession session) {
1183adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
1193adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
1203adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
1213adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when an INVITE request is received.
1223adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
1233adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that carries out the transaction
1243adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param caller the SIP profile of the caller
1253adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param sessionDescription the caller's session description
1263adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
1273adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onRinging(SipSession session, SipProfile caller,
1283adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                String sessionDescription) {
1293adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
1303adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
1313adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
1323adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when a RINGING response is received for the INVITE request sent
1333adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
1343adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that carries out the transaction
1353adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
1363adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onRingingBack(SipSession session) {
1373adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
1383adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
1393adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
1403adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when the session is established.
1413adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
1423adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that is associated with the dialog
1433adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param sessionDescription the peer's session description
1443adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
1453adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onCallEstablished(SipSession session,
1463adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                String sessionDescription) {
1473adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
1483adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
1493adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
1503adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when the session is terminated.
1513adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
1523adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that is associated with the dialog
1533adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
1543adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onCallEnded(SipSession session) {
1553adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
1563adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
1573adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
1583adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when the peer is busy during session initialization.
1593adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
1603adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that carries out the transaction
1613adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
1623adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onCallBusy(SipSession session) {
1633adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
1643adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
1653adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
16622ecc3df834674605daf86f7edf20169b6ca800brepo sync         * Called when the call is being transferred to a new one.
16722ecc3df834674605daf86f7edf20169b6ca800brepo sync         *
16822ecc3df834674605daf86f7edf20169b6ca800brepo sync         * @hide
16922ecc3df834674605daf86f7edf20169b6ca800brepo sync         * @param newSession the new session that the call will be transferred to
17022ecc3df834674605daf86f7edf20169b6ca800brepo sync         * @param sessionDescription the new peer's session description
17122ecc3df834674605daf86f7edf20169b6ca800brepo sync         */
17222ecc3df834674605daf86f7edf20169b6ca800brepo sync        public void onCallTransferring(SipSession newSession,
17322ecc3df834674605daf86f7edf20169b6ca800brepo sync                String sessionDescription) {
17422ecc3df834674605daf86f7edf20169b6ca800brepo sync        }
17522ecc3df834674605daf86f7edf20169b6ca800brepo sync
17622ecc3df834674605daf86f7edf20169b6ca800brepo sync        /**
1773adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when an error occurs during session initialization and
1783adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * termination.
1793adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
1803adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that carries out the transaction
1813adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param errorCode error code defined in {@link SipErrorCode}
1823adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param errorMessage error message
1833adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
1843adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onError(SipSession session, int errorCode,
1853adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                String errorMessage) {
1863adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
1873adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
1883adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
1893adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when an error occurs during session modification negotiation.
1903adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
1913adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that carries out the transaction
1923adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param errorCode error code defined in {@link SipErrorCode}
1933adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param errorMessage error message
1943adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
1953adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onCallChangeFailed(SipSession session, int errorCode,
1963adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                String errorMessage) {
1973adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
1983adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
1993adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
2003adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when a registration request is sent.
2013adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
2023adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that carries out the transaction
2033adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
2043adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onRegistering(SipSession session) {
2053adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
2063adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
2073adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
2083adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when registration is successfully done.
2093adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
2103adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that carries out the transaction
2113adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param duration duration in second before the registration expires
2123adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
2133adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onRegistrationDone(SipSession session, int duration) {
2143adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
2153adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
2163adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
2173adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when the registration fails.
2183adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
2193adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that carries out the transaction
2203adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param errorCode error code defined in {@link SipErrorCode}
2213adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param errorMessage error message
2223adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
2233adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onRegistrationFailed(SipSession session, int errorCode,
2243adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                String errorMessage) {
2253adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
2263adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
2273adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        /**
2283adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * Called when the registration gets timed out.
2293adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         *
2303adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         * @param session the session object that carries out the transaction
2313adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan         */
2323adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        public void onRegistrationTimeout(SipSession session) {
2333adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
2343adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
2353adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
2363adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    private final ISipSession mSession;
2373adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    private Listener mListener;
2383adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
2393adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    SipSession(ISipSession realSession) {
2403adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        mSession = realSession;
2413adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        if (realSession != null) {
2423adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            try {
2433adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                realSession.setListener(createListener());
2443adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            } catch (RemoteException e) {
2459329db04f13480ccdff013dcc00cdb96f12a921cWink Saville                loge("SipSession.setListener:", e);
2463adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
2473adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
2483adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
2493adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
2503adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    SipSession(ISipSession realSession, Listener listener) {
2513adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        this(realSession);
2523adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        setListener(listener);
2533adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
2543adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
2553adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
2563adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Gets the IP address of the local host on which this SIP session runs.
2573adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
2583adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @return the IP address of the local host
2593adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
2603adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public String getLocalIp() {
2613adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
2623adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return mSession.getLocalIp();
2633adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
2649329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("getLocalIp:", e);
2653adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return "127.0.0.1";
2663adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
2673adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
2683adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
2693adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
2703adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Gets the SIP profile that this session is associated with.
2713adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
2723adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @return the SIP profile that this session is associated with
2733adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
2743adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public SipProfile getLocalProfile() {
2753adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
2763adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return mSession.getLocalProfile();
2773adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
2789329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("getLocalProfile:", e);
2793adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return null;
2803adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
2813adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
2823adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
2833adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
2843adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Gets the SIP profile that this session is connected to. Only available
2853adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * when the session is associated with a SIP dialog.
2863adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
2873adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @return the SIP profile that this session is connected to
2883adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
2893adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public SipProfile getPeerProfile() {
2903adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
2913adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return mSession.getPeerProfile();
2923adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
2939329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("getPeerProfile:", e);
2943adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return null;
2953adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
2963adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
2973adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
2983adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
2993adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Gets the session state. The value returned must be one of the states in
3004e22f5d6687c18440e2f38c7e242d66ad834d1d7Hung-ying Tyan     * {@link State}.
3013adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
3023adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @return the session state
3033adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
3043adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public int getState() {
3053adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
3063adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return mSession.getState();
3073adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
3089329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("getState:", e);
3093adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return State.NOT_DEFINED;
3103adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
3113adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
3123adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
3133adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
3143adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Checks if the session is in a call.
3153adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
3163adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @return true if the session is in a call
3173adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
3183adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public boolean isInCall() {
3193adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
3203adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return mSession.isInCall();
3213adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
3229329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("isInCall:", e);
3233adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return false;
3243adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
3253adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
3263adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
3273adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
3283adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Gets the call ID of the session.
3293adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
3303adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @return the call ID
3313adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
3323adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public String getCallId() {
3333adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
3343adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return mSession.getCallId();
3353adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
3369329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("getCallId:", e);
3373adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            return null;
3383adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
3393adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
3403adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
3413adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
3423adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
3433adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Sets the listener to listen to the session events. A {@code SipSession}
3443adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * can only hold one listener at a time. Subsequent calls to this method
3453adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * override the previous listener.
3463adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
3473adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @param listener to listen to the session events of this object
3483adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
3493adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public void setListener(Listener listener) {
3503adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        mListener = listener;
3513adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
3523adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
3533adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
3543adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
3553adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Performs registration to the server specified by the associated local
3563adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * profile. The session listener is called back upon success or failure of
3573adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * registration. The method is only valid to call when the session state is
3584e22f5d6687c18440e2f38c7e242d66ad834d1d7Hung-ying Tyan     * in {@link State#READY_TO_CALL}.
3593adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
3603adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @param duration duration in second before the registration expires
3613adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @see Listener
3623adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
3633adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public void register(int duration) {
3643adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
3653adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            mSession.register(duration);
3663adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
3679329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("register:", e);
3683adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
3693adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
3703adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
3713adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
3723adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Performs unregistration to the server specified by the associated local
3733adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * profile. Unregistration is technically the same as registration with zero
3743adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * expiration duration. The session listener is called back upon success or
3753adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * failure of unregistration. The method is only valid to call when the
3764e22f5d6687c18440e2f38c7e242d66ad834d1d7Hung-ying Tyan     * session state is in {@link State#READY_TO_CALL}.
3773adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
3783adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @see Listener
3793adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
3803adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public void unregister() {
3813adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
3823adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            mSession.unregister();
3833adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
3849329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("unregister:", e);
3853adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
3863adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
3873adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
3883adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
3893adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Initiates a call to the specified profile. The session listener is called
3903adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * back upon defined session events. The method is only valid to call when
3914e22f5d6687c18440e2f38c7e242d66ad834d1d7Hung-ying Tyan     * the session state is in {@link State#READY_TO_CALL}.
3923adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
3933adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @param callee the SIP profile to make the call to
3943adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @param sessionDescription the session description of this call
3953adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @param timeout the session will be timed out if the call is not
3963adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *        established within {@code timeout} seconds. Default value (defined
3973adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *        by SIP protocol) is used if {@code timeout} is zero or negative.
3983adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @see Listener
3993adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
4003adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public void makeCall(SipProfile callee, String sessionDescription,
4013adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            int timeout) {
4023adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
4033adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            mSession.makeCall(callee, sessionDescription, timeout);
4043adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
4059329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("makeCall:", e);
4063adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
4073adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
4083adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
4093adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
4103adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Answers an incoming call with the specified session description. The
4113adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * method is only valid to call when the session state is in
4124e22f5d6687c18440e2f38c7e242d66ad834d1d7Hung-ying Tyan     * {@link State#INCOMING_CALL}.
4133adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
4143adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @param sessionDescription the session description to answer this call
4153adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @param timeout the session will be timed out if the call is not
4163adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *        established within {@code timeout} seconds. Default value (defined
4173adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *        by SIP protocol) is used if {@code timeout} is zero or negative.
4183adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
4193adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public void answerCall(String sessionDescription, int timeout) {
4203adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
4213adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            mSession.answerCall(sessionDescription, timeout);
4223adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
4239329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("answerCall:", e);
4243adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
4253adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
4263adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
4273adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
4283adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Ends an established call, terminates an outgoing call or rejects an
4293adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * incoming call. The method is only valid to call when the session state is
4304e22f5d6687c18440e2f38c7e242d66ad834d1d7Hung-ying Tyan     * in {@link State#IN_CALL},
4314e22f5d6687c18440e2f38c7e242d66ad834d1d7Hung-ying Tyan     * {@link State#INCOMING_CALL},
4324e22f5d6687c18440e2f38c7e242d66ad834d1d7Hung-ying Tyan     * {@link State#OUTGOING_CALL} or
4334e22f5d6687c18440e2f38c7e242d66ad834d1d7Hung-ying Tyan     * {@link State#OUTGOING_CALL_RING_BACK}.
4343adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
4353adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public void endCall() {
4363adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
4373adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            mSession.endCall();
4383adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
4399329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("endCall:", e);
4403adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
4413adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
4423adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
4433adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    /**
4443adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * Changes the session description during a call. The method is only valid
4454e22f5d6687c18440e2f38c7e242d66ad834d1d7Hung-ying Tyan     * to call when the session state is in {@link State#IN_CALL}.
4463adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *
4473adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @param sessionDescription the new session description
4483adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     * @param timeout the session will be timed out if the call is not
4493adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *        established within {@code timeout} seconds. Default value (defined
4503adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     *        by SIP protocol) is used if {@code timeout} is zero or negative.
4513adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan     */
4523adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    public void changeCall(String sessionDescription, int timeout) {
4533adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        try {
4543adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            mSession.changeCall(sessionDescription, timeout);
4553adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        } catch (RemoteException e) {
4569329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            loge("changeCall:", e);
4573adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        }
4583adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
4593adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
4603adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    ISipSession getRealSession() {
4613adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        return mSession;
4623adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
4633adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
4643adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    private ISipSessionListener createListener() {
4653adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        return new ISipSessionListener.Stub() {
4669329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
4673adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onCalling(ISipSession session) {
4683adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
4693adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onCalling(SipSession.this);
4703adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
4713adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
4723adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
4739329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
4743adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onRinging(ISipSession session, SipProfile caller,
4753adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    String sessionDescription) {
4763adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
4773adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onRinging(SipSession.this, caller,
4783adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                            sessionDescription);
4793adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
4803adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
4813adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
4829329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
4833adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onRingingBack(ISipSession session) {
4843adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
4853adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onRingingBack(SipSession.this);
4863adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
4873adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
4883adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
4899329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
4903adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onCallEstablished(ISipSession session,
4913adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    String sessionDescription) {
4923adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
4933adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onCallEstablished(SipSession.this,
4943adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                            sessionDescription);
4953adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
4963adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
4973adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
4989329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
4993adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onCallEnded(ISipSession session) {
5003adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
5013adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onCallEnded(SipSession.this);
5023adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
5033adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
5043adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
5059329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
5063adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onCallBusy(ISipSession session) {
5073adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
5083adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onCallBusy(SipSession.this);
5093adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
5103adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
5113adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
5129329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
51322ecc3df834674605daf86f7edf20169b6ca800brepo sync            public void onCallTransferring(ISipSession session,
51422ecc3df834674605daf86f7edf20169b6ca800brepo sync                    String sessionDescription) {
51522ecc3df834674605daf86f7edf20169b6ca800brepo sync                if (mListener != null) {
51622ecc3df834674605daf86f7edf20169b6ca800brepo sync                    mListener.onCallTransferring(
51722ecc3df834674605daf86f7edf20169b6ca800brepo sync                            new SipSession(session, SipSession.this.mListener),
51822ecc3df834674605daf86f7edf20169b6ca800brepo sync                            sessionDescription);
51922ecc3df834674605daf86f7edf20169b6ca800brepo sync
52022ecc3df834674605daf86f7edf20169b6ca800brepo sync                }
52122ecc3df834674605daf86f7edf20169b6ca800brepo sync            }
52222ecc3df834674605daf86f7edf20169b6ca800brepo sync
5239329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
5243adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onCallChangeFailed(ISipSession session, int errorCode,
5253adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    String message) {
5263adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
5273adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onCallChangeFailed(SipSession.this, errorCode,
5283adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                            message);
5293adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
5303adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
5313adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
5329329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
5333adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onError(ISipSession session, int errorCode, String message) {
5343adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
5353adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onError(SipSession.this, errorCode, message);
5363adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
5373adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
5383adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
5399329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
5403adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onRegistering(ISipSession session) {
5413adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
5423adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onRegistering(SipSession.this);
5433adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
5443adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
5453adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
5469329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
5473adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onRegistrationDone(ISipSession session, int duration) {
5483adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
5493adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onRegistrationDone(SipSession.this, duration);
5503adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
5513adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
5523adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
5539329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
5543adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onRegistrationFailed(ISipSession session, int errorCode,
5553adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    String message) {
5563adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
5573adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onRegistrationFailed(SipSession.this, errorCode,
5583adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                            message);
5593adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
5603adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
5613adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan
5629329db04f13480ccdff013dcc00cdb96f12a921cWink Saville            @Override
5633adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            public void onRegistrationTimeout(ISipSession session) {
5643adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                if (mListener != null) {
5653adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                    mListener.onRegistrationTimeout(SipSession.this);
5663adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan                }
5673adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan            }
5683adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan        };
5693adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan    }
5709329db04f13480ccdff013dcc00cdb96f12a921cWink Saville
5719329db04f13480ccdff013dcc00cdb96f12a921cWink Saville    private void loge(String s, Throwable t) {
5729329db04f13480ccdff013dcc00cdb96f12a921cWink Saville        Rlog.e(TAG, s, t);
5739329db04f13480ccdff013dcc00cdb96f12a921cWink Saville    }
5743adf1946e78b52686fa5458e24645b05da57dc22Hung-ying Tyan}
575