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