ImsPhoneConnection.java revision d325833e9248c05305b1edabb1d8efc827803f75
1a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/*
2a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Copyright (C) 2013 The Android Open Source Project
3a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville *
4a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * you may not use this file except in compliance with the License.
6a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * You may obtain a copy of the License at
7a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville *
8a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville *
10a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Unless required by applicable law or agreed to in writing, software
11a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * See the License for the specific language governing permissions and
14a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * limitations under the License.
15a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */
16a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
17a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepackage com.android.internal.telephony.imsphone;
18a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
19a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.Context;
20a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.AsyncResult;
21a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Handler;
22a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Looper;
23a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Message;
24a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.PowerManager;
25a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Registrant;
26a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.SystemClock;
27a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.DisconnectCause;
28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.PhoneNumberUtils;
29a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.Rlog;
30a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
312999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunnimport com.android.ims.ImsException;
327fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunnimport com.android.ims.ImsStreamMediaProfile;
33a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CallStateException;
34a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Connection;
35a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Phone;
36a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.PhoneConstants;
37a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.UUSInfo;
38a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
39a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsCall;
40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsCallProfile;
41a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
42a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/**
43a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * {@hide}
44a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */
45a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepublic class ImsPhoneConnection extends Connection {
46a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final String LOG_TAG = "ImsPhoneConnection";
47a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final boolean DBG = true;
48a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
49a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    //***** Instance Variables
50a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
51a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private ImsPhoneCallTracker mOwner;
52a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private ImsPhoneCall mParent;
53a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private ImsCall mImsCall;
54a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
55a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private String mAddress;     // MAY BE NULL!!!
56a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private String mDialString;          // outgoing calls only
57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private String mPostDialString;      // outgoing calls only
58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private boolean mIsIncoming;
59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private boolean mDisconnected;
60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*
62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    int mIndex;          // index in ImsPhoneCallTracker.connections[], -1 if unassigned
63a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        // The GSM index is 1 + this
64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    */
65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*
67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * These time/timespan values are based on System.currentTimeMillis(),
68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * i.e., "wall clock" time.
69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private long mCreateTime;
71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private long mConnectTime;
72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private long mDisconnectTime;
73a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*
75a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * These time/timespan values are based on SystemClock.elapsedRealTime(),
76a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * i.e., time since boot.  They are appropriate for comparison and
77a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * calculating deltas.
78a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
79a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private long mConnectTimeReal;
80a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private long mDuration;
81a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private long mHoldingStartTime;  // The time when the Connection last transitioned
82a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            // into HOLDING
83a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private int mNextPostDialChar;       // index into postDialString
85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
86a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private int mCause = DisconnectCause.NOT_DISCONNECTED;
87a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private PostDialState mPostDialState = PostDialState.NOT_STARTED;
88a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private int mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED;
89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private UUSInfo mUusInfo;
90a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
91a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private boolean mIsMultiparty = false;
92a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private Handler mHandler;
94a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private PowerManager.WakeLock mPartialWakeLock;
96a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
97a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    //***** Event Constants
98a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_DTMF_DONE = 1;
99a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_PAUSE_DONE = 2;
100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_NEXT_POST_DIAL = 3;
101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_WAKE_LOCK_TIMEOUT = 4;
102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    //***** Constants
104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int PAUSE_DELAY_MILLIS = 3 * 1000;
105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000;
106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    //***** Inner Classes
108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    class MyHandler extends Handler {
110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        MyHandler(Looper l) {super(l);}
111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        @Override
113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        public void
114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        handleMessage(Message msg) {
115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            switch (msg.what) {
117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                case EVENT_NEXT_POST_DIAL:
118a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                case EVENT_DTMF_DONE:
119a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                case EVENT_PAUSE_DONE:
120a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    processNextPostDialChar();
121a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    break;
122a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                case EVENT_WAKE_LOCK_TIMEOUT:
123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    releaseWakeLock();
124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    break;
125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    //***** Constructors
130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /** This is probably an MT call */
132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/
133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    ImsPhoneConnection(Context context, ImsCall imsCall, ImsPhoneCallTracker ct, ImsPhoneCall parent) {
134a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        createWakeLock(context);
135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        acquireWakeLock();
136a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
137a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mOwner = ct;
138a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mHandler = new MyHandler(mOwner.getLooper());
139a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mImsCall = imsCall;
140a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
141a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if ((imsCall != null) && (imsCall.getCallProfile() != null)) {
142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mAddress = imsCall.getCallProfile().getCallExtra(ImsCallProfile.EXTRA_OI);
143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mCnapName = imsCall.getCallProfile().getCallExtra(ImsCallProfile.EXTRA_CNA);
144d325833e9248c05305b1edabb1d8efc827803f75Jing Zhao            mNumberPresentation = ImsCallProfile.OIRToPresentation(
145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    imsCall.getCallProfile().getCallExtraInt(ImsCallProfile.EXTRA_OIR));
146d325833e9248c05305b1edabb1d8efc827803f75Jing Zhao            mCnapNamePresentation = ImsCallProfile.OIRToPresentation(
147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    imsCall.getCallProfile().getCallExtraInt(ImsCallProfile.EXTRA_CNAP));
14864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
14964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn            ImsCallProfile imsCallProfile = imsCall.getCallProfile();
15064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn            if (imsCallProfile != null) {
15164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn                int callType = imsCall.getCallProfile().mCallType;
15264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn                setVideoState(ImsCallProfile.getVideoStateFromCallType(callType));
1537fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
1547fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn                ImsStreamMediaProfile mediaProfile = imsCallProfile.mMediaProfile;
1557fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn                if (mediaProfile != null) {
1567fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn                    setAudioQuality(getAudioQualityFromMediaProfile(mediaProfile));
1577fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn                }
15864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn            }
1593a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn
1603a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn            // Determine if the current call have video capabilities.
1613a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn            try {
1623a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn                ImsCallProfile localCallProfile = imsCall.getLocalCallProfile();
1633a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn                if (localCallProfile != null) {
1643a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn                    int localCallTypeCapability = localCallProfile.mCallType;
1653a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn                    boolean isLocalVideoCapable = localCallTypeCapability
1663a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn                            == ImsCallProfile.CALL_TYPE_VT;
1673a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn
1683a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn                    setLocalVideoCapable(isLocalVideoCapable);
1693a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn                }
1703a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn            } catch (ImsException e) {
1713a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn                // No session, so cannot get local capabilities.
1723a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn            }
173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mNumberPresentation = PhoneConstants.PRESENTATION_UNKNOWN;
175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mCnapNamePresentation = PhoneConstants.PRESENTATION_UNKNOWN;
176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mIsIncoming = true;
179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCreateTime = System.currentTimeMillis();
180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mUusInfo = null;
181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        //mIndex = index;
183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mParent = parent;
185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mParent.attach(this, ImsPhoneCall.State.INCOMING);
186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /** This is an MO call, created when dialing */
189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/
190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    ImsPhoneConnection(Context context, String dialString, ImsPhoneCallTracker ct, ImsPhoneCall parent) {
191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        createWakeLock(context);
192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        acquireWakeLock();
193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mOwner = ct;
195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mHandler = new MyHandler(mOwner.getLooper());
196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mDialString = dialString;
198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString);
200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString);
201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        //mIndex = -1;
203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mIsIncoming = false;
205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCnapName = null;
206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED;
207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED;
208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCreateTime = System.currentTimeMillis();
209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mParent = parent;
211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        parent.attachFake(this, ImsPhoneCall.State.DIALING);
212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void dispose() {
215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    static boolean
218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    equalsHandlesNulls (Object a, Object b) {
219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return (a == null) ? (b == null) : a.equals (b);
220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
2227fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    /**
2237fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     * Determines the {@link ImsPhoneConnection} audio quality based on an
2247fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     * {@link ImsStreamMediaProfile}.
2257fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     *
2267fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     * @param mediaProfile The media profile.
2277fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     * @return The audio quality.
2287fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     */
2297fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    private int getAudioQualityFromMediaProfile(ImsStreamMediaProfile mediaProfile) {
2307fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        int audioQuality;
2317fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
2327fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        // The Adaptive Multi-Rate Wideband codec is used for high definition audio calls.
2337fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        if (mediaProfile.mAudioQuality == ImsStreamMediaProfile.AUDIO_QUALITY_AMR_WB) {
2347fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn            audioQuality = AUDIO_QUALITY_HIGH_DEFINITION;
2357fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        } else {
2367fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn            audioQuality = AUDIO_QUALITY_STANDARD;
2377fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        }
2387fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
2397fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        return audioQuality;
2407fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    }
2417fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
2427fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public String getOrigDialString(){
245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mDialString;
246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public String getAddress() {
250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mAddress;
251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public ImsPhoneCall getCall() {
255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mParent;
256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getCreateTime() {
260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mCreateTime;
261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getConnectTime() {
265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mConnectTime;
266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getConnectTimeReal() {
270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mConnectTimeReal;
271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getDisconnectTime() {
275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mDisconnectTime;
276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getDurationMillis() {
280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mConnectTimeReal == 0) {
281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return 0;
282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (mDuration == 0) {
283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return SystemClock.elapsedRealtime() - mConnectTimeReal;
284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return mDuration;
286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getHoldingStartTime() {
291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mHoldingStartTime;
292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getHoldDurationMillis() {
296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (getState() != ImsPhoneCall.State.HOLDING) {
297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // If not holding, return 0
298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return 0;
299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return SystemClock.elapsedRealtime() - mHoldingStartTime;
301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public int getDisconnectCause() {
306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mCause;
307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void setDisconnectCause(int cause) {
310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCause = cause;
311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public ImsPhoneCallTracker getOwner () {
314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mOwner;
315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public boolean isIncoming() {
319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mIsIncoming;
320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public ImsPhoneCall.State getState() {
324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mDisconnected) {
325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return ImsPhoneCall.State.DISCONNECTED;
326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return super.getState();
328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void hangup() throws CallStateException {
333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (!mDisconnected) {
334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mOwner.hangup(this);
335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            throw new CallStateException ("disconnected");
337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
340a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void separate() throws CallStateException {
342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        throw new CallStateException ("not supported");
343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
344a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
345a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public PostDialState getPostDialState() {
347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mPostDialState;
348a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
349a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
350a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
351a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void proceedAfterWaitChar() {
352a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialState != PostDialState.WAIT) {
353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            Rlog.w(LOG_TAG, "ImsPhoneConnection.proceedAfterWaitChar(): Expected "
354a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    + "getPostDialState() to be WAIT but was " + mPostDialState);
355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return;
356a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
357a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
358a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setPostDialState(PostDialState.STARTED);
359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        processNextPostDialChar();
361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
364a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void proceedAfterWildChar(String str) {
365a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialState != PostDialState.WILD) {
366a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            Rlog.w(LOG_TAG, "ImsPhoneConnection.proceedAfterWaitChar(): Expected "
367a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    + "getPostDialState() to be WILD but was " + mPostDialState);
368a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return;
369a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
370a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
371a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setPostDialState(PostDialState.STARTED);
372a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
373a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // make a new postDialString, with the wild char replacement string
374a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // at the beginning, followed by the remaining postDialString.
375a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
376a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        StringBuilder buf = new StringBuilder(str);
377a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        buf.append(mPostDialString.substring(mNextPostDialChar));
378a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPostDialString = buf.toString();
379a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mNextPostDialChar = 0;
380a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (Phone.DEBUG_PHONE) {
381a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            Rlog.d(LOG_TAG, "proceedAfterWildChar: new postDialString is " +
382a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    mPostDialString);
383a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
384a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
385a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        processNextPostDialChar();
386a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
387a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
388a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
389a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void cancelPostDial() {
390a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setPostDialState(PostDialState.CANCELLED);
391a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
392a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
393a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
394a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Called when this Connection is being hung up locally (eg, user pressed "end")
395a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
396a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    void
397a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    onHangupLocal() {
398a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCause = DisconnectCause.LOCAL;
399a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
400a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
401a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /** Called when the connection has been disconnected */
402a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ boolean
403a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    onDisconnect(int cause) {
404a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause);
405a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mCause != DisconnectCause.LOCAL) mCause = cause;
406a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return onDisconnect();
407a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
408a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
409a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ boolean
410a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    onDisconnect() {
411a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        boolean changed = false;
412a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
413a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (!mDisconnected) {
414a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            //mIndex = -1;
415a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
416a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mDisconnectTime = System.currentTimeMillis();
417a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal;
418a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mDisconnected = true;
419a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
420a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mOwner.mPhone.notifyDisconnect(this);
421a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
422a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (mParent != null) {
423a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                changed = mParent.connectionDisconnected(this);
424a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            } else {
425a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                Rlog.d(LOG_TAG, "onDisconnect: no parent");
426a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (mImsCall != null) mImsCall.close();
428a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mImsCall = null;
429a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
430a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        releaseWakeLock();
431a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return changed;
432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
433a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
435a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * An incoming or outgoing call has connected
436a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
437a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    void
438a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    onConnectedInOrOut() {
439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mConnectTime = System.currentTimeMillis();
440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mConnectTimeReal = SystemClock.elapsedRealtime();
441a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mDuration = 0;
442a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
443a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (Phone.DEBUG_PHONE) {
444a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            Rlog.d(LOG_TAG, "onConnectedInOrOut: connectTime=" + mConnectTime);
445a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
446a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
447a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (!mIsIncoming) {
448a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // outgoing calls only
449a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            processNextPostDialChar();
450a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        releaseWakeLock();
452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
454a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ void
455a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    onStartedHolding() {
456a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mHoldingStartTime = SystemClock.elapsedRealtime();
457a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
458a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
459a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Performs the appropriate action for a post-dial char, but does not
460a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * notify application. returns false if the character is invalid and
461a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * should be ignored
462a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
463a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private boolean
464a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    processPostDialChar(char c) {
465a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (PhoneNumberUtils.is12Key(c)) {
466a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mOwner.mCi.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE));
467a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (c == PhoneNumberUtils.PAUSE) {
468a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // From TS 22.101:
469a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // It continues...
470a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // Upon the called party answering the UE shall send the DTMF digits
471a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // automatically to the network after a delay of 3 seconds( 20 ).
472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // The digits shall be sent according to the procedures and timing
473a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // specified in 3GPP TS 24.008 [13]. The first occurrence of the
474a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // "DTMF Control Digits Separator" shall be used by the ME to
475a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // distinguish between the addressing digits (i.e. the phone number)
476a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // and the DTMF digits. Upon subsequent occurrences of the
477a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // separator,
478a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // the UE shall pause again for 3 seconds ( 20 ) before sending
479a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // any further DTMF digits.
480a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE),
481a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    PAUSE_DELAY_MILLIS);
482a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (c == PhoneNumberUtils.WAIT) {
483a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            setPostDialState(PostDialState.WAIT);
484a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (c == PhoneNumberUtils.WILD) {
485a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            setPostDialState(PostDialState.WILD);
486a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
487a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return false;
488a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
489a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
490a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return true;
491a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
492a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
493a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
494a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public String
495a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    getRemainingPostDialString() {
496a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialState == PostDialState.CANCELLED
497a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            || mPostDialState == PostDialState.COMPLETE
498a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            || mPostDialString == null
499a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            || mPostDialString.length() <= mNextPostDialChar
500a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        ) {
501a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return "";
502a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
503a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
504a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mPostDialString.substring(mNextPostDialChar);
505a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
506a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
507a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
508a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected void finalize()
509a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    {
510a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        releaseWakeLock();
511a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
512a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
513a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void
514a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    processNextPostDialChar() {
515a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        char c = 0;
516a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Registrant postDialHandler;
517a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
518a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialState == PostDialState.CANCELLED) {
519a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            //Rlog.d(LOG_TAG, "##### processNextPostDialChar: postDialState == CANCELLED, bail");
520a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return;
521a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
522a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
523a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialString == null ||
524a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mPostDialString.length() <= mNextPostDialChar) {
525a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            setPostDialState(PostDialState.COMPLETE);
526a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
527a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // notifyMessage.arg1 is 0 on complete
528a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            c = 0;
529a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
530a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            boolean isValid;
531a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
532a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            setPostDialState(PostDialState.STARTED);
533a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
534a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            c = mPostDialString.charAt(mNextPostDialChar++);
535a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
536a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            isValid = processPostDialChar(c);
537a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
538a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (!isValid) {
539a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                // Will call processNextPostDialChar
540a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget();
541a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                // Don't notify application
542a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                Rlog.e(LOG_TAG, "processNextPostDialChar: c=" + c + " isn't valid!");
543a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return;
544a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
545a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
546a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
547a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        postDialHandler = mOwner.mPhone.mPostDialHandler;
548a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
549a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Message notifyMessage;
550a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
551a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (postDialHandler != null
552a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                && (notifyMessage = postDialHandler.messageForRegistrant()) != null) {
553a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // The AsyncResult.result is the Connection object
554a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            PostDialState state = mPostDialState;
555a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            AsyncResult ar = AsyncResult.forMessage(notifyMessage);
556a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            ar.result = this;
557a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            ar.userObj = state;
558a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
559a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // arg1 is the character that was/is being processed
560a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            notifyMessage.arg1 = c;
561a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
562a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            //Rlog.v(LOG_TAG, "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c);
563a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            notifyMessage.sendToTarget();
564a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
565a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
566a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
567a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
568a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Set post dial state and acquire wake lock while switching to "started"
569a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * state, the wake lock will be released if state switches out of "started"
570a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * state or after WAKE_LOCK_TIMEOUT_MILLIS.
571a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * @param s new PostDialState
572a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
573a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void setPostDialState(PostDialState s) {
574a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialState != PostDialState.STARTED
575a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                && s == PostDialState.STARTED) {
576a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            acquireWakeLock();
577a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT);
578a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS);
579a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (mPostDialState == PostDialState.STARTED
580a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                && s != PostDialState.STARTED) {
581a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT);
582a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            releaseWakeLock();
583a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
584a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPostDialState = s;
585a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
586a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
587a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void
588a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    createWakeLock(Context context) {
589a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
590a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG);
591a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
592a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
593a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void
594a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    acquireWakeLock() {
595a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Rlog.d(LOG_TAG, "acquireWakeLock");
596a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPartialWakeLock.acquire();
597a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
598a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
599a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void
600a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    releaseWakeLock() {
601a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        synchronized(mPartialWakeLock) {
602a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (mPartialWakeLock.isHeld()) {
603a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                Rlog.d(LOG_TAG, "releaseWakeLock");
604a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mPartialWakeLock.release();
605a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
606a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
607a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
608a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
609a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
610a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public int getNumberPresentation() {
611a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mNumberPresentation;
612a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
613a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
614a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
615a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public UUSInfo getUUSInfo() {
616a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mUusInfo;
617a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
618a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
619a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
620a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public Connection getOrigConnection() {
621a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return null;
622a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
623a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
624a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /* package */ void
625a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    setMultiparty(boolean isMultiparty) {
626a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Rlog.d(LOG_TAG, "setMultiparty " + isMultiparty);
627a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mIsMultiparty = isMultiparty;
628a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
629a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
630a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
631a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public boolean isMultiparty() {
632a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mIsMultiparty;
633a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
634a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
635a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ ImsCall getImsCall() {
636a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mImsCall;
637a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
638a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
639a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ void setImsCall(ImsCall imsCall) {
640a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mImsCall = imsCall;
641a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
642a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
643a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ void changeParent(ImsPhoneCall parent) {
644a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mParent = parent;
645a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
646a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
647a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ boolean
648a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    update(ImsCall imsCall, ImsPhoneCall.State state) {
649a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        boolean changed = false;
650a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
651a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (state == ImsPhoneCall.State.ACTIVE) {
652a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (mParent.getState().isRinging()
653a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    || mParent.getState().isDialing()) {
654a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                onConnectedInOrOut();
655a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
656a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
657a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (mParent.getState().isRinging()
658a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    || mParent == mOwner.mBackgroundCall) {
659a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                //mForegroundCall should be IDLE
660a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                //when accepting WAITING call
661a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                //before accept WAITING call,
662a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                //the ACTIVE call should be held ahead
663a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mParent.detach(this);
664a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mParent = mOwner.mForegroundCall;
665a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mParent.attach(this);
666a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
667a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (state == ImsPhoneCall.State.HOLDING) {
668a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            onStartedHolding();
669a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
670a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
671a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        changed = mParent.update(this, imsCall, state);
672a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
6732999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        // Check for a change in the video capabilities for the call and update the
6742999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        // {@link ImsPhoneConnection} with this information.
6752999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        try {
6762999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn            // Get the current local VT capabilities (i.e. even if currentCallType above is
6772999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn            // audio-only, the local capability could support bi-directional video).
6782999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn            ImsCallProfile localCallProfile = imsCall.getLocalCallProfile();
6792999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn            if (localCallProfile != null) {
6802999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn                int localCallTypeCapability = localCallProfile.mCallType;
6812999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn                boolean newLocalVideoCapable = localCallTypeCapability
6822999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn                        == ImsCallProfile.CALL_TYPE_VT;
6832999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn
6842999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn                if (isLocalVideoCapable() != newLocalVideoCapable) {
6852999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn                    setLocalVideoCapable(newLocalVideoCapable);
6862999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn                    changed = true;
6872999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn                }
6882999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn            }
6892999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        } catch (ImsException e) {
6902999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn            // No session in place -- no change
6912999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        }
6922999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn
6937fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        // Check for a change in the call type / video state, or audio quality of the
6947fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        // {@link ImsCall} and update the {@link ImsPhoneConnection} with this information.
6952999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        ImsCallProfile callProfile = imsCall.getCallProfile();
6962999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        if (callProfile != null) {
6972999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn            int oldVideoState = getVideoState();
6982999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn            int newVideoState = ImsCallProfile.getVideoStateFromCallType(callProfile.mCallType);
6992999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn
7002999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn            if (oldVideoState != newVideoState) {
7012999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn                setVideoState(newVideoState);
7022999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn                changed = true;
7032999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn            }
7047fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
7057fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn            ImsStreamMediaProfile mediaProfile = callProfile.mMediaProfile;
7067fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn            if (mediaProfile != null) {
7077fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn                int oldAudioQuality = getAudioQuality();
7087fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn                int newAudioQuality = getAudioQualityFromMediaProfile(mediaProfile);
7097fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
7107fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn                if (oldAudioQuality != newAudioQuality) {
7117fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn                    setAudioQuality(newAudioQuality);
7127fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn                    changed = true;
7137fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn                }
7147fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn            }
7152999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        }
7167fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
717a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return changed;
718a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
719a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
720a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
721a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public int getPreciseDisconnectCause() {
722a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return 0;
723a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
724a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville}
72564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
726