ImsPhoneConnection.java revision 97fba207643a87dd718395010a98ded3e809a3d7
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 mPostDialString; // outgoing calls only 56a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean mDisconnected; 57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* 59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int mIndex; // index in ImsPhoneCallTracker.connections[], -1 if unassigned 60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The GSM index is 1 + this 61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 63a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* 64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * These time/timespan values are based on System.currentTimeMillis(), 65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * i.e., "wall clock" time. 66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private long mDisconnectTime; 68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private int mNextPostDialChar; // index into postDialString 70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private int mCause = DisconnectCause.NOT_DISCONNECTED; 72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private PostDialState mPostDialState = PostDialState.NOT_STARTED; 73a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private UUSInfo mUusInfo; 74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 75a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean mIsMultiparty = false; 76a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 77a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private Handler mHandler; 78a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 79a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private PowerManager.WakeLock mPartialWakeLock; 80a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 81a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Event Constants 82a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_DTMF_DONE = 1; 83a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_PAUSE_DONE = 2; 84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_NEXT_POST_DIAL = 3; 85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 86a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 87a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Constants 88a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int PAUSE_DELAY_MILLIS = 3 * 1000; 89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 90a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 91a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Inner Classes 92a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville class MyHandler extends Handler { 94a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville MyHandler(Looper l) {super(l);} 95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 96a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 97a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 98a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville handleMessage(Message msg) { 99a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch (msg.what) { 101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_NEXT_POST_DIAL: 102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_DTMF_DONE: 103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_PAUSE_DONE: 104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processNextPostDialChar(); 105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_WAKE_LOCK_TIMEOUT: 107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock(); 108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Constructors 114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** This is probably an MT call */ 116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ 117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneConnection(Context context, ImsCall imsCall, ImsPhoneCallTracker ct, ImsPhoneCall parent) { 118a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville createWakeLock(context); 119a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville acquireWakeLock(); 120a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 121a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner = ct; 122a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler = new MyHandler(mOwner.getLooper()); 123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mImsCall = imsCall; 124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((imsCall != null) && (imsCall.getCallProfile() != null)) { 126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAddress = imsCall.getCallProfile().getCallExtra(ImsCallProfile.EXTRA_OI); 127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCnapName = imsCall.getCallProfile().getCallExtra(ImsCallProfile.EXTRA_CNA); 128d325833e9248c05305b1edabb1d8efc827803f75Jing Zhao mNumberPresentation = ImsCallProfile.OIRToPresentation( 129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville imsCall.getCallProfile().getCallExtraInt(ImsCallProfile.EXTRA_OIR)); 130d325833e9248c05305b1edabb1d8efc827803f75Jing Zhao mCnapNamePresentation = ImsCallProfile.OIRToPresentation( 131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville imsCall.getCallProfile().getCallExtraInt(ImsCallProfile.EXTRA_CNAP)); 13264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn 13364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn ImsCallProfile imsCallProfile = imsCall.getCallProfile(); 13464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn if (imsCallProfile != null) { 13564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn int callType = imsCall.getCallProfile().mCallType; 13664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn setVideoState(ImsCallProfile.getVideoStateFromCallType(callType)); 1377fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn 1387fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn ImsStreamMediaProfile mediaProfile = imsCallProfile.mMediaProfile; 1397fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn if (mediaProfile != null) { 1407fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn setAudioQuality(getAudioQualityFromMediaProfile(mediaProfile)); 1417fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn } 14264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn } 1433a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn 1443a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn // Determine if the current call have video capabilities. 1453a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn try { 1463a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn ImsCallProfile localCallProfile = imsCall.getLocalCallProfile(); 1473a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn if (localCallProfile != null) { 1483a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn int localCallTypeCapability = localCallProfile.mCallType; 1493a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn boolean isLocalVideoCapable = localCallTypeCapability 1503a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn == ImsCallProfile.CALL_TYPE_VT; 1513a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn 1523a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn setLocalVideoCapable(isLocalVideoCapable); 1533a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn } 1543a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn } catch (ImsException e) { 1553a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn // No session, so cannot get local capabilities. 1563a8f9358a827c2be7f33b62d435894906d4874deTyler Gunn } 157a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mNumberPresentation = PhoneConstants.PRESENTATION_UNKNOWN; 159a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_UNKNOWN; 160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 161a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 162a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIsIncoming = true; 163a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCreateTime = System.currentTimeMillis(); 164a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mUusInfo = null; 165a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //mIndex = index; 167a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 168a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent = parent; 169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent.attach(this, ImsPhoneCall.State.INCOMING); 170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** This is an MO call, created when dialing */ 173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ 174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneConnection(Context context, String dialString, ImsPhoneCallTracker ct, ImsPhoneCall parent) { 175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville createWakeLock(context); 176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville acquireWakeLock(); 177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner = ct; 179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler = new MyHandler(mOwner.getLooper()); 180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDialString = dialString; 182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //mIndex = -1; 187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIsIncoming = false; 189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCnapName = null; 190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCreateTime = System.currentTimeMillis(); 193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent = parent; 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville parent.attachFake(this, ImsPhoneCall.State.DIALING); 196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void dispose() { 199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static boolean 202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville equalsHandlesNulls (Object a, Object b) { 203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (a == null) ? (b == null) : a.equals (b); 204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2067fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn /** 2077fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn * Determines the {@link ImsPhoneConnection} audio quality based on an 2087fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn * {@link ImsStreamMediaProfile}. 2097fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn * 2107fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn * @param mediaProfile The media profile. 2117fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn * @return The audio quality. 2127fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn */ 2137fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn private int getAudioQualityFromMediaProfile(ImsStreamMediaProfile mediaProfile) { 2147fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn int audioQuality; 2157fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn 2167fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn // The Adaptive Multi-Rate Wideband codec is used for high definition audio calls. 2177fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn if (mediaProfile.mAudioQuality == ImsStreamMediaProfile.AUDIO_QUALITY_AMR_WB) { 2187fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn audioQuality = AUDIO_QUALITY_HIGH_DEFINITION; 2197fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn } else { 2207fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn audioQuality = AUDIO_QUALITY_STANDARD; 2217fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn } 2227fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn 2237fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn return audioQuality; 2247fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn } 2257fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn 2267fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn 227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public String getOrigDialString(){ 229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mDialString; 230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 232a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 233a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ImsPhoneCall getCall() { 234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mParent; 235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 237a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public long getDisconnectTime() { 239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mDisconnectTime; 240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public long getHoldingStartTime() { 244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mHoldingStartTime; 245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public long getHoldDurationMillis() { 249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (getState() != ImsPhoneCall.State.HOLDING) { 250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // If not holding, return 0 251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return 0; 252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return SystemClock.elapsedRealtime() - mHoldingStartTime; 254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public int getDisconnectCause() { 259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mCause; 260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void setDisconnectCause(int cause) { 263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCause = cause; 264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ImsPhoneCallTracker getOwner () { 267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mOwner; 268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ImsPhoneCall.State getState() { 272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mDisconnected) { 273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ImsPhoneCall.State.DISCONNECTED; 274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return super.getState(); 276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void hangup() throws CallStateException { 281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!mDisconnected) { 282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.hangup(this); 283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new CallStateException ("disconnected"); 285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void separate() throws CallStateException { 290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new CallStateException ("not supported"); 291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public PostDialState getPostDialState() { 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mPostDialState; 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void proceedAfterWaitChar() { 300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialState != PostDialState.WAIT) { 301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.w(LOG_TAG, "ImsPhoneConnection.proceedAfterWaitChar(): Expected " 302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville + "getPostDialState() to be WAIT but was " + mPostDialState); 303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.STARTED); 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processNextPostDialChar(); 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void proceedAfterWildChar(String str) { 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialState != PostDialState.WILD) { 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.w(LOG_TAG, "ImsPhoneConnection.proceedAfterWaitChar(): Expected " 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville + "getPostDialState() to be WILD but was " + mPostDialState); 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.STARTED); 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // make a new postDialString, with the wild char replacement string 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // at the beginning, followed by the remaining postDialString. 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville StringBuilder buf = new StringBuilder(str); 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville buf.append(mPostDialString.substring(mNextPostDialChar)); 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPostDialString = buf.toString(); 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mNextPostDialChar = 0; 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (Phone.DEBUG_PHONE) { 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "proceedAfterWildChar: new postDialString is " + 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPostDialString); 331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processNextPostDialChar(); 334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void cancelPostDial() { 338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.CANCELLED); 339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 340a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Called when this Connection is being hung up locally (eg, user pressed "end") 343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 344a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 345a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onHangupLocal() { 346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCause = DisconnectCause.LOCAL; 347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 348a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 349a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** Called when the connection has been disconnected */ 350a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ boolean 351a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onDisconnect(int cause) { 352a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause); 353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mCause != DisconnectCause.LOCAL) mCause = cause; 354a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return onDisconnect(); 355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 356a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 357a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ boolean 358a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onDisconnect() { 359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean changed = false; 360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!mDisconnected) { 362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //mIndex = -1; 363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 364a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDisconnectTime = System.currentTimeMillis(); 365a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal; 366a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDisconnected = true; 367a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 368a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.mPhone.notifyDisconnect(this); 369a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 370a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mParent != null) { 371a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville changed = mParent.connectionDisconnected(this); 372a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 373a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "onDisconnect: no parent"); 374a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 375a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mImsCall != null) mImsCall.close(); 376a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mImsCall = null; 377a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 378a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock(); 379a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return changed; 380a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 381a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 382a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 383a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * An incoming or outgoing call has connected 384a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 385a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 386a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onConnectedInOrOut() { 387a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnectTime = System.currentTimeMillis(); 388a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnectTimeReal = SystemClock.elapsedRealtime(); 389a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDuration = 0; 390a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 391a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (Phone.DEBUG_PHONE) { 392a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "onConnectedInOrOut: connectTime=" + mConnectTime); 393a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 394a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 395a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!mIsIncoming) { 396a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // outgoing calls only 397a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processNextPostDialChar(); 398a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 399a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock(); 400a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 401a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 402a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 403a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onStartedHolding() { 404a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHoldingStartTime = SystemClock.elapsedRealtime(); 405a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 406a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 407a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Performs the appropriate action for a post-dial char, but does not 408a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * notify application. returns false if the character is invalid and 409a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * should be ignored 410a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 411a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean 412a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processPostDialChar(char c) { 413a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (PhoneNumberUtils.is12Key(c)) { 414a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.mCi.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); 415a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (c == PhoneNumberUtils.PAUSE) { 416a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // From TS 22.101: 417a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // It continues... 418a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Upon the called party answering the UE shall send the DTMF digits 419a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // automatically to the network after a delay of 3 seconds( 20 ). 420a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The digits shall be sent according to the procedures and timing 421a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // specified in 3GPP TS 24.008 [13]. The first occurrence of the 422a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // "DTMF Control Digits Separator" shall be used by the ME to 423a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // distinguish between the addressing digits (i.e. the phone number) 424a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // and the DTMF digits. Upon subsequent occurrences of the 425a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // separator, 426a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // the UE shall pause again for 3 seconds ( 20 ) before sending 427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // any further DTMF digits. 428a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE), 429a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville PAUSE_DELAY_MILLIS); 430a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (c == PhoneNumberUtils.WAIT) { 431a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.WAIT); 432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (c == PhoneNumberUtils.WILD) { 433a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.WILD); 434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 435a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 436a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 437a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 438a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 441a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 442a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public String 443a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getRemainingPostDialString() { 444a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialState == PostDialState.CANCELLED 445a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || mPostDialState == PostDialState.COMPLETE 446a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || mPostDialString == null 447a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || mPostDialString.length() <= mNextPostDialChar 448a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ) { 449a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ""; 450a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mPostDialString.substring(mNextPostDialChar); 453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 454a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 455a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 456a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville protected void finalize() 457a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville { 458a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock(); 459a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 460a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 461a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 462a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processNextPostDialChar() { 463a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville char c = 0; 464a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Registrant postDialHandler; 465a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 466a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialState == PostDialState.CANCELLED) { 467a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Rlog.d(LOG_TAG, "##### processNextPostDialChar: postDialState == CANCELLED, bail"); 468a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 469a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 470a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 471a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialString == null || 472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPostDialString.length() <= mNextPostDialChar) { 473a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.COMPLETE); 474a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 475a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // notifyMessage.arg1 is 0 on complete 476a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville c = 0; 477a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 478a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isValid; 479a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 480a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.STARTED); 481a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 482a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville c = mPostDialString.charAt(mNextPostDialChar++); 483a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 484a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isValid = processPostDialChar(c); 485a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 486a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!isValid) { 487a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Will call processNextPostDialChar 488a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 489a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Don't notify application 490a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.e(LOG_TAG, "processNextPostDialChar: c=" + c + " isn't valid!"); 491a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 492a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 493a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 494a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 495a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville postDialHandler = mOwner.mPhone.mPostDialHandler; 496a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 497a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message notifyMessage; 498a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 499a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (postDialHandler != null 500a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 501a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The AsyncResult.result is the Connection object 502a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville PostDialState state = mPostDialState; 503a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult ar = AsyncResult.forMessage(notifyMessage); 504a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar.result = this; 505a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar.userObj = state; 506a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 507a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // arg1 is the character that was/is being processed 508a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyMessage.arg1 = c; 509a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 510a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Rlog.v(LOG_TAG, "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 511a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyMessage.sendToTarget(); 512a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 513a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 514a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 515a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 516a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Set post dial state and acquire wake lock while switching to "started" 517a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * state, the wake lock will be released if state switches out of "started" 518a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 519a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @param s new PostDialState 520a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 521a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void setPostDialState(PostDialState s) { 522a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialState != PostDialState.STARTED 523a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && s == PostDialState.STARTED) { 524a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville acquireWakeLock(); 525a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 526a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 527a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (mPostDialState == PostDialState.STARTED 528a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && s != PostDialState.STARTED) { 529a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 530a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock(); 531a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 532a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPostDialState = s; 533a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 534a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 535a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 536a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville createWakeLock(Context context) { 537a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 538a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 539a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 540a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 541a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 542a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville acquireWakeLock() { 543a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "acquireWakeLock"); 544a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPartialWakeLock.acquire(); 545a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 546a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 54797fba207643a87dd718395010a98ded3e809a3d7Libin.Tang@motorola.com void 548a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock() { 549a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized(mPartialWakeLock) { 550a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPartialWakeLock.isHeld()) { 551a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "releaseWakeLock"); 552a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPartialWakeLock.release(); 553a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 554a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 555a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 556a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 557a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 558a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public int getNumberPresentation() { 559a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mNumberPresentation; 560a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 561a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 562a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 563a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public UUSInfo getUUSInfo() { 564a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mUusInfo; 565a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 566a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 567a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 568a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Connection getOrigConnection() { 569a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 570a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 571a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 572a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* package */ void 573a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setMultiparty(boolean isMultiparty) { 574a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "setMultiparty " + isMultiparty); 575a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIsMultiparty = isMultiparty; 576a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 577a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 578a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 579a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isMultiparty() { 580a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mIsMultiparty; 581a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 582a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 583a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ ImsCall getImsCall() { 584a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mImsCall; 585a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 586a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 587a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void setImsCall(ImsCall imsCall) { 588a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mImsCall = imsCall; 589a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 590a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 591a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void changeParent(ImsPhoneCall parent) { 592a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent = parent; 593a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 594a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 595a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ boolean 596a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville update(ImsCall imsCall, ImsPhoneCall.State state) { 597a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean changed = false; 598a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 599a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (state == ImsPhoneCall.State.ACTIVE) { 600a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mParent.getState().isRinging() 601a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || mParent.getState().isDialing()) { 602a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onConnectedInOrOut(); 603a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 604a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 605a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mParent.getState().isRinging() 606a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || mParent == mOwner.mBackgroundCall) { 607a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //mForegroundCall should be IDLE 608a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //when accepting WAITING call 609a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //before accept WAITING call, 610a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //the ACTIVE call should be held ahead 611a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent.detach(this); 612a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent = mOwner.mForegroundCall; 613a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent.attach(this); 614a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 615a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (state == ImsPhoneCall.State.HOLDING) { 616a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onStartedHolding(); 617a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 618a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 619a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville changed = mParent.update(this, imsCall, state); 620a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 6215b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam if (imsCall != null) { 6225b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam // Check for a change in the video capabilities for the call and update the 6235b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam // {@link ImsPhoneConnection} with this information. 6245b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam try { 6255b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam // Get the current local VT capabilities (i.e. even if currentCallType above is 6265b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam // audio-only, the local capability could support bi-directional video). 6275b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam ImsCallProfile localCallProfile = imsCall.getLocalCallProfile(); 6285b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam if (localCallProfile != null) { 6295b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam int localCallTypeCapability = localCallProfile.mCallType; 6305b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam boolean newLocalVideoCapable = localCallTypeCapability 6315b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam == ImsCallProfile.CALL_TYPE_VT; 6325b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam 6335b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam if (isLocalVideoCapable() != newLocalVideoCapable) { 6345b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam setLocalVideoCapable(newLocalVideoCapable); 6355b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam changed = true; 6365b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam } 6372999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn } 6385b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam } catch (ImsException e) { 6395b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam // No session in place -- no change 6402999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn } 6412999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn 6425b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam // Check for a change in the call type / video state, or audio quality of the 6435b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam // {@link ImsCall} and update the {@link ImsPhoneConnection} with this information. 6445b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam ImsCallProfile callProfile = imsCall.getCallProfile(); 6455b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam if (callProfile != null) { 6465b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam int oldVideoState = getVideoState(); 6475b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam int newVideoState = ImsCallProfile.getVideoStateFromCallType(callProfile.mCallType); 6482999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn 6495b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam if (oldVideoState != newVideoState) { 6505b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam setVideoState(newVideoState); 6515b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam changed = true; 6525b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam } 6537fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn 6545b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam ImsStreamMediaProfile mediaProfile = callProfile.mMediaProfile; 6555b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam if (mediaProfile != null) { 6565b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam int oldAudioQuality = getAudioQuality(); 6575b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam int newAudioQuality = getAudioQualityFromMediaProfile(mediaProfile); 6587fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn 6595b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam if (oldAudioQuality != newAudioQuality) { 6605b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam setAudioQuality(newAudioQuality); 6615b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam changed = true; 6625b2302a78231998589d06a2bc7b4ae9ef00fe5b8Uma Maheswari Ramalingam } 6637fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn } 6647fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn } 6652999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn } 666a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return changed; 667a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 668a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 669a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 670a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public int getPreciseDisconnectCause() { 671a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return 0; 672a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 673a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville} 67464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn 675