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