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