ImsPhoneConnection.java revision 08e9c4b483dac2cbf1b7fe4cbad22f003ff92bcb
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;
20d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunnimport android.net.Uri;
21a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.AsyncResult;
2208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganeshimport android.os.Bundle;
23a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Handler;
24a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Looper;
25a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Message;
26a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.PowerManager;
27a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Registrant;
28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.SystemClock;
29541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunnimport android.telecom.Log;
30a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.DisconnectCause;
31a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.PhoneNumberUtils;
32a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.Rlog;
33eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganeshimport android.text.TextUtils;
34a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
352999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunnimport com.android.ims.ImsException;
367fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunnimport com.android.ims.ImsStreamMediaProfile;
37a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CallStateException;
38a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Connection;
39a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Phone;
40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.PhoneConstants;
41a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.UUSInfo;
42a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
43a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsCall;
44a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsCallProfile;
45a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
46a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/**
47a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * {@hide}
48a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */
49a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepublic class ImsPhoneConnection extends Connection {
50a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final String LOG_TAG = "ImsPhoneConnection";
51a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final boolean DBG = true;
52a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
53a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    //***** Instance Variables
54a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
55a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private ImsPhoneCallTracker mOwner;
56a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private ImsPhoneCall mParent;
57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private ImsCall mImsCall;
58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private String mPostDialString;      // outgoing calls only
60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private boolean mDisconnected;
61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*
63a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    int mIndex;          // index in ImsPhoneCallTracker.connections[], -1 if unassigned
64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        // The GSM index is 1 + this
65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    */
66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*
68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * These time/timespan values are based on System.currentTimeMillis(),
69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * i.e., "wall clock" time.
70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private long mDisconnectTime;
72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
73a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private int mNextPostDialChar;       // index into postDialString
74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
75a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private int mCause = DisconnectCause.NOT_DISCONNECTED;
76a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private PostDialState mPostDialState = PostDialState.NOT_STARTED;
77a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private UUSInfo mUusInfo;
78a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private Handler mHandler;
79a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
80a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private PowerManager.WakeLock mPartialWakeLock;
81a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
82fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn    // The cached connect time of the connection when it turns into a conference.
83fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn    private long mConferenceConnectTime = 0;
84fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn
85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    //***** Event Constants
86a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_DTMF_DONE = 1;
87a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_PAUSE_DONE = 2;
88a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_NEXT_POST_DIAL = 3;
89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_WAKE_LOCK_TIMEOUT = 4;
90a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
91a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    //***** Constants
92a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int PAUSE_DELAY_MILLIS = 3 * 1000;
93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000;
94a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    //***** Inner Classes
96a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
97a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    class MyHandler extends Handler {
98a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        MyHandler(Looper l) {super(l);}
99a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        @Override
101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        public void
102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        handleMessage(Message msg) {
103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            switch (msg.what) {
105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                case EVENT_NEXT_POST_DIAL:
106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                case EVENT_DTMF_DONE:
107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                case EVENT_PAUSE_DONE:
108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    processNextPostDialChar();
109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    break;
110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                case EVENT_WAKE_LOCK_TIMEOUT:
111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    releaseWakeLock();
112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    break;
113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    //***** Constructors
118a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
119a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /** This is probably an MT call */
120a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/
12108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh    ImsPhoneConnection(Context context, ImsCall imsCall, ImsPhoneCallTracker ct,
12208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh           ImsPhoneCall parent, boolean isUnknown) {
123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        createWakeLock(context);
124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        acquireWakeLock();
125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mOwner = ct;
127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mHandler = new MyHandler(mOwner.getLooper());
128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mImsCall = imsCall;
129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if ((imsCall != null) && (imsCall.getCallProfile() != null)) {
131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mAddress = imsCall.getCallProfile().getCallExtra(ImsCallProfile.EXTRA_OI);
132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mCnapName = imsCall.getCallProfile().getCallExtra(ImsCallProfile.EXTRA_CNA);
133d325833e9248c05305b1edabb1d8efc827803f75Jing Zhao            mNumberPresentation = ImsCallProfile.OIRToPresentation(
134a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    imsCall.getCallProfile().getCallExtraInt(ImsCallProfile.EXTRA_OIR));
135d325833e9248c05305b1edabb1d8efc827803f75Jing Zhao            mCnapNamePresentation = ImsCallProfile.OIRToPresentation(
136a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    imsCall.getCallProfile().getCallExtraInt(ImsCallProfile.EXTRA_CNAP));
1376a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            updateMediaCapabilities(imsCall);
138a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
139a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mNumberPresentation = PhoneConstants.PRESENTATION_UNKNOWN;
140a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mCnapNamePresentation = PhoneConstants.PRESENTATION_UNKNOWN;
141a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
14308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh        mIsIncoming = !isUnknown;
144a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCreateTime = System.currentTimeMillis();
145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mUusInfo = null;
146a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        //mIndex = index;
148a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
14904b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee        updateWifiState();
15004b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee
151a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mParent = parent;
15208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh        mParent.attach(this,
15308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh                (mIsIncoming? ImsPhoneCall.State.INCOMING: ImsPhoneCall.State.DIALING));
154a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
155a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
156a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /** This is an MO call, created when dialing */
157a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/
158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    ImsPhoneConnection(Context context, String dialString, ImsPhoneCallTracker ct, ImsPhoneCall parent) {
159a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        createWakeLock(context);
160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        acquireWakeLock();
161a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
162a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mOwner = ct;
163a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mHandler = new MyHandler(mOwner.getLooper());
164a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
165a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mDialString = dialString;
166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
167a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString);
168a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString);
169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        //mIndex = -1;
171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mIsIncoming = false;
173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCnapName = null;
174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED;
175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED;
176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCreateTime = System.currentTimeMillis();
177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mParent = parent;
179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        parent.attachFake(this, ImsPhoneCall.State.DIALING);
180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void dispose() {
183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    static boolean
186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    equalsHandlesNulls (Object a, Object b) {
187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return (a == null) ? (b == null) : a.equals (b);
188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public String getOrigDialString(){
192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mDialString;
193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public ImsPhoneCall getCall() {
197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mParent;
198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getDisconnectTime() {
202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mDisconnectTime;
203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getHoldingStartTime() {
207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mHoldingStartTime;
208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getHoldDurationMillis() {
212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (getState() != ImsPhoneCall.State.HOLDING) {
213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // If not holding, return 0
214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return 0;
215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return SystemClock.elapsedRealtime() - mHoldingStartTime;
217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public int getDisconnectCause() {
222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mCause;
223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void setDisconnectCause(int cause) {
226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCause = cause;
227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
22933cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu    @Override
23033cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu    public String getVendorDisconnectCause() {
23133cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu      return null;
23233cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu    }
23333cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu
234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public ImsPhoneCallTracker getOwner () {
235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mOwner;
236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
237a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public ImsPhoneCall.State getState() {
240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mDisconnected) {
241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return ImsPhoneCall.State.DISCONNECTED;
242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return super.getState();
244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void hangup() throws CallStateException {
249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (!mDisconnected) {
250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mOwner.hangup(this);
251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            throw new CallStateException ("disconnected");
253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void separate() throws CallStateException {
258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        throw new CallStateException ("not supported");
259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public PostDialState getPostDialState() {
263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mPostDialState;
264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void proceedAfterWaitChar() {
268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialState != PostDialState.WAIT) {
269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            Rlog.w(LOG_TAG, "ImsPhoneConnection.proceedAfterWaitChar(): Expected "
270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    + "getPostDialState() to be WAIT but was " + mPostDialState);
271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return;
272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setPostDialState(PostDialState.STARTED);
275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        processNextPostDialChar();
277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void proceedAfterWildChar(String str) {
281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialState != PostDialState.WILD) {
282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            Rlog.w(LOG_TAG, "ImsPhoneConnection.proceedAfterWaitChar(): Expected "
283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    + "getPostDialState() to be WILD but was " + mPostDialState);
284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return;
285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setPostDialState(PostDialState.STARTED);
288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // make a new postDialString, with the wild char replacement string
290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // at the beginning, followed by the remaining postDialString.
291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        StringBuilder buf = new StringBuilder(str);
293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        buf.append(mPostDialString.substring(mNextPostDialChar));
294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPostDialString = buf.toString();
295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mNextPostDialChar = 0;
296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (Phone.DEBUG_PHONE) {
297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            Rlog.d(LOG_TAG, "proceedAfterWildChar: new postDialString is " +
298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    mPostDialString);
299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        processNextPostDialChar();
302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void cancelPostDial() {
306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setPostDialState(PostDialState.CANCELLED);
307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Called when this Connection is being hung up locally (eg, user pressed "end")
311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    void
313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    onHangupLocal() {
314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mCause = DisconnectCause.LOCAL;
315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /** Called when the connection has been disconnected */
318de2242679c927ed9c46fa42f40162b113e337112Omkar Kolangade    public boolean
319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    onDisconnect(int cause) {
320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause);
321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mCause != DisconnectCause.LOCAL) mCause = cause;
322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return onDisconnect();
323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ boolean
326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    onDisconnect() {
327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        boolean changed = false;
328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (!mDisconnected) {
330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            //mIndex = -1;
331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mDisconnectTime = System.currentTimeMillis();
333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal;
334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mDisconnected = true;
335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mOwner.mPhone.notifyDisconnect(this);
337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (mParent != null) {
339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                changed = mParent.connectionDisconnected(this);
340a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            } else {
341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                Rlog.d(LOG_TAG, "onDisconnect: no parent");
342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (mImsCall != null) mImsCall.close();
344a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mImsCall = null;
345a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        releaseWakeLock();
347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return changed;
348a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
349a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
350a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
351a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * An incoming or outgoing call has connected
352a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    void
354a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    onConnectedInOrOut() {
355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mConnectTime = System.currentTimeMillis();
356a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mConnectTimeReal = SystemClock.elapsedRealtime();
357a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mDuration = 0;
358a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (Phone.DEBUG_PHONE) {
360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            Rlog.d(LOG_TAG, "onConnectedInOrOut: connectTime=" + mConnectTime);
361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (!mIsIncoming) {
364a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // outgoing calls only
365a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            processNextPostDialChar();
366a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
367a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        releaseWakeLock();
368a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
369a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
370a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ void
371a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    onStartedHolding() {
372a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mHoldingStartTime = SystemClock.elapsedRealtime();
373a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
374a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
375a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Performs the appropriate action for a post-dial char, but does not
376a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * notify application. returns false if the character is invalid and
377a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * should be ignored
378a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
379a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private boolean
380a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    processPostDialChar(char c) {
381a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (PhoneNumberUtils.is12Key(c)) {
382d9aa1a75304b1c04c352198b9269f40a2a059f74Andrew Lee            mOwner.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE));
383a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (c == PhoneNumberUtils.PAUSE) {
384a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // From TS 22.101:
385a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // It continues...
386a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // Upon the called party answering the UE shall send the DTMF digits
387a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // automatically to the network after a delay of 3 seconds( 20 ).
388a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // The digits shall be sent according to the procedures and timing
389a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // specified in 3GPP TS 24.008 [13]. The first occurrence of the
390a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // "DTMF Control Digits Separator" shall be used by the ME to
391a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // distinguish between the addressing digits (i.e. the phone number)
392a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // and the DTMF digits. Upon subsequent occurrences of the
393a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // separator,
394a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // the UE shall pause again for 3 seconds ( 20 ) before sending
395a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // any further DTMF digits.
396a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE),
397a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    PAUSE_DELAY_MILLIS);
398a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (c == PhoneNumberUtils.WAIT) {
399a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            setPostDialState(PostDialState.WAIT);
400a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (c == PhoneNumberUtils.WILD) {
401a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            setPostDialState(PostDialState.WILD);
402a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
403a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return false;
404a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
405a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
406a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return true;
407a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
408a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
409a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
410a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public String
411a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    getRemainingPostDialString() {
412a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialState == PostDialState.CANCELLED
413a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            || mPostDialState == PostDialState.COMPLETE
414a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            || mPostDialString == null
415a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            || mPostDialString.length() <= mNextPostDialChar
416a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        ) {
417a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return "";
418a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
419a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
420a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mPostDialString.substring(mNextPostDialChar);
421a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
422a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
423a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
424a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected void finalize()
425a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    {
426a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        releaseWakeLock();
427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
428a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
429a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void
430a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    processNextPostDialChar() {
431a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        char c = 0;
432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Registrant postDialHandler;
433a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialState == PostDialState.CANCELLED) {
435a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            //Rlog.d(LOG_TAG, "##### processNextPostDialChar: postDialState == CANCELLED, bail");
436a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return;
437a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
438a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
439d9aa1a75304b1c04c352198b9269f40a2a059f74Andrew Lee        if (mPostDialString == null || mPostDialString.length() <= mNextPostDialChar) {
440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            setPostDialState(PostDialState.COMPLETE);
441a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
442a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // notifyMessage.arg1 is 0 on complete
443a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            c = 0;
444a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
445a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            boolean isValid;
446a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
447a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            setPostDialState(PostDialState.STARTED);
448a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
449a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            c = mPostDialString.charAt(mNextPostDialChar++);
450a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            isValid = processPostDialChar(c);
452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (!isValid) {
454a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                // Will call processNextPostDialChar
455a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget();
456a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                // Don't notify application
457a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                Rlog.e(LOG_TAG, "processNextPostDialChar: c=" + c + " isn't valid!");
458a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return;
459a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
460a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
461a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
4624567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen        notifyPostDialListenersNextChar(c);
4634567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen
4644567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen        // TODO: remove the following code since the handler no longer executes anything.
465a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        postDialHandler = mOwner.mPhone.mPostDialHandler;
466a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
467a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Message notifyMessage;
468a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
469a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (postDialHandler != null
470a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                && (notifyMessage = postDialHandler.messageForRegistrant()) != null) {
471a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // The AsyncResult.result is the Connection object
472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            PostDialState state = mPostDialState;
473a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            AsyncResult ar = AsyncResult.forMessage(notifyMessage);
474a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            ar.result = this;
475a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            ar.userObj = state;
476a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
477a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // arg1 is the character that was/is being processed
478a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            notifyMessage.arg1 = c;
479a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
480a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            //Rlog.v(LOG_TAG, "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c);
481a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            notifyMessage.sendToTarget();
482a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
483a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
484a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
485a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
486a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Set post dial state and acquire wake lock while switching to "started"
487a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * state, the wake lock will be released if state switches out of "started"
488a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * state or after WAKE_LOCK_TIMEOUT_MILLIS.
489a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * @param s new PostDialState
490a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
491a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void setPostDialState(PostDialState s) {
492a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (mPostDialState != PostDialState.STARTED
493a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                && s == PostDialState.STARTED) {
494a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            acquireWakeLock();
495a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT);
496a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS);
497a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (mPostDialState == PostDialState.STARTED
498a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                && s != PostDialState.STARTED) {
499a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT);
500a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            releaseWakeLock();
501a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
502a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPostDialState = s;
503d9aa1a75304b1c04c352198b9269f40a2a059f74Andrew Lee        notifyPostDialListeners();
504a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
505a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
506a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void
507a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    createWakeLock(Context context) {
508a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
509a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG);
510a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
511a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
512a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void
513a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    acquireWakeLock() {
514a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Rlog.d(LOG_TAG, "acquireWakeLock");
515a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPartialWakeLock.acquire();
516a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
517a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
51897fba207643a87dd718395010a98ded3e809a3d7Libin.Tang@motorola.com    void
519a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    releaseWakeLock() {
520a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        synchronized(mPartialWakeLock) {
521a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (mPartialWakeLock.isHeld()) {
522a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                Rlog.d(LOG_TAG, "releaseWakeLock");
523a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mPartialWakeLock.release();
524a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
525a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
526a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
527a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
528a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
529a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public int getNumberPresentation() {
530a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mNumberPresentation;
531a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
532a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
533a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
534a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public UUSInfo getUUSInfo() {
535a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mUusInfo;
536a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
537a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
538a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
539a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public Connection getOrigConnection() {
540a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return null;
541a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
542a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
543a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
544a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public boolean isMultiparty() {
545541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        return mImsCall != null && mImsCall.isMultiparty();
546a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
547a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
548ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn    /**
549ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn     * Where {@link #isMultiparty()} is {@code true}, determines if this {@link ImsCall} is the
550ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn     * origin of the conference call (i.e. {@code #isConferenceHost()} is {@code true}), or if this
551ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn     * {@link ImsCall} is a member of a conference hosted on another device.
552ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn     *
553ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn     * @return {@code true} if this call is the origin of the conference call it is a member of,
554ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn     *      {@code false} otherwise.
555ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn     */
556ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn    public boolean isConferenceHost() {
557ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn        if (mImsCall == null) {
558ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn            return false;
559ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn        }
560ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn        return mImsCall.isConferenceHost();
561ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn    }
562ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn
563a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ ImsCall getImsCall() {
564a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mImsCall;
565a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
566a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
567a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ void setImsCall(ImsCall imsCall) {
568a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mImsCall = imsCall;
569a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
570a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
571a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /*package*/ void changeParent(ImsPhoneCall parent) {
572a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mParent = parent;
573a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
574a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
5756a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee    /**
5766a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * @return {@code true} if the {@link ImsPhoneConnection} or its media capabilities have been
5776a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     *     changed, and {@code false} otherwise.
5786a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     */
5796a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee    /*package*/ boolean update(ImsCall imsCall, ImsPhoneCall.State state) {
580a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (state == ImsPhoneCall.State.ACTIVE) {
5816a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            if (mParent.getState().isRinging() || mParent.getState().isDialing()) {
582a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                onConnectedInOrOut();
583a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
584a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
5856a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            if (mParent.getState().isRinging() || mParent == mOwner.mBackgroundCall) {
586a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                //mForegroundCall should be IDLE
587a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                //when accepting WAITING call
588a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                //before accept WAITING call,
589a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                //the ACTIVE call should be held ahead
590a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mParent.detach(this);
591a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mParent = mOwner.mForegroundCall;
592a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mParent.attach(this);
593a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
594a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else if (state == ImsPhoneCall.State.HOLDING) {
595a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            onStartedHolding();
596a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
597a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
598549148fb25d8b38c2bd1207c1a21027c6621932bEtan Cohen        boolean updateParent = mParent.update(this, imsCall, state);
599549148fb25d8b38c2bd1207c1a21027c6621932bEtan Cohen        boolean updateMediaCapabilities = updateMediaCapabilities(imsCall);
60004b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee        boolean updateWifiState = updateWifiState();
601eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh        boolean updateAddressDisplay = updateAddressDisplay(imsCall);
602ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn
603eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh        return updateParent || updateMediaCapabilities || updateWifiState
604eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            || updateAddressDisplay;
605a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
606a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
607a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
608a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public int getPreciseDisconnectCause() {
609a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return 0;
610a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
611d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn
612d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn    /**
613d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn     * Notifies this Connection of a request to disconnect a participant of the conference managed
614d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn     * by the connection.
615d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn     *
616d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn     * @param endpoint the {@link android.net.Uri} of the participant to disconnect.
617d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn     */
618d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn    @Override
619d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn    public void onDisconnectConferenceParticipant(Uri endpoint) {
620d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn        ImsCall imsCall = getImsCall();
621d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn        if (imsCall == null) {
622d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn            return;
623d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn        }
624d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn        try {
625d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn            imsCall.removeParticipants(new String[]{endpoint.toString()});
626d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn        } catch (ImsException e) {
627d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn            // No session in place -- no change
628d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn            Rlog.e(LOG_TAG, "onDisconnectConferenceParticipant: no session in place. "+
629d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn                    "Failed to disconnect endpoint = " + endpoint);
630d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn        }
631d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn    }
632541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn
633541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn    /**
634fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn     * Sets the conference connect time.  Used when an {@code ImsConference} is created to out of
635fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn     * this phone connection.
636fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn     *
637fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn     * @param conferenceConnectTime The conference connect time.
638fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn     */
639fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn    public void setConferenceConnectTime(long conferenceConnectTime) {
640fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn        mConferenceConnectTime = conferenceConnectTime;
641fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn    }
642fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn
643fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn    /**
644fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn     * @return The conference connect time.
645fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn     */
646fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn    public long getConferenceConnectTime() {
647fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn        return mConferenceConnectTime;
648fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn    }
649fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn
650fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn    /**
651eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh     * Check for a change in the address display related fields for the {@link ImsCall}, and
652eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh     * update the {@link ImsPhoneConnection} with this information.
653eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh     *
654eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh     * @param imsCall The call to check for changes in address display fields.
655eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh     * @return Whether the address display fields have been changed.
656eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh     */
657eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh    private boolean updateAddressDisplay(ImsCall imsCall) {
658eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh        if (imsCall == null) {
659eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            return false;
660eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh        }
661eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh
662eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh        boolean changed = false;
663eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh        ImsCallProfile callProfile = imsCall.getCallProfile();
664eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh        if (callProfile != null) {
665eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            String address = callProfile.getCallExtra(ImsCallProfile.EXTRA_OI);
666eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            String name = callProfile.getCallExtra(ImsCallProfile.EXTRA_CNA);
667eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            int nump = ImsCallProfile.OIRToPresentation(
668eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                    callProfile.getCallExtraInt(ImsCallProfile.EXTRA_OIR));
669eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            int namep = ImsCallProfile.OIRToPresentation(
670eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                    callProfile.getCallExtraInt(ImsCallProfile.EXTRA_CNAP));
671eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            if (Phone.DEBUG_PHONE) {
672eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                Rlog.d(LOG_TAG, "address = " +  address + " name = " + name +
673eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                        " nump = " + nump + " namep = " + namep);
674eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            }
675eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            if(equalsHandlesNulls(mAddress, address)) {
676eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                mAddress = address;
677eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                changed = true;
678eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            }
679eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            if (TextUtils.isEmpty(name)) {
680eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                if (!TextUtils.isEmpty(mCnapName)) {
681eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                    mCnapName = "";
682eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                    changed = true;
683eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                }
684eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            } else if (!name.equals(mCnapName)) {
685eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                mCnapName = name;
686eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                changed = true;
687eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            }
688eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            if (mNumberPresentation != nump) {
689eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                mNumberPresentation = nump;
690eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                changed = true;
691eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            }
692eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            if (mCnapNamePresentation != namep) {
693eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                mCnapNamePresentation = namep;
694eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh                changed = true;
695eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh            }
696eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh        }
697eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh        return changed;
698eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh    }
699eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh
700eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh    /**
7016a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * Check for a change in the video capabilities and audio quality for the {@link ImsCall}, and
7026a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * update the {@link ImsPhoneConnection} with this information.
7036a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     *
7046a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * @param imsCall The call to check for changes in media capabilities.
7056a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * @return Whether the media capabilities have been changed.
7066a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     */
7076a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee    private boolean updateMediaCapabilities(ImsCall imsCall) {
7086a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        if (imsCall == null) {
7096a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            return false;
7106a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        }
7116a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee
7126a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        boolean changed = false;
7136a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee
7146a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        try {
715e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn            // The actual call profile (negotiated between local and peer).
716e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn            ImsCallProfile negotiatedCallProfile = imsCall.getCallProfile();
717e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn            // The capabilities of the local device.
7186a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            ImsCallProfile localCallProfile = imsCall.getLocalCallProfile();
719e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn            // The capabilities of the peer device.
7206a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            ImsCallProfile remoteCallProfile = imsCall.getRemoteCallProfile();
7216a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee
722e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn            if (negotiatedCallProfile != null) {
723288268d5528e0df03f348e303954813cb188c55bRekha Kumar                int oldVideoState = getVideoState();
724288268d5528e0df03f348e303954813cb188c55bRekha Kumar                int newVideoState = ImsCallProfile
725288268d5528e0df03f348e303954813cb188c55bRekha Kumar                        .getVideoStateFromImsCallProfile(negotiatedCallProfile);
726e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn
727288268d5528e0df03f348e303954813cb188c55bRekha Kumar                if (oldVideoState != newVideoState) {
728e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn                    setVideoState(newVideoState);
729e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn                    changed = true;
730e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn                }
731e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn            }
732e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn
7336a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            if (localCallProfile != null) {
7346a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                int callType = localCallProfile.mCallType;
7356a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee
7366a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                boolean newLocalVideoCapable = callType == ImsCallProfile.CALL_TYPE_VT;
7376a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                if (isLocalVideoCapable() != newLocalVideoCapable) {
7386a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                    setLocalVideoCapable(newLocalVideoCapable);
7396a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                    changed = true;
7406a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                }
7416a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            }
7426a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee
743288268d5528e0df03f348e303954813cb188c55bRekha Kumar            if (remoteCallProfile != null) {
744288268d5528e0df03f348e303954813cb188c55bRekha Kumar                    boolean newRemoteVideoCapable = remoteCallProfile.mCallType
745288268d5528e0df03f348e303954813cb188c55bRekha Kumar                            == ImsCallProfile.CALL_TYPE_VT;
746288268d5528e0df03f348e303954813cb188c55bRekha Kumar
747288268d5528e0df03f348e303954813cb188c55bRekha Kumar                    if (isRemoteVideoCapable() != newRemoteVideoCapable) {
748288268d5528e0df03f348e303954813cb188c55bRekha Kumar                        setRemoteVideoCapable(newRemoteVideoCapable);
749288268d5528e0df03f348e303954813cb188c55bRekha Kumar                        changed = true;
750288268d5528e0df03f348e303954813cb188c55bRekha Kumar                    }
751288268d5528e0df03f348e303954813cb188c55bRekha Kumar            }
752288268d5528e0df03f348e303954813cb188c55bRekha Kumar
7536a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            int newAudioQuality =
7546a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                    getAudioQualityFromCallProfile(localCallProfile, remoteCallProfile);
7556a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            if (getAudioQuality() != newAudioQuality) {
7566a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                setAudioQuality(newAudioQuality);
7576a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                changed = true;
7586a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            }
7596a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        } catch (ImsException e) {
7606a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            // No session in place -- no change
7616a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        }
7626a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee
7636a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        return changed;
7646a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee    }
7656a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee
7666a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee    /**
76704b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee     * Check for a change in the wifi state of the ImsPhoneCallTracker and update the
76804b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee     * {@link ImsPhoneConnection} with this information.
76904b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee     *
77004b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee     * @return Whether the ImsPhoneCallTracker's usage of wifi has been changed.
77104b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee     */
77204b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee    public boolean updateWifiState() {
77304b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee        Rlog.d(LOG_TAG, "updateWifiState: " + mOwner.isVowifiEnabled());
77404b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee        if (isWifi() != mOwner.isVowifiEnabled()) {
77504b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee            setWifi(mOwner.isVowifiEnabled());
77604b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee            return true;
77704b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee        }
77804b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee        return false;
77904b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee    }
78004b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee
78104b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee    /**
7826a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * Determines the {@link ImsPhoneConnection} audio quality based on the local and remote
7836a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * {@link ImsCallProfile}. If indicate a HQ audio call if the local stream profile
7846a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * indicates AMR_WB or EVRC_WB and there is no remote restrict cause.
7856a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     *
7866a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * @param localCallProfile The local call profile.
7876a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * @param remoteCallProfile The remote call profile.
7886a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     * @return The audio quality.
7896a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee     */
7906a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee    private int getAudioQualityFromCallProfile(
7916a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            ImsCallProfile localCallProfile, ImsCallProfile remoteCallProfile) {
7926a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        if (localCallProfile == null || remoteCallProfile == null
7936a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                || localCallProfile.mMediaProfile == null) {
7946a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee            return AUDIO_QUALITY_STANDARD;
7956a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        }
7966a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee
7976a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        boolean isHighDef = (localCallProfile.mMediaProfile.mAudioQuality
7986a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                        == ImsStreamMediaProfile.AUDIO_QUALITY_AMR_WB
7996a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                || localCallProfile.mMediaProfile.mAudioQuality
8006a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                        == ImsStreamMediaProfile.AUDIO_QUALITY_EVRC_WB)
8016a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee                && remoteCallProfile.mRestrictCause == ImsCallProfile.CALL_RESTRICT_CAUSE_NONE;
8026a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee        return isHighDef ? AUDIO_QUALITY_HIGH_DEFINITION : AUDIO_QUALITY_STANDARD;
8036a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee    }
8046a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee
80508e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh    @Override
80608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh    public Bundle getExtras() {
80708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh        Bundle extras = null;
80808e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh        final ImsCall call = getImsCall();
80908e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh
81008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh        if (call != null) {
81108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh            final ImsCallProfile callProfile = call.getCallProfile();
81208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh            if (callProfile != null) {
81308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh                extras = callProfile.mCallExtras;
81408e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh            }
81508e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh        }
81608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh        if (extras == null) {
81708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh            if (DBG) Rlog.d(LOG_TAG, "Call profile extras are null.");
81808e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh            return null;
81908e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh        }
82008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh        return extras;
82108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh    }
82208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh
8236a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee    /**
824541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn     * Provides a string representation of the {@link ImsPhoneConnection}.  Primarily intended for
825541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn     * use in log statements.
826541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn     *
827541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn     * @return String representation of call.
828541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn     */
829541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn    @Override
830541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn    public String toString() {
831541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        StringBuilder sb = new StringBuilder();
832541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        sb.append("[ImsPhoneConnection objId: ");
833541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        sb.append(System.identityHashCode(this));
834541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        sb.append(" address:");
835541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        sb.append(Log.pii(getAddress()));
836541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        sb.append(" ImsCall:");
837541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        if (mImsCall == null) {
838541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn            sb.append("null");
839541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        } else {
840541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn            sb.append(mImsCall);
841541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        }
842541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        sb.append("]");
843541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn        return sb.toString();
844541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn    }
845a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville}
84664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
847