1ef36ef67e009449300b0150c60c9f637e205d79eWink Saville/*
2ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * Copyright (c) 2013 The Android Open Source Project
3ef36ef67e009449300b0150c60c9f637e205d79eWink Saville *
4ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * you may not use this file except in compliance with the License.
6ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * You may obtain a copy of the License at
7ef36ef67e009449300b0150c60c9f637e205d79eWink Saville *
8ef36ef67e009449300b0150c60c9f637e205d79eWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9ef36ef67e009449300b0150c60c9f637e205d79eWink Saville *
10ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * Unless required by applicable law or agreed to in writing, software
11ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * See the License for the specific language governing permissions and
14ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * limitations under the License.
15ef36ef67e009449300b0150c60c9f637e205d79eWink Saville */
16ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
17ef36ef67e009449300b0150c60c9f637e205d79eWink Savillepackage com.android.ims.internal;
18ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
19a4710d5d926d8112179acece620f49cb79257e98Andrew Leeimport android.os.Message;
20ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport android.os.RemoteException;
21ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
22ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport com.android.ims.ImsCallProfile;
23ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport com.android.ims.ImsConferenceState;
24ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport com.android.ims.ImsReasonInfo;
25ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport com.android.ims.ImsStreamMediaProfile;
26ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
27ef36ef67e009449300b0150c60c9f637e205d79eWink Saville/**
28ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * Provides the call initiation/termination, and media exchange between two IMS endpoints.
29ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * It directly communicates with IMS service which implements the IMS protocol behavior.
30ef36ef67e009449300b0150c60c9f637e205d79eWink Saville *
31ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * @hide
32ef36ef67e009449300b0150c60c9f637e205d79eWink Saville */
33ef36ef67e009449300b0150c60c9f637e205d79eWink Savillepublic class ImsCallSession {
34ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private static final String TAG = "ImsCallSession";
35ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
36ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
37ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Defines IMS call session state.
38ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
39ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static class State {
40ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static final int IDLE = 0;
41ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static final int INITIATED = 1;
42ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static final int NEGOTIATING = 2;
43ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static final int ESTABLISHING = 3;
44ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static final int ESTABLISHED = 4;
45ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
46ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static final int RENEGOTIATING = 5;
47ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static final int REESTABLISHING = 6;
48ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
49ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static final int TERMINATING = 7;
50ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static final int TERMINATED = 8;
51ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
52ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static final int INVALID = (-1);
53ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
54ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
55ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Converts the state to string.
56ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
57ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public static String toString(int state) {
58ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            switch (state) {
59ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                case IDLE:
60ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return "IDLE";
61ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                case INITIATED:
62ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return "INITIATED";
63ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                case NEGOTIATING:
64ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return "NEGOTIATING";
65ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                case ESTABLISHING:
66ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return "ESTABLISHING";
67ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                case ESTABLISHED:
68ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return "ESTABLISHED";
69ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                case RENEGOTIATING:
70ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return "RENEGOTIATING";
71ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                case REESTABLISHING:
72ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return "REESTABLISHING";
73ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                case TERMINATING:
74ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return "TERMINATING";
75ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                case TERMINATED:
76ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return "TERMINATED";
77ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                default:
78ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return "UNKNOWN";
79ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
80ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
81ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
82ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        private State() {
83ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
84ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
85ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
86ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
87ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Listener for events relating to an IMS session, such as when a session is being
88ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * recieved ("on ringing") or a call is outgoing ("on calling").
89ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * <p>Many of these events are also received by {@link ImsCall.Listener}.</p>
90ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
91ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static class Listener {
92ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
93ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when a request is sent out to initiate a new session
94ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * and 1xx response is received from the network.
95ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
96ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
97ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
98ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionProgressing(ImsCallSession session,
99ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsStreamMediaProfile profile) {
100ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            // no-op
101ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
102ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
103ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
104ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session is established.
105ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
106ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
107ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
108ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionStarted(ImsCallSession session,
109ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
110ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            // no-op
111ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
112ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
113ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
114ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session establishment is failed.
115ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
116ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
117ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param reasonInfo detailed reason of the session establishment failure
118ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
119ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionStartFailed(ImsCallSession session,
120ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
121ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
122ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
123ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
124ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session is terminated.
125ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
126ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
127ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param reasonInfo detailed reason of the session termination
128ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
129ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionTerminated(ImsCallSession session,
130ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
131ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
132ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
133ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
134ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session is in hold.
135ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
136ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
137ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
138ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionHeld(ImsCallSession session,
139ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
140ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
141ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
142ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
143ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session hold is failed.
144ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
145ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
146ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param reasonInfo detailed reason of the session hold failure
147ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
148ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionHoldFailed(ImsCallSession session,
149ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
150ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
151ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
152ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
153ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session hold is received from the remote user.
154ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
155ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
156ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
157ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionHoldReceived(ImsCallSession session,
158ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
159ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
160ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
161ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
162ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session resume is done.
163ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
164ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
165ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
166ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionResumed(ImsCallSession session,
167ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
168ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
169ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
170ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
171ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session resume is failed.
172ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
173ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
174ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param reasonInfo detailed reason of the session resume failure
175ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
176ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionResumeFailed(ImsCallSession session,
177ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
178ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
179ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
180ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
181ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session resume is received from the remote user.
182ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
183ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
184ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
185ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionResumeReceived(ImsCallSession session,
186ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
187ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
188ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
189ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
1903f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * Called when the session merge has been started.  At this point, the {@code newSession}
1913f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * represents the session which has been initiated to the IMS conference server for the
1923f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * new merged conference.
193ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
194ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
195ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param newSession the session object that is merged with an active & hold session
196ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
1973f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn        public void callSessionMergeStarted(ImsCallSession session,
198ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallSession newSession, ImsCallProfile profile) {
199ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
200ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
201ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
2023f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * Called when the session merge is successful and the merged session is active.
2033f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         *
2043f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * @param session the session object that carries out the IMS session
2053f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         */
2063f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn        public void callSessionMergeComplete(ImsCallSession session) {
2073f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn        }
2083f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn
2093f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn        /**
2103f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * Called when the session merge has failed.
211ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
212ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
213ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param reasonInfo detailed reason of the call merge failure
214ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
215ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionMergeFailed(ImsCallSession session,
216ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
217ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
218ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
219ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
220ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session is updated (except for hold/unhold).
221ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
222ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param call the call object that carries out the IMS call
223ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
224ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionUpdated(ImsCallSession session,
225ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
226ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
227ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
228ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
229ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session update is failed.
230ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
231ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
232ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param reasonInfo detailed reason of the session update failure
233ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
234ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionUpdateFailed(ImsCallSession session,
235ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
236ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
237ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
238ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
239ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session update is received from the remote user.
240ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
241ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
242ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
243ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionUpdateReceived(ImsCallSession session,
244ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
245ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            // no-op
246ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
247ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
248ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
249ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the session is extended to the conference session.
250ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
251ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
252ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param newSession the session object that is extended to the conference
253ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *      from the active session
254ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
255ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionConferenceExtended(ImsCallSession session,
256ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallSession newSession, ImsCallProfile profile) {
257ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
258ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
259ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
260ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the conference extension is failed.
261ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
262ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
263ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param reasonInfo detailed reason of the conference extension failure
264ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
265ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionConferenceExtendFailed(ImsCallSession session,
266ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
267ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
268ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
269ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
270ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the conference extension is received from the remote user.
271ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
272ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
273ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
274ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionConferenceExtendReceived(ImsCallSession session,
275ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallSession newSession, ImsCallProfile profile) {
276ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            // no-op
277ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
278ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
279ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
280ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the invitation request of the participants is delivered to the conference
281ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * server.
282ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
283ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
284ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
285ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionInviteParticipantsRequestDelivered(ImsCallSession session) {
286ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            // no-op
287ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
288ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
289ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
290ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the invitation request of the participants is failed.
291ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
292ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
293ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param reasonInfo detailed reason of the conference invitation failure
294ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
295ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionInviteParticipantsRequestFailed(ImsCallSession session,
296ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
297ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            // no-op
298ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
299ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
300ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
301ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the removal request of the participants is delivered to the conference
302ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * server.
303ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
304ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
305ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
306ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionRemoveParticipantsRequestDelivered(ImsCallSession session) {
307ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            // no-op
308ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
309ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
310ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
311ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the removal request of the participants is failed.
312ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
313ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
314ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param reasonInfo detailed reason of the conference removal failure
315ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
316ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionRemoveParticipantsRequestFailed(ImsCallSession session,
317ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
318ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            // no-op
319ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
320ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
321ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
322ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the conference state is updated.
323ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
324ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param session the session object that carries out the IMS session
325ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
326ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionConferenceStateUpdated(ImsCallSession session,
327ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsConferenceState state) {
328ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            // no-op
329ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
330ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
331ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
332ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Called when the USSD message is received from the network.
333ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         *
334ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param mode mode of the USSD message (REQUEST / NOTIFY)
335ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * @param ussdMessage USSD message
336ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
337ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionUssdMessageReceived(ImsCallSession session,
338ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int mode, String ussdMessage) {
339ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            // no-op
340ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
341f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen
342f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        /**
343f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * Called when session access technology changes
344f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         *
345f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * @param session IMS session object
346f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * @param srcAccessTech original access technology
347f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * @param targetAccessTech new access technology
348f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * @param reasonInfo
349f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         */
350f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        public void callSessionHandover(ImsCallSession session,
351f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                                 int srcAccessTech, int targetAccessTech,
352f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                                 ImsReasonInfo reasonInfo) {
353f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen            // no-op
354f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        }
355f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen
356f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        /**
357f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * Called when session access technology change fails
358f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         *
359f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * @param session IMS session object
360f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * @param srcAccessTech original access technology
361f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * @param targetAccessTech new access technology
362f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * @param reasonInfo handover failure reason
363f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         */
364f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        public void callSessionHandoverFailed(ImsCallSession session,
365f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                                       int srcAccessTech, int targetAccessTech,
366f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                                       ImsReasonInfo reasonInfo) {
367f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen            // no-op
368f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        }
369987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak
370987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak        /**
371987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak         * Called when TTY mode of remote party changed
372987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak         *
373987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak         * @param session IMS session object
374987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak         * @param mode TTY mode of remote party
375987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak         */
376987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak        public void callSessionTtyModeReceived(ImsCallSession session,
377987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak                                       int mode) {
378987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak            // no-op
379987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak        }
380ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
381ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
382ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private final IImsCallSession miSession;
383ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private boolean mClosed = false;
384ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private Listener mListener;
385ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
386ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public ImsCallSession(IImsCallSession iSession) {
387ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        miSession = iSession;
388ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
389ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (iSession != null) {
390ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
391ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                iSession.setListener(new IImsCallSessionListenerProxy());
392ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
393ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
394ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } else {
395ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            mClosed = true;
396ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
397ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
398ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
399ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public ImsCallSession(IImsCallSession iSession, Listener listener) {
400ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        this(iSession);
401ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        setListener(listener);
402ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
403ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
404ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
405ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Closes this object. This object is not usable after being closed.
406ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
407ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public synchronized void close() {
408ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
409ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
410ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
411ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
412ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
413ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.close();
414ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            mClosed = true;
415ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
416ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
417ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
418ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
419ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
420ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Gets the call ID of the session.
421ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
422ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @return the call ID
423ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
424ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public String getCallId() {
425ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
426ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return null;
427ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
428ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
429ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
430ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return miSession.getCallId();
431ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
432ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return null;
433ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
434ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
435ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
436ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
437ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Gets the call profile that this session is associated with
438ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
439ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @return the call profile that this session is associated with
440ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
441ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public ImsCallProfile getCallProfile() {
442ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
443ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return null;
444ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
445ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
446ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
447ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return miSession.getCallProfile();
448ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
449ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return null;
450ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
451ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
452ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
453ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
454ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Gets the local call profile that this session is associated with
455ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
456ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @return the local call profile that this session is associated with
457ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
458ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public ImsCallProfile getLocalCallProfile() {
459ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
460ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return null;
461ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
462ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
463ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
464ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return miSession.getLocalCallProfile();
465ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
466ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return null;
467ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
468ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
46901b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee
47001b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee    /**
471e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh     * Gets the remote call profile that this session is associated with
472e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh     *
473e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh     * @return the remote call profile that this session is associated with
474e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh     */
475e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh    public ImsCallProfile getRemoteCallProfile() {
476e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh        if (mClosed) {
477e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh            return null;
478e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh        }
479e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh
480e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh        try {
481e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh            return miSession.getRemoteCallProfile();
482e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh        } catch (RemoteException e) {
483e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh            return null;
484e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh        }
485e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh    }
486e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh
487e871989b4d1c6590e7c280cbdd90c75ca82a877eShriram Ganesh    /**
48801b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee     * Gets the video call provider for the session.
48901b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee     *
49001b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee     * @return The video call provider.
49101b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee     */
49201b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee    public IImsVideoCallProvider getVideoCallProvider() {
49301b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee        if (mClosed) {
49401b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee            return null;
49501b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee        }
49601b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee
49701b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee        try {
49801b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee            return miSession.getVideoCallProvider();
49901b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee        } catch (RemoteException e) {
50001b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee            return null;
50101b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee        }
50201b4ea445b5cdc6c1b32153d4f0216f429ede8afAndrew Lee    }
503ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
504ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
505ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Gets the value associated with the specified property of this session.
506ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
507ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @return the string value associated with the specified property
508ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
509ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public String getProperty(String name) {
510ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
511ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return null;
512ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
513ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
514ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
515ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return miSession.getProperty(name);
516ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
517ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return null;
518ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
519ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
520ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
521ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
522ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Gets the session state.
523ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * The value returned must be one of the states in {@link State}.
524ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
525ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @return the session state
526ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
527ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public int getState() {
528ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
529ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return State.INVALID;
530ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
531ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
532ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
533ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return miSession.getState();
534ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
535ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return State.INVALID;
536ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
537ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
538047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn
539047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn    /**
540047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn     * Determines if the {@link ImsCallSession} is currently alive (e.g. not in a terminated or
541047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn     * closed state).
542047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn     *
543047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn     * @return {@code True} if the session is alive.
544047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn     */
545047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn    public boolean isAlive() {
546047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn        if (mClosed) {
547047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn            return false;
548047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn        }
549047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn
550047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn        int state = getState();
551047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn        switch (state) {
552047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn            case State.IDLE:
553047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn            case State.INITIATED:
554047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn            case State.NEGOTIATING:
555047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn            case State.ESTABLISHING:
556047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn            case State.ESTABLISHED:
557047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn            case State.RENEGOTIATING:
558047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn            case State.REESTABLISHING:
559047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn                return true;
560047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn            default:
561047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn                return false;
562047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn        }
563047d8101113030f34f89f7c9ba015d6c5c3abba6Tyler Gunn    }
564ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
565ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
566ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Gets the native IMS call session.
567ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @hide
568ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
569ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public IImsCallSession getSession() {
570ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        return miSession;
571ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
572ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
573ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
574ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Checks if the session is in call.
575ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
576ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @return true if the session is in call
577ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
578ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public boolean isInCall() {
579ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
580ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return false;
581ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
582ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
583ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
584ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return miSession.isInCall();
585ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
586ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return false;
587ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
588ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
589ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
590ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
591ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Sets the listener to listen to the session events. A {@link ImsCallSession}
592ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * can only hold one listener at a time. Subsequent calls to this method
593ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * override the previous listener.
594ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
595ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param listener to listen to the session events of this object
596ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
597ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void setListener(Listener listener) {
598ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        mListener = listener;
599ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
600ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
601ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
602ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Mutes or unmutes the mic for the active call.
603ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
604ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param muted true if the call is muted, false otherwise
605ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
606ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void setMute(boolean muted) {
607ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
608ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
609ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
610ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
611ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
612ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.setMute(muted);
613ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
614ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
615ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
616ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
617ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
618ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Initiates an IMS call with the specified target and call profile.
619ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * The session listener is called back upon defined session events.
620ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * The method is only valid to call when the session state is in
621ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * {@link ImsCallSession#State#IDLE}.
622ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
623ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param callee dialed string to make the call to
624ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param profile call profile to make the call with the specified service type,
625ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *      call type and media information
626ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#callSessionStarted, Listener#callSessionStartFailed
627ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
628ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void start(String callee, ImsCallProfile profile) {
629ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
630ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
631ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
632ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
633ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
634ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.start(callee, profile);
635ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
636ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
637ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
638ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
639ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
640ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Initiates an IMS conference call with the specified target and call profile.
641ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * The session listener is called back upon defined session events.
642ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * The method is only valid to call when the session state is in
643ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * {@link ImsCallSession#State#IDLE}.
644ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
645ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param participants participant list to initiate an IMS conference call
646ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param profile call profile to make the call with the specified service type,
647ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *      call type and media information
648ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#callSessionStarted, Listener#callSessionStartFailed
649ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
650ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void start(String[] participants, ImsCallProfile profile) {
651ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
652ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
653ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
654ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
655ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
656ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.startConference(participants, profile);
657ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
658ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
659ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
660ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
661ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
662ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Accepts an incoming call or session update.
663ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
664ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param callType call type specified in {@link ImsCallProfile} to be answered
665ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param profile stream media profile {@link ImsStreamMediaProfile} to be answered
666ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#callSessionStarted
667ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
668ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void accept(int callType, ImsStreamMediaProfile profile) {
669ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
670ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
671ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
672ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
673ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
674ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.accept(callType, profile);
675ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
676ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
677ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
678ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
679ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
680ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Rejects an incoming call or session update.
681ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
682ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param reason reason code to reject an incoming call
683ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#callSessionStartFailed
684ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
685ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void reject(int reason) {
686ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
687ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
688ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
689ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
690ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
691ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.reject(reason);
692ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
693ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
694ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
695ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
696ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
697ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Terminates a call.
698ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
699ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#callSessionTerminated
700ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
701ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void terminate(int reason) {
702ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
703ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
704ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
705ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
706ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
707ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.terminate(reason);
708ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
709ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
710ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
711ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
712ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
713ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Puts a call on hold. When it succeeds, {@link Listener#callSessionHeld} is called.
714ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
715ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param profile stream media profile {@link ImsStreamMediaProfile} to hold the call
716ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#callSessionHeld, Listener#callSessionHoldFailed
717ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
718ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void hold(ImsStreamMediaProfile profile) {
719ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
720ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
721ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
722ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
723ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
724ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.hold(profile);
725ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
726ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
727ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
728ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
729ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
730ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Continues a call that's on hold. When it succeeds,
731ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * {@link Listener#callSessionResumed} is called.
732ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
733ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param profile stream media profile {@link ImsStreamMediaProfile} to resume the call
734ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#callSessionResumed, Listener#callSessionResumeFailed
735ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
736ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void resume(ImsStreamMediaProfile profile) {
737ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
738ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
739ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
740ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
741ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
742ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.resume(profile);
743ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
744ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
745ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
746ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
747ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
748ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Merges the active & hold call. When it succeeds,
7493f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn     * {@link Listener#callSessionMergeStarted} is called.
750ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
7513f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn     * @see Listener#callSessionMergeStarted , Listener#callSessionMergeFailed
752ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
753ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void merge() {
754ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
755ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
756ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
757ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
758ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
759ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.merge();
760ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
761ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
762ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
763ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
764ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
765ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Updates the current call's properties (ex. call mode change: video upgrade / downgrade).
766ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
767ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param callType call type specified in {@link ImsCallProfile} to be updated
768ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param profile stream media profile {@link ImsStreamMediaProfile} to be updated
769ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#callSessionUpdated, Listener#callSessionUpdateFailed
770ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
771ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void update(int callType, ImsStreamMediaProfile profile) {
772ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
773ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
774ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
775ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
776ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
777ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.update(callType, profile);
778ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
779ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
780ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
781ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
782ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
783ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Extends this call to the conference call with the specified recipients.
784ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
785ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @participants participant list to be invited to the conference call after extending the call
786ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#sessionConferenceExtened, Listener#sessionConferenceExtendFailed
787ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
788ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void extendToConference(String[] participants) {
789ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
790ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
791ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
792ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
793ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
794ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.extendToConference(participants);
795ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
796ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
797ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
798ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
799ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
800ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Requests the conference server to invite an additional participants to the conference.
801ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
802ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @participants participant list to be invited to the conference call
803ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#sessionInviteParticipantsRequestDelivered,
804ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *      Listener#sessionInviteParticipantsRequestFailed
805ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
806ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void inviteParticipants(String[] participants) {
807ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
808ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
809ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
810ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
811ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
812ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.inviteParticipants(participants);
813ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
814ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
815ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
816ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
817ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
818ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Requests the conference server to remove the specified participants from the conference.
819ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
820ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param participants participant list to be removed from the conference call
821ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @see Listener#sessionRemoveParticipantsRequestDelivered,
822ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *      Listener#sessionRemoveParticipantsRequestFailed
823ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
824ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void removeParticipants(String[] participants) {
825ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
826ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
827ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
828ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
829ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
830ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.removeParticipants(participants);
831ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
832ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
833ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
834ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
835ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
836ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
837ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Sends a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>,
838ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15,
839ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * and event flash to 16. Currently, event flash is not supported.
840ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
8412f92daf76a66d7d2fe6fb7b1a28fc1b5888a7b7cLibin.Tang@motorola.com     * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs.
842ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
843a4710d5d926d8112179acece620f49cb79257e98Andrew Lee    public void sendDtmf(char c, Message result) {
844ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
845ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
846ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
847ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
848ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
849a4710d5d926d8112179acece620f49cb79257e98Andrew Lee            miSession.sendDtmf(c, result);
850ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
851ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
852ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
853ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
854ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
855a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam     * Starts a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>,
856a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam     * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15,
857a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam     * and event flash to 16. Currently, event flash is not supported.
858a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam     *
859a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam     * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs.
860a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam     */
861a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam    public void startDtmf(char c) {
862a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam        if (mClosed) {
863a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam            return;
864a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam        }
865a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam
866a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam        try {
867a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam            miSession.startDtmf(c);
868a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam        } catch (RemoteException e) {
869a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam        }
870a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam    }
871a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam
872a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam    /**
873a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam     * Stops a DTMF code.
874a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam     */
875a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam    public void stopDtmf() {
876a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam        if (mClosed) {
877a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam            return;
878a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam        }
879a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam
880a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam        try {
881a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam            miSession.stopDtmf();
882a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam        } catch (RemoteException e) {
883a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam        }
884a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam    }
885a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam
886a6fbae9f8c793118e008a98d3576df316bf0364aUma Maheswari Ramalingam    /**
887ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Sends an USSD message.
888ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
889ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param ussdMessage USSD message to send
890ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
891ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void sendUssd(String ussdMessage) {
892ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (mClosed) {
893ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
894ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
895ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
896ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        try {
897ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            miSession.sendUssd(ussdMessage);
898ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        } catch (RemoteException e) {
899ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
900ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
901ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
902ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
903725ad373383798c1516348475b1f6304484e031eTyler Gunn     * Determines if the session is multiparty.
904725ad373383798c1516348475b1f6304484e031eTyler Gunn     *
905725ad373383798c1516348475b1f6304484e031eTyler Gunn     * @return {@code True} if the session is multiparty.
906725ad373383798c1516348475b1f6304484e031eTyler Gunn     */
907725ad373383798c1516348475b1f6304484e031eTyler Gunn    public boolean isMultiparty() {
908725ad373383798c1516348475b1f6304484e031eTyler Gunn        if (mClosed) {
909725ad373383798c1516348475b1f6304484e031eTyler Gunn            return false;
910725ad373383798c1516348475b1f6304484e031eTyler Gunn        }
911725ad373383798c1516348475b1f6304484e031eTyler Gunn
912725ad373383798c1516348475b1f6304484e031eTyler Gunn        try {
913725ad373383798c1516348475b1f6304484e031eTyler Gunn            return miSession.isMultiparty();
914725ad373383798c1516348475b1f6304484e031eTyler Gunn        } catch (RemoteException e) {
915725ad373383798c1516348475b1f6304484e031eTyler Gunn            return false;
916725ad373383798c1516348475b1f6304484e031eTyler Gunn        }
917725ad373383798c1516348475b1f6304484e031eTyler Gunn    }
918725ad373383798c1516348475b1f6304484e031eTyler Gunn
919725ad373383798c1516348475b1f6304484e031eTyler Gunn    /**
920ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * A listener type for receiving notification on IMS call session events.
921ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * When an event is generated for an {@link IImsCallSession},
922ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * the application is notified by having one of the methods called on
923ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * the {@link IImsCallSessionListener}.
924ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
925ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private class IImsCallSessionListenerProxy extends IImsCallSessionListener.Stub {
926ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
927ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the result of the basic session operation (setup / terminate).
928ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
929ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
930ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionProgressing(IImsCallSession session,
931ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsStreamMediaProfile profile) {
932ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
933ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionProgressing(ImsCallSession.this, profile);
934ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
935ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
936ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
937ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
938ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionStarted(IImsCallSession session,
939ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
940ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
941ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionStarted(ImsCallSession.this, profile);
942ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
943ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
944ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
945ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
946ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionStartFailed(IImsCallSession session,
947ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
948ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
949ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionStartFailed(ImsCallSession.this, reasonInfo);
950ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
951ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
952ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
953ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
954ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionTerminated(IImsCallSession session,
955ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
956ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
957ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionTerminated(ImsCallSession.this, reasonInfo);
958ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
959ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
960ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
961ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
962ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the result of the call hold/resume operation.
963ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
964ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
965ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionHeld(IImsCallSession session,
966ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
967ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
968ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionHeld(ImsCallSession.this, profile);
969ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
970ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
971ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
972ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
973ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionHoldFailed(IImsCallSession session,
974ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
975ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
976ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionHoldFailed(ImsCallSession.this, reasonInfo);
977ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
978ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
979ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
980ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
981ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionHoldReceived(IImsCallSession session,
982ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
983ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
984ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionHoldReceived(ImsCallSession.this, profile);
985ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
986ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
987ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
988ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
989ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionResumed(IImsCallSession session,
990ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
991ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
992ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionResumed(ImsCallSession.this, profile);
993ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
994ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
995ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
996ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
997ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionResumeFailed(IImsCallSession session,
998ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
999ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1000ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionResumeFailed(ImsCallSession.this, reasonInfo);
1001ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1002ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1003ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1004ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1005ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionResumeReceived(IImsCallSession session,
1006ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
1007ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1008ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionResumeReceived(ImsCallSession.this, profile);
1009ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1010ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1011ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1012ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
10133f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * Notifies the start of a call merge operation.
10143f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         *
10153f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * @param session The call session.
10163f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * @param newSession The merged call session.
10173f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * @param profile The call profile.
1018ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
1019ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
10203f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn        public void callSessionMergeStarted(IImsCallSession session,
1021ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                IImsCallSession newSession, ImsCallProfile profile) {
1022ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
10233f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn                mListener.callSessionMergeStarted(ImsCallSession.this,
1024ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                        new ImsCallSession(newSession), profile);
1025ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1026ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1027ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
10283f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn        /**
10293f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * Notifies the successful completion of a call merge operation.
10303f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         *
10313f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * @param session The call session.
10323f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         */
10333f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn        @Override
10343f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn        public void callSessionMergeComplete(IImsCallSession session) {
10353f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn            if (mListener != null) {
10363f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn                mListener.callSessionMergeComplete(ImsCallSession.this);
10373f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn            }
10383f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn        }
10393f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn
10403f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn        /**
10413f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * Notifies of a failure to perform a call merge operation.
10423f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         *
10433f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * @param session The call session.
10443f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         * @param reasonInfo The merge failure reason.
10453f2b0aaa277545886571cbf90fc90fd5d304e714Tyler Gunn         */
1046ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1047ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionMergeFailed(IImsCallSession session,
1048ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
1049ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1050ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionMergeFailed(ImsCallSession.this, reasonInfo);
1051ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1052ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1053ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1054ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
1055ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the result of call upgrade / downgrade or any other call updates.
1056ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
1057ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1058ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionUpdated(IImsCallSession session,
1059ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
1060ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1061ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionUpdated(ImsCallSession.this, profile);
1062ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1063ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1064ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1065ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1066ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionUpdateFailed(IImsCallSession session,
1067ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
1068ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1069ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionUpdateFailed(ImsCallSession.this, reasonInfo);
1070ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1071ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1072ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1073ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1074ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionUpdateReceived(IImsCallSession session,
1075ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsCallProfile profile) {
1076ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1077ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionUpdateReceived(ImsCallSession.this, profile);
1078ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1079ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1080ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1081ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
1082ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the result of conference extension.
1083ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
1084ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1085ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionConferenceExtended(IImsCallSession session,
1086ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                IImsCallSession newSession, ImsCallProfile profile) {
1087ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1088ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionConferenceExtended(ImsCallSession.this,
1089ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                        new ImsCallSession(newSession), profile);
1090ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1091ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1092ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1093ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1094ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionConferenceExtendFailed(IImsCallSession session,
1095ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
1096ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1097ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionConferenceExtendFailed(ImsCallSession.this, reasonInfo);
1098ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1099ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1100ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1101ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1102ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionConferenceExtendReceived(IImsCallSession session,
1103ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                IImsCallSession newSession, ImsCallProfile profile) {
1104ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1105ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionConferenceExtendReceived(ImsCallSession.this,
1106ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                        new ImsCallSession(newSession), profile);
1107ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1108ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1109ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1110ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
1111ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the result of the participant invitation / removal to/from
1112ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * the conference session.
1113ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
1114ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1115ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionInviteParticipantsRequestDelivered(IImsCallSession session) {
1116ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1117ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionInviteParticipantsRequestDelivered(ImsCallSession.this);
1118ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1119ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1120ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1121ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1122ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionInviteParticipantsRequestFailed(IImsCallSession session,
1123ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
1124ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1125ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionInviteParticipantsRequestFailed(ImsCallSession.this,
1126ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                        reasonInfo);
1127ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1128ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1129ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1130ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1131ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionRemoveParticipantsRequestDelivered(IImsCallSession session) {
1132ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1133ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionRemoveParticipantsRequestDelivered(ImsCallSession.this);
1134ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1135ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1136ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1137ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1138ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionRemoveParticipantsRequestFailed(IImsCallSession session,
1139ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsReasonInfo reasonInfo) {
1140ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1141ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionRemoveParticipantsRequestFailed(ImsCallSession.this,
1142ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                        reasonInfo);
1143ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1144ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1145ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1146ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
1147ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the changes of the conference info. in the conference session.
1148ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
1149ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1150ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionConferenceStateUpdated(IImsCallSession session,
1151ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                ImsConferenceState state) {
1152ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1153ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionConferenceStateUpdated(ImsCallSession.this, state);
1154ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1155ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1156ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
1157ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
1158ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the incoming USSD message.
1159ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
1160ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
1161ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void callSessionUssdMessageReceived(IImsCallSession session,
1162ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int mode, String ussdMessage) {
1163ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (mListener != null) {
1164ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mListener.callSessionUssdMessageReceived(ImsCallSession.this, mode, ussdMessage);
1165ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
1166ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
1167f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen
1168f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        /**
1169f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         * Notifies of handover information for this call
1170f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen         */
1171f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        @Override
1172f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        public void callSessionHandover(IImsCallSession session,
1173f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                                 int srcAccessTech, int targetAccessTech,
1174f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                                 ImsReasonInfo reasonInfo) {
1175f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen            if (mListener != null) {
1176f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                mListener.callSessionHandover(ImsCallSession.this, srcAccessTech,
1177f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                        targetAccessTech, reasonInfo);
1178f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen            }
1179f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        }
1180f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen
1181f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        @Override
1182f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        public void callSessionHandoverFailed(IImsCallSession session,
1183f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                                       int srcAccessTech, int targetAccessTech,
1184f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                                       ImsReasonInfo reasonInfo) {
1185f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen            if (mListener != null) {
1186f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                mListener.callSessionHandoverFailed(ImsCallSession.this, srcAccessTech,
1187f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen                        targetAccessTech, reasonInfo);
1188f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen            }
1189f398093ec531d9cbb063a23ebfd1f16578157e51Etan Cohen        }
119031f19e6271e53f7fb359866bd32a8b6a3d47d115Shriram Ganesh
119131f19e6271e53f7fb359866bd32a8b6a3d47d115Shriram Ganesh        /**
119231f19e6271e53f7fb359866bd32a8b6a3d47d115Shriram Ganesh         * Notifies the TTY mode received from remote party.
119331f19e6271e53f7fb359866bd32a8b6a3d47d115Shriram Ganesh         */
119431f19e6271e53f7fb359866bd32a8b6a3d47d115Shriram Ganesh        @Override
119531f19e6271e53f7fb359866bd32a8b6a3d47d115Shriram Ganesh        public void callSessionTtyModeReceived(IImsCallSession session,
119631f19e6271e53f7fb359866bd32a8b6a3d47d115Shriram Ganesh                int mode) {
119731f19e6271e53f7fb359866bd32a8b6a3d47d115Shriram Ganesh            if (mListener != null) {
1198987bab859324396c0d1fc00c375f98f3f74c9067Pavel Zhamaitsiak                mListener.callSessionTtyModeReceived(ImsCallSession.this, mode);
119931f19e6271e53f7fb359866bd32a8b6a3d47d115Shriram Ganesh            }
120031f19e6271e53f7fb359866bd32a8b6a3d47d115Shriram Ganesh        }
1201ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
1202168c634eef29f21c73129164207d04b8cce23738Tyler Gunn
1203168c634eef29f21c73129164207d04b8cce23738Tyler Gunn    /**
1204168c634eef29f21c73129164207d04b8cce23738Tyler Gunn     * Provides a string representation of the {@link ImsCallSession}.  Primarily intended for
1205168c634eef29f21c73129164207d04b8cce23738Tyler Gunn     * use in log statements.
1206168c634eef29f21c73129164207d04b8cce23738Tyler Gunn     *
1207168c634eef29f21c73129164207d04b8cce23738Tyler Gunn     * @return String representation of session.
1208168c634eef29f21c73129164207d04b8cce23738Tyler Gunn     */
1209168c634eef29f21c73129164207d04b8cce23738Tyler Gunn    @Override
1210168c634eef29f21c73129164207d04b8cce23738Tyler Gunn    public String toString() {
1211168c634eef29f21c73129164207d04b8cce23738Tyler Gunn        StringBuilder sb = new StringBuilder();
1212168c634eef29f21c73129164207d04b8cce23738Tyler Gunn        sb.append("[ImsCallSession objId:");
1213168c634eef29f21c73129164207d04b8cce23738Tyler Gunn        sb.append(System.identityHashCode(this));
1214168c634eef29f21c73129164207d04b8cce23738Tyler Gunn        sb.append(" state:");
1215168c634eef29f21c73129164207d04b8cce23738Tyler Gunn        sb.append(State.toString(getState()));
1216168c634eef29f21c73129164207d04b8cce23738Tyler Gunn        sb.append(" callId:");
1217168c634eef29f21c73129164207d04b8cce23738Tyler Gunn        sb.append(getCallId());
1218168c634eef29f21c73129164207d04b8cce23738Tyler Gunn        sb.append("]");
1219168c634eef29f21c73129164207d04b8cce23738Tyler Gunn        return sb.toString();
1220168c634eef29f21c73129164207d04b8cce23738Tyler Gunn    }
1221ef36ef67e009449300b0150c60c9f637e205d79eWink Saville}
1222