1ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger/*
2264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger * Copyright (C) 2018 The Android Open Source Project
3ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger *
4ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger * Licensed under the Apache License, Version 2.0 (the "License");
5ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger * you may not use this file except in compliance with the License.
6ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger * You may obtain a copy of the License at
7ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger *
8ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger *      http://www.apache.org/licenses/LICENSE-2.0
9ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger *
10ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger * Unless required by applicable law or agreed to in writing, software
11ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger * distributed under the License is distributed on an "AS IS" BASIS,
12ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger * See the License for the specific language governing permissions and
14ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger * limitations under the License
15ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger */
16ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
17264625486becc65fac29d7094cfba6d591daeae4Brad Ebingerpackage android.telephony.ims;
18ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
19f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebingerimport android.annotation.SystemApi;
20ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebingerimport android.os.RemoteException;
21264625486becc65fac29d7094cfba6d591daeae4Brad Ebingerimport android.telephony.ims.aidl.IImsCallSessionListener;
22f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebingerimport android.telephony.ims.stub.ImsCallSessionImplBase;
23ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
24264625486becc65fac29d7094cfba6d591daeae4Brad Ebingerimport com.android.ims.internal.IImsCallSession;
25ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
26ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger/**
27f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger * Listener interface for notifying the Framework's {@link ImsCallSession} for updates to an ongoing
28f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger * IMS call.
29ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger *
30ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger * @hide
31ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger */
32f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger// DO NOT remove or change the existing APIs, only add new ones to this implementation or you
33f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger// will break other implementations of ImsCallSessionListener maintained by other ImsServices.
34f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger// TODO: APIs in here do not conform to API guidelines yet. This can be changed if
35f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger// ImsCallSessionListenerConverter is also changed.
36f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger@SystemApi
37ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebingerpublic class ImsCallSessionListener {
38ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
39ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    private final IImsCallSessionListener mListener;
40ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
41f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    /** @hide */
42ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    public ImsCallSessionListener(IImsCallSessionListener l) {
43ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger        mListener = l;
44ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
45ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
46ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
47f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * A request has been sent out to initiate a new IMS call session and a 1xx response has been
48f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * received from the network.
49ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
50f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionProgressing(ImsStreamMediaProfile profile) {
51f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
52f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionProgressing(profile);
53f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
54f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
55f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
56ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
57ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
58ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
59f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session has been initiated.
60ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
61f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param profile the associated {@link ImsCallProfile}.
62ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
63f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionInitiated(ImsCallProfile profile) {
64f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
65f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionInitiated(profile);
66f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
67f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
68f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
69ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
70ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
71ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
72f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session establishment has failed.
73ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
74f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo {@link ImsReasonInfo} detailing the reason of the IMS call session
75f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * establishment failure.
76ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
77f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionInitiatedFailed(ImsReasonInfo reasonInfo) {
78f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
79f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionInitiatedFailed(reasonInfo);
80f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
81f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
82f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
83ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
84ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
85ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
86f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session has been terminated.
87ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
88f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo {@link ImsReasonInfo} detailing the reason of the session termination.
89ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
90f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionTerminated(ImsReasonInfo reasonInfo) {
91f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
92f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionTerminated(reasonInfo);
93f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
94f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
95f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
96ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
97ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
98ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
99f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session has started the process of holding the call. If it fails,
100f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * {@link #callSessionHoldFailed(ImsReasonInfo)} should be called.
101f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
102f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * If the IMS call session is resumed, call {@link #callSessionResumed(ImsCallProfile)}.
103f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
104f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param profile The associated {@link ImsCallProfile} of the call session that has been put
105f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * on hold.
106ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
107f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionHeld(ImsCallProfile profile) {
108f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
109f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionHeld(profile);
110f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
111f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
112f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
113ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
114ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
115ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
116f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session has failed to be held.
117ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
118f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo {@link ImsReasonInfo} detailing the reason of the session hold failure.
119ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
120f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionHoldFailed(ImsReasonInfo reasonInfo) {
121f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
122f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionHoldFailed(reasonInfo);
123f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
124f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
125f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
126ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
127ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
128ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
129f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * This IMS Call session has been put on hold by the remote party.
130f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
131f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param profile The {@link ImsCallProfile} associated with this IMS call session.
132ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
133f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionHoldReceived(ImsCallProfile profile) {
134f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
135f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionHoldReceived(profile);
136f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
137f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
138f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
139ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
140ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
141ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
142f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session has started the process of resuming the call. If the process of resuming
143f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * the call fails, call {@link #callSessionResumeFailed(ImsReasonInfo)}.
144f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
145f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param profile The {@link ImsCallProfile} associated with this IMS call session.
146ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
147f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionResumed(ImsCallProfile profile) {
148f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
149f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionResumed(profile);
150f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
151f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
152f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
153ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
154ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
155ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
156f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session resume has failed.
157ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
158f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo {@link ImsReasonInfo} containing the detailed reason of the session resume
159f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * failure.
160ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
161f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionResumeFailed(ImsReasonInfo reasonInfo) {
162f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
163f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionResumeFailed(reasonInfo);
164f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
165f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
166f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
167ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
168ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
169ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
170f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The remote party has resumed this IMS call session.
171f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
172f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param profile {@link ImsCallProfile} associated with the IMS call session.
173ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
174f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionResumeReceived(ImsCallProfile profile) {
175f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
176f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionResumeReceived(profile);
177f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
178f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
179f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
180ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
181ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
182ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
183f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session merge has been started.  At this point, the {@code newSession}
184f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * represents the IMS call session which represents the new merged conference and has been
185f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * initiated to the IMS conference server.
186ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
187f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param newSession the {@link ImsCallSessionImplBase} that represents the merged active & held
188f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * sessions.
189f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param profile The {@link ImsCallProfile} associated with this IMS call session.
190ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
191f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionMergeStarted(ImsCallSessionImplBase newSession, ImsCallProfile profile)
192f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    {
193f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
194f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionMergeStarted(newSession != null ?
195f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger                            newSession.getServiceImpl() : null, profile);
196f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
197f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
198f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
199ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
200ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
201ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
202f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * Compatibility method for older implementations.
203f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * See {@link #callSessionMergeStarted(ImsCallSessionImplBase, ImsCallProfile)}.
204264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     *
205264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     * @hide
206264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     */
207264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger    public void callSessionMergeStarted(IImsCallSession newSession, ImsCallProfile profile)
208f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    {
209f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
210f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionMergeStarted(newSession, profile);
211f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
212f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
213f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
214264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger    }
215264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger
216264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger    /**
217f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The session merge is successful and the merged {@link ImsCallSession} is active.
218ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
219f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param newSession the new {@link ImsCallSessionImplBase}
220f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *                  that represents the conference IMS call
221f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * session.
222ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
223f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionMergeComplete(ImsCallSessionImplBase newSession) {
224f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
225f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionMergeComplete(newSession != null ?
226f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger                    newSession.getServiceImpl() : null);
227f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
228f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
229f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
230ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
231ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
232ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
233f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * Compatibility method for older implementations of ImsService.
234264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     *
235f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * See {@link #callSessionMergeComplete(ImsCallSessionImplBase)}}.
236264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     *
237264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     * @hide
238264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     */
239f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionMergeComplete(IImsCallSession newSession) {
240f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
241f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionMergeComplete(newSession);
242f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
243f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
244f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
245264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger    }
246264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger
247264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger    /**
248f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session merge has failed.
249ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
250f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo {@link ImsReasonInfo} contining the reason for the call merge failure.
251ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
252f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionMergeFailed(ImsReasonInfo reasonInfo) {
253f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
254f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionMergeFailed(reasonInfo);
255f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
256f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
257f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
258ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
259ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
260ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
261f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session profile has been updated. Does not include holding or resuming a call.
262f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
263f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param profile The {@link ImsCallProfile} associated with the updated IMS call session.
264ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
265f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionUpdated(ImsCallProfile profile) {
266f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
267f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionUpdated(profile);
268f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
269f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
270f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
271ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
272ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
273ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
274f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session profile update has failed.
275ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
276f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo {@link ImsReasonInfo} containing a reason for the session update failure.
277ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
278f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionUpdateFailed(ImsReasonInfo reasonInfo) {
279f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
280f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionUpdateFailed(reasonInfo);
281f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
282f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
283f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
284ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
285ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
286ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
287f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session profile has received an update from the remote user.
288f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
289f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param profile The new {@link ImsCallProfile} associated with the update.
290ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
291f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionUpdateReceived(ImsCallProfile profile) {
292f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
293f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionUpdateReceived(profile);
294f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
295f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
296f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
297ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
298ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
299ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
300ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     * Called when the session has been extended to a conference session.
301ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
302f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * If the conference extension fails, call
303f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * {@link #callSessionConferenceExtendFailed(ImsReasonInfo)}.
304f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
305f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param newSession the session object that is extended to the conference from the active
306f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * IMS Call session.
307f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param profile The {@link ImsCallProfile} associated with the IMS call session.
308ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
309f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionConferenceExtended(ImsCallSessionImplBase newSession,
310f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            ImsCallProfile profile) {
311f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
312f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionConferenceExtended(
313f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger                    newSession != null ? newSession.getServiceImpl() : null, profile);
314f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
315f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
316f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
317ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
318ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
319ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
320f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * Compatibility method to interface with older versions of ImsService.
321f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * See {@link #callSessionConferenceExtended(ImsCallSessionImplBase, ImsCallProfile)}.
322264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     *
323264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     * @hide
324264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     */
325f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionConferenceExtended(IImsCallSession newSession, ImsCallProfile profile) {
326f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
327f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionConferenceExtended(newSession, profile);
328f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
329f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
330f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
331264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger    }
332264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger
333264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger    /**
334f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The previous conference extension has failed.
335ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
336f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo {@link ImsReasonInfo} containing the detailed reason of the conference
337f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * extension failure.
338ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
339f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionConferenceExtendFailed(ImsReasonInfo reasonInfo) {
340f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
341f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionConferenceExtendFailed(reasonInfo);
342f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
343f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
344f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
345ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
346ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
347ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
348f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * A conference extension has been received received from the remote party.
349f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
350f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param newSession An {@link ImsCallSessionImplBase}
351f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *                   representing the extended IMS call session.
352f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param profile The {@link ImsCallProfile} associated with the new IMS call session.
353ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
354f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionConferenceExtendReceived(ImsCallSessionImplBase newSession,
355f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            ImsCallProfile profile) {
356f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
357f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionConferenceExtendReceived(newSession != null
358f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger                    ? newSession.getServiceImpl() : null, profile);
359f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
360f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
361f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
362ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
363ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
364ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
365f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * Compatibility method to interface with older versions of ImsService.
366f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * See {@link #callSessionConferenceExtendReceived(ImsCallSessionImplBase, ImsCallProfile)}.
367264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     *
368264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     * @hide
369264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger     */
370264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger    public void callSessionConferenceExtendReceived(IImsCallSession newSession,
371f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            ImsCallProfile profile) {
372f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
373f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionConferenceExtendReceived(newSession, profile);
374f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
375f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
376f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
377264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger    }
378264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger
379264625486becc65fac29d7094cfba6d591daeae4Brad Ebinger    /**
380f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The request to invite participants to the conference has been delivered to the conference
381ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     * server.
382ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
383f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionInviteParticipantsRequestDelivered() {
384f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
385f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionInviteParticipantsRequestDelivered();
386f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
387f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
388f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
389ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
390ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
391ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
392f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The previous request to invite participants to the conference (see
393f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * {@link #callSessionInviteParticipantsRequestDelivered()}) has failed.
394ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
395f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo {@link ImsReasonInfo} detailing the reason forthe conference invitation
396f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * failure.
397ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
398ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    public void callSessionInviteParticipantsRequestFailed(ImsReasonInfo reasonInfo)
399f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    {
400f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
401f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionInviteParticipantsRequestFailed(reasonInfo);
402f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
403f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
404f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
405ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
406ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
407ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
408f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The request to remove participants from the conference has been delivered to the conference
409ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     * server.
410ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
411f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionRemoveParticipantsRequestDelivered() {
412f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
413f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionRemoveParticipantsRequestDelivered();
414f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
415f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
416f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
417ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
418ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
419ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
420f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The previous request to remove participants from the conference (see
421f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * {@link #callSessionRemoveParticipantsRequestDelivered()}) has failed.
422ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
423f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo {@link ImsReasonInfo} detailing the reason for the conference removal
424f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * failure.
425ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
426ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    public void callSessionRemoveParticipantsRequestFailed(ImsReasonInfo reasonInfo)
427f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    {
428f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
429f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionInviteParticipantsRequestFailed(reasonInfo);
430f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
431f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
432f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
433ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
434ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
435ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
436f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session's conference state has changed.
437ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
438f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param state The new {@link ImsConferenceState} associated with the conference.
439ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
440f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionConferenceStateUpdated(ImsConferenceState state) {
441f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
442f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionConferenceStateUpdated(state);
443f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
444f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
445f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
446ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
447ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
448ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
449f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session has received a Ussd message.
450f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
451f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param mode The mode of the USSD message, either
452f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * {@link ImsCallSessionImplBase#USSD_MODE_NOTIFY} or
453f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * {@link ImsCallSessionImplBase#USSD_MODE_REQUEST}.
454f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param ussdMessage The USSD message.
455ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
456ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    public void callSessionUssdMessageReceived(int mode, String ussdMessage)
457f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    {
458f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
459f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionUssdMessageReceived(mode, ussdMessage);
460f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
461f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
462f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
463ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
464ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
465ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
466f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * An {@link ImsCallSession} may potentially handover from one radio
467f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * technology to another.
468ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
469f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param srcAccessTech The source radio access technology; one of the access technology
470f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * constants defined in {@link android.telephony.ServiceState}. For example
471f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * {@link android.telephony.ServiceState#RIL_RADIO_TECHNOLOGY_LTE}.
472ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     * @param targetAccessTech The target radio access technology; one of the access technology
473f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * constants defined in {@link android.telephony.ServiceState}. For example
474f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * {@link android.telephony.ServiceState#RIL_RADIO_TECHNOLOGY_LTE}.
475ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
476ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    public void callSessionMayHandover(int srcAccessTech, int targetAccessTech)
477f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    {
478f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
479f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionMayHandover(srcAccessTech, targetAccessTech);
480f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
481f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
482f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
483ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
484ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
485ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
486f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session's access technology has changed.
487ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
488f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param srcAccessTech original access technology, defined in
489f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * {@link android.telephony.ServiceState}.
490f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param targetAccessTech new access technology, defined in
491f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * {@link android.telephony.ServiceState}.
492f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo The {@link ImsReasonInfo} associated with this handover.
493ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
494ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    public void callSessionHandover(int srcAccessTech, int targetAccessTech,
495f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            ImsReasonInfo reasonInfo) {
496f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
497f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionHandover(srcAccessTech, targetAccessTech, reasonInfo);
498f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
499f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
500f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
501ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
502ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
503ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
504f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The IMS call session's access technology change has failed..
505ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
506ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     * @param srcAccessTech original access technology
507ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     * @param targetAccessTech new access technology
508f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param reasonInfo An {@link ImsReasonInfo} detailing the reason for the failure.
509ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
510ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    public void callSessionHandoverFailed(int srcAccessTech, int targetAccessTech,
511f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            ImsReasonInfo reasonInfo) {
512f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
513f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionHandoverFailed(srcAccessTech, targetAccessTech, reasonInfo);
514f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
515f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
516f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
517ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
518ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
519ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
520f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The TTY mode has been changed by the remote party.
521ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
522ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     * @param mode one of the following: -
523ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *             {@link com.android.internal.telephony.Phone#TTY_MODE_OFF} -
524ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *             {@link com.android.internal.telephony.Phone#TTY_MODE_FULL} -
525ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *             {@link com.android.internal.telephony.Phone#TTY_MODE_HCO} -
526ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *             {@link com.android.internal.telephony.Phone#TTY_MODE_VCO}
527ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
528f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionTtyModeReceived(int mode) {
529f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
530f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionTtyModeReceived(mode);
531f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
532f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
533f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
534ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
535ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
536ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
537f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * The multiparty state has been changed for this {@code ImsCallSession}.
538ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
539f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param isMultiParty {@code true} if the session became multiparty, {@code false} otherwise.
540ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
541f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionMultipartyStateChanged(boolean isMultiParty) {
542f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
543f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionMultipartyStateChanged(isMultiParty);
544f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
545f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
546f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
547ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
548ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
549ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
550f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * Supplementary service information has been received for the current IMS call session.
551f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
552f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param suppSrvNotification The {@link ImsSuppServiceNotification} containing the change.
553ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
554ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    public void callSessionSuppServiceReceived(ImsSuppServiceNotification suppSrvNotification)
555f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    {
556f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
557f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionSuppServiceReceived(suppSrvNotification);
558f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
559f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
560f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
561ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
562ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
563ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
564f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * An RTT modify request has been received from the remote party.
565ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
566f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param callProfile An {@link ImsCallProfile} with the updated attributes
567ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
568ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    public void callSessionRttModifyRequestReceived(ImsCallProfile callProfile)
569f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    {
570f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
571f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionRttModifyRequestReceived(callProfile);
572f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
573f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
574f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
575ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
576ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
577ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
578f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * An RTT modify response has been received.
579f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     *
580ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     * @param status the received response for RTT modify request.
581ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     */
582f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionRttModifyResponseReceived(int status) {
583f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
584f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionRttModifyResponseReceived(status);
585f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
586f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
587f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
588ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
589ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
590ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    /**
591f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * An RTT message has been received from the remote party.
592ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger     *
593f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     * @param rttMessage The RTT message that has been received.
594f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger     */
595f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger    public void callSessionRttMessageReceived(String rttMessage) {
596f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        try {
597f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            mListener.callSessionRttMessageReceived(rttMessage);
598f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        } catch (RemoteException e) {
599f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger            throw new RuntimeException(e);
600f8c3cd8b3530a27f7534c32bac84c464ad5f66aeBrad Ebinger        }
601ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger    }
602ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger}
603ea8fd1bd0a13feddd53f6c7cb202ac32a1a74c28Brad Ebinger
604