ImsPhoneConnection.java revision 2e66c6325d321e41b8851da9a4596f7a745c7b1e
1a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/* 2a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Copyright (C) 2013 The Android Open Source Project 3a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 4a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * you may not use this file except in compliance with the License. 6a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * You may obtain a copy of the License at 7a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 8a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 10a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Unless required by applicable law or agreed to in writing, software 11a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * See the License for the specific language governing permissions and 14a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * limitations under the License. 15a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 16a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 17a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepackage com.android.internal.telephony.imsphone; 18a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 19a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.Context; 20d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunnimport android.net.Uri; 21a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.AsyncResult; 2208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganeshimport android.os.Bundle; 23a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Handler; 24a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Looper; 25a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Message; 266bb557b243f3fc9984b82319026519608ada2c9cRoshan Piusimport android.os.PersistableBundle; 27a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.PowerManager; 28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Registrant; 29a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.SystemClock; 30541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunnimport android.telecom.Log; 316bb557b243f3fc9984b82319026519608ada2c9cRoshan Piusimport android.telephony.CarrierConfigManager; 32a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.DisconnectCause; 33a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.PhoneNumberUtils; 34a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.Rlog; 352e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunnimport android.telephony.ServiceState; 36eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganeshimport android.text.TextUtils; 37a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 382999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunnimport com.android.ims.ImsException; 397fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunnimport com.android.ims.ImsStreamMediaProfile; 40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CallStateException; 41a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Connection; 42a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Phone; 43a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.PhoneConstants; 44a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.UUSInfo; 45a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 46a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsCall; 47a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsCallProfile; 48a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 4921048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkarimport java.util.Objects; 5021048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar 51a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/** 52a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * {@hide} 53a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 54a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepublic class ImsPhoneConnection extends Connection { 55a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String LOG_TAG = "ImsPhoneConnection"; 56a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final boolean DBG = true; 57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Instance Variables 59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private ImsPhoneCallTracker mOwner; 61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private ImsPhoneCall mParent; 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private ImsCall mImsCall; 6321048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar private Bundle mExtras = new Bundle(); 64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private String mPostDialString; // outgoing calls only 66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean mDisconnected; 67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* 69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int mIndex; // index in ImsPhoneCallTracker.connections[], -1 if unassigned 70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The GSM index is 1 + this 71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 73a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* 74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * These time/timespan values are based on System.currentTimeMillis(), 75a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * i.e., "wall clock" time. 76a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 77a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private long mDisconnectTime; 78a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 79a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private int mNextPostDialChar; // index into postDialString 80a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 81a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private int mCause = DisconnectCause.NOT_DISCONNECTED; 82a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private PostDialState mPostDialState = PostDialState.NOT_STARTED; 83a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private UUSInfo mUusInfo; 84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private Handler mHandler; 85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 86a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private PowerManager.WakeLock mPartialWakeLock; 87a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 88fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn // The cached connect time of the connection when it turns into a conference. 89fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn private long mConferenceConnectTime = 0; 90fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn 916bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius // The cached delay to be used between DTMF tones fetched from carrier config. 926bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius private int mDtmfToneDelay = 0; 936bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius 948bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan private boolean mIsEmergency = false; 958bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan 962e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn /** 972e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * Used to indicate whether the wifi state is based on 982e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * {@link com.android.ims.ImsConnectionStateListener# 992e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * onFeatureCapabilityChanged(int, int[], int[])} callbacks, or values received via the 1002e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * {@link ImsCallProfile#EXTRA_CALL_RAT_TYPE} extra. Util we receive a value via the extras, 1012e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * we will use the wifi state based on the {@code onFeatureCapabilityChanged}. Once a value 1022e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * is received via the extras, we will prefer those values going forward. 1032e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn */ 1042e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn private boolean mIsWifiStateFromExtras = false; 1052e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn 106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Event Constants 107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_DTMF_DONE = 1; 108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_PAUSE_DONE = 2; 109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_NEXT_POST_DIAL = 3; 110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 1116bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius private static final int EVENT_DTMF_DELAY_DONE = 5; 112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Constants 114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int PAUSE_DELAY_MILLIS = 3 * 1000; 115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Inner Classes 118a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 119a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville class MyHandler extends Handler { 120a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville MyHandler(Looper l) {super(l);} 121a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 122a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville handleMessage(Message msg) { 125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch (msg.what) { 127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_NEXT_POST_DIAL: 1286bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius case EVENT_DTMF_DELAY_DONE: 129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_PAUSE_DONE: 130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processNextPostDialChar(); 131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_WAKE_LOCK_TIMEOUT: 133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock(); 134a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1356bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius case EVENT_DTMF_DONE: 1366bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius // We may need to add a delay specified by carrier between DTMF tones that are 1376bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius // sent out. 1386bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_DTMF_DELAY_DONE), 1396bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius mDtmfToneDelay); 1406bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius break; 141a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 144a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Constructors 146a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** This is probably an MT call */ 148a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ 1496bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius ImsPhoneConnection(ImsPhone phone, ImsCall imsCall, ImsPhoneCallTracker ct, 15008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh ImsPhoneCall parent, boolean isUnknown) { 1516bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius createWakeLock(phone.getContext()); 152a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville acquireWakeLock(); 153a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 154a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner = ct; 155a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler = new MyHandler(mOwner.getLooper()); 156a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mImsCall = imsCall; 157a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((imsCall != null) && (imsCall.getCallProfile() != null)) { 159a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAddress = imsCall.getCallProfile().getCallExtra(ImsCallProfile.EXTRA_OI); 160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCnapName = imsCall.getCallProfile().getCallExtra(ImsCallProfile.EXTRA_CNA); 161d325833e9248c05305b1edabb1d8efc827803f75Jing Zhao mNumberPresentation = ImsCallProfile.OIRToPresentation( 162a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville imsCall.getCallProfile().getCallExtraInt(ImsCallProfile.EXTRA_OIR)); 163d325833e9248c05305b1edabb1d8efc827803f75Jing Zhao mCnapNamePresentation = ImsCallProfile.OIRToPresentation( 164a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville imsCall.getCallProfile().getCallExtraInt(ImsCallProfile.EXTRA_CNAP)); 1656a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee updateMediaCapabilities(imsCall); 166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 167a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mNumberPresentation = PhoneConstants.PRESENTATION_UNKNOWN; 168a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_UNKNOWN; 169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 17108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh mIsIncoming = !isUnknown; 172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCreateTime = System.currentTimeMillis(); 173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mUusInfo = null; 174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 17504b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee updateWifiState(); 17604b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee 177553db651cd5a51eedde0259d5a25e91700ef96c5Tyler Gunn // Ensure any extras set on the ImsCallProfile at the start of the call are cached locally 178553db651cd5a51eedde0259d5a25e91700ef96c5Tyler Gunn // in the ImsPhoneConnection. This isn't going to inform any listeners (since the original 179553db651cd5a51eedde0259d5a25e91700ef96c5Tyler Gunn // connection is not likely to be associated with a TelephonyConnection yet). 180553db651cd5a51eedde0259d5a25e91700ef96c5Tyler Gunn updateExtras(imsCall); 181553db651cd5a51eedde0259d5a25e91700ef96c5Tyler Gunn 182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent = parent; 18308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh mParent.attach(this, 18408e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh (mIsIncoming? ImsPhoneCall.State.INCOMING: ImsPhoneCall.State.DIALING)); 1856bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius 1866bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius fetchDtmfToneDelay(phone); 187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** This is an MO call, created when dialing */ 190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ 1916bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius ImsPhoneConnection(ImsPhone phone, String dialString, ImsPhoneCallTracker ct, 1928bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan ImsPhoneCall parent, boolean isEmergency) { 1936bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius createWakeLock(phone.getContext()); 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville acquireWakeLock(); 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner = ct; 197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler = new MyHandler(mOwner.getLooper()); 198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDialString = dialString; 200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //mIndex = -1; 205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIsIncoming = false; 207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCnapName = null; 208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCreateTime = System.currentTimeMillis(); 211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent = parent; 213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville parent.attachFake(this, ImsPhoneCall.State.DIALING); 2146bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius 2158bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan mIsEmergency = isEmergency; 2168bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan 2176bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius fetchDtmfToneDelay(phone); 218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void dispose() { 221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static boolean 224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville equalsHandlesNulls (Object a, Object b) { 225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (a == null) ? (b == null) : a.equals (b); 226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public String getOrigDialString(){ 230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mDialString; 231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 232a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 233a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ImsPhoneCall getCall() { 235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mParent; 236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 237a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public long getDisconnectTime() { 240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mDisconnectTime; 241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public long getHoldingStartTime() { 245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mHoldingStartTime; 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public long getHoldDurationMillis() { 250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (getState() != ImsPhoneCall.State.HOLDING) { 251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // If not holding, return 0 252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return 0; 253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return SystemClock.elapsedRealtime() - mHoldingStartTime; 255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public int getDisconnectCause() { 260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mCause; 261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void setDisconnectCause(int cause) { 264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCause = cause; 265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 26733cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu @Override 26833cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu public String getVendorDisconnectCause() { 26933cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu return null; 27033cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu } 27133cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu 272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ImsPhoneCallTracker getOwner () { 273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mOwner; 274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ImsPhoneCall.State getState() { 278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mDisconnected) { 279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ImsPhoneCall.State.DISCONNECTED; 280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return super.getState(); 282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void hangup() throws CallStateException { 287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!mDisconnected) { 288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.hangup(this); 289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new CallStateException ("disconnected"); 291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void separate() throws CallStateException { 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new CallStateException ("not supported"); 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public PostDialState getPostDialState() { 301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mPostDialState; 302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void proceedAfterWaitChar() { 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialState != PostDialState.WAIT) { 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.w(LOG_TAG, "ImsPhoneConnection.proceedAfterWaitChar(): Expected " 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville + "getPostDialState() to be WAIT but was " + mPostDialState); 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.STARTED); 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processNextPostDialChar(); 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void proceedAfterWildChar(String str) { 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialState != PostDialState.WILD) { 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.w(LOG_TAG, "ImsPhoneConnection.proceedAfterWaitChar(): Expected " 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville + "getPostDialState() to be WILD but was " + mPostDialState); 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.STARTED); 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // make a new postDialString, with the wild char replacement string 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // at the beginning, followed by the remaining postDialString. 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville StringBuilder buf = new StringBuilder(str); 331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville buf.append(mPostDialString.substring(mNextPostDialChar)); 332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPostDialString = buf.toString(); 333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mNextPostDialChar = 0; 334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (Phone.DEBUG_PHONE) { 335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "proceedAfterWildChar: new postDialString is " + 336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPostDialString); 337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processNextPostDialChar(); 340a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void cancelPostDial() { 344a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.CANCELLED); 345a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 348a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Called when this Connection is being hung up locally (eg, user pressed "end") 349a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 350a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 351a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onHangupLocal() { 352a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCause = DisconnectCause.LOCAL; 353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 354a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** Called when the connection has been disconnected */ 356de2242679c927ed9c46fa42f40162b113e337112Omkar Kolangade public boolean 357a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onDisconnect(int cause) { 358a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause); 359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mCause != DisconnectCause.LOCAL) mCause = cause; 360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return onDisconnect(); 361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ boolean 364a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onDisconnect() { 365a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean changed = false; 366a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 367a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!mDisconnected) { 368a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //mIndex = -1; 369a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 370a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDisconnectTime = System.currentTimeMillis(); 371a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal; 372a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDisconnected = true; 373a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 374a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.mPhone.notifyDisconnect(this); 375a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 376a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mParent != null) { 377a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville changed = mParent.connectionDisconnected(this); 378a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 379a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "onDisconnect: no parent"); 380a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 381a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mImsCall != null) mImsCall.close(); 382a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mImsCall = null; 383a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 384a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock(); 385a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return changed; 386a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 387a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 388a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 389a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * An incoming or outgoing call has connected 390a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 391a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 392a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onConnectedInOrOut() { 393a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnectTime = System.currentTimeMillis(); 394a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnectTimeReal = SystemClock.elapsedRealtime(); 395a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDuration = 0; 396a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 397a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (Phone.DEBUG_PHONE) { 398a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "onConnectedInOrOut: connectTime=" + mConnectTime); 399a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 400a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 401a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!mIsIncoming) { 402a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // outgoing calls only 403a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processNextPostDialChar(); 404a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 405a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock(); 406a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 407a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 408a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 409a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onStartedHolding() { 410a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHoldingStartTime = SystemClock.elapsedRealtime(); 411a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 412a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 413a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Performs the appropriate action for a post-dial char, but does not 414a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * notify application. returns false if the character is invalid and 415a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * should be ignored 416a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 417a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean 418a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processPostDialChar(char c) { 419a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (PhoneNumberUtils.is12Key(c)) { 420d9aa1a75304b1c04c352198b9269f40a2a059f74Andrew Lee mOwner.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); 421a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (c == PhoneNumberUtils.PAUSE) { 422a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // From TS 22.101: 423a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // It continues... 424a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Upon the called party answering the UE shall send the DTMF digits 425a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // automatically to the network after a delay of 3 seconds( 20 ). 426a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The digits shall be sent according to the procedures and timing 427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // specified in 3GPP TS 24.008 [13]. The first occurrence of the 428a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // "DTMF Control Digits Separator" shall be used by the ME to 429a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // distinguish between the addressing digits (i.e. the phone number) 430a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // and the DTMF digits. Upon subsequent occurrences of the 431a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // separator, 432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // the UE shall pause again for 3 seconds ( 20 ) before sending 433a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // any further DTMF digits. 434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE), 435a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville PAUSE_DELAY_MILLIS); 436a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (c == PhoneNumberUtils.WAIT) { 437a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.WAIT); 438a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (c == PhoneNumberUtils.WILD) { 439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.WILD); 440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 441a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 442a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 443a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 444a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 445a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 446a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 447a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 448a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public String 449a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getRemainingPostDialString() { 450a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialState == PostDialState.CANCELLED 451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || mPostDialState == PostDialState.COMPLETE 452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || mPostDialString == null 453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || mPostDialString.length() <= mNextPostDialChar 454a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ) { 455a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ""; 456a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 457a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 458a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mPostDialString.substring(mNextPostDialChar); 459a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 460a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 461a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 462a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville protected void finalize() 463a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville { 464a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock(); 465a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 466a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 467a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 468a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville processNextPostDialChar() { 469a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville char c = 0; 470a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Registrant postDialHandler; 471a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialState == PostDialState.CANCELLED) { 473a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Rlog.d(LOG_TAG, "##### processNextPostDialChar: postDialState == CANCELLED, bail"); 474a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 475a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 476a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 477d9aa1a75304b1c04c352198b9269f40a2a059f74Andrew Lee if (mPostDialString == null || mPostDialString.length() <= mNextPostDialChar) { 478a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.COMPLETE); 479a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 480a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // notifyMessage.arg1 is 0 on complete 481a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville c = 0; 482a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 483a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isValid; 484a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 485a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setPostDialState(PostDialState.STARTED); 486a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 487a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville c = mPostDialString.charAt(mNextPostDialChar++); 488a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 489a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isValid = processPostDialChar(c); 490a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 491a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!isValid) { 492a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Will call processNextPostDialChar 493a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 494a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Don't notify application 495a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.e(LOG_TAG, "processNextPostDialChar: c=" + c + " isn't valid!"); 496a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 497a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 498a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 499a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 5004567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen notifyPostDialListenersNextChar(c); 5014567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen 5024567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen // TODO: remove the following code since the handler no longer executes anything. 503a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville postDialHandler = mOwner.mPhone.mPostDialHandler; 504a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 505a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message notifyMessage; 506a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 507a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (postDialHandler != null 508a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 509a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The AsyncResult.result is the Connection object 510a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville PostDialState state = mPostDialState; 511a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult ar = AsyncResult.forMessage(notifyMessage); 512a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar.result = this; 513a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar.userObj = state; 514a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 515a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // arg1 is the character that was/is being processed 516a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyMessage.arg1 = c; 517a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 518d9c3a08d5958e5ced0c0c9f7aabf376a5fe59bb2Anju Mathapati //Rlog.v(LOG_TAG, 519d9c3a08d5958e5ced0c0c9f7aabf376a5fe59bb2Anju Mathapati // "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 520a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyMessage.sendToTarget(); 521a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 522a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 523a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 524a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 525a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Set post dial state and acquire wake lock while switching to "started" 526a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * state, the wake lock will be released if state switches out of "started" 527a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 528a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @param s new PostDialState 529a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 530a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void setPostDialState(PostDialState s) { 531a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPostDialState != PostDialState.STARTED 532a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && s == PostDialState.STARTED) { 533a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville acquireWakeLock(); 534a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 535a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 536a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (mPostDialState == PostDialState.STARTED 537a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && s != PostDialState.STARTED) { 538a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 539a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock(); 540a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 541a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPostDialState = s; 542d9aa1a75304b1c04c352198b9269f40a2a059f74Andrew Lee notifyPostDialListeners(); 543a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 544a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 545a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 546a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville createWakeLock(Context context) { 547a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 548a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 549a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 550a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 551a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 552a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville acquireWakeLock() { 553a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "acquireWakeLock"); 554a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPartialWakeLock.acquire(); 555a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 556a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 55797fba207643a87dd718395010a98ded3e809a3d7Libin.Tang@motorola.com void 558a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville releaseWakeLock() { 559a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized(mPartialWakeLock) { 560a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPartialWakeLock.isHeld()) { 561a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "releaseWakeLock"); 562a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPartialWakeLock.release(); 563a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 564a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 565a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 566a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 5676bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius private void fetchDtmfToneDelay(ImsPhone phone) { 5686bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius CarrierConfigManager configMgr = (CarrierConfigManager) 5696bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); 5706bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius PersistableBundle b = configMgr.getConfigForSubId(phone.getSubId()); 5716bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius if (b != null) { 5726bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius mDtmfToneDelay = b.getInt(CarrierConfigManager.KEY_IMS_DTMF_TONE_DELAY_INT); 5736bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius } 5746bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius } 5756bb557b243f3fc9984b82319026519608ada2c9cRoshan Pius 576a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 577a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public int getNumberPresentation() { 578a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mNumberPresentation; 579a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 580a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 581a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 582a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public UUSInfo getUUSInfo() { 583a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mUusInfo; 584a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 585a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 586a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 587a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Connection getOrigConnection() { 588a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 589a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 590a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 591a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 592a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isMultiparty() { 593541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn return mImsCall != null && mImsCall.isMultiparty(); 594a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 595a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 596ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn /** 597ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn * Where {@link #isMultiparty()} is {@code true}, determines if this {@link ImsCall} is the 598ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn * origin of the conference call (i.e. {@code #isConferenceHost()} is {@code true}), or if this 599ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn * {@link ImsCall} is a member of a conference hosted on another device. 600ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn * 601ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn * @return {@code true} if this call is the origin of the conference call it is a member of, 602ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn * {@code false} otherwise. 603ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn */ 604ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn public boolean isConferenceHost() { 605ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn if (mImsCall == null) { 606ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn return false; 607ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn } 608ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn return mImsCall.isConferenceHost(); 609ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn } 610ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn 611a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ ImsCall getImsCall() { 612a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mImsCall; 613a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 614a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 615a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void setImsCall(ImsCall imsCall) { 616a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mImsCall = imsCall; 617a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 618a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 619a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void changeParent(ImsPhoneCall parent) { 620a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent = parent; 621a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 622a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 6236a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee /** 6246a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * @return {@code true} if the {@link ImsPhoneConnection} or its media capabilities have been 6256a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * changed, and {@code false} otherwise. 6266a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee */ 6276a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee /*package*/ boolean update(ImsCall imsCall, ImsPhoneCall.State state) { 628a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (state == ImsPhoneCall.State.ACTIVE) { 629707644d8250cc5c3c2287068a9df210d7eb3e863Tyler Gunn // If the state of the call is active, but there is a pending request to the RIL to hold 630707644d8250cc5c3c2287068a9df210d7eb3e863Tyler Gunn // the call, we will skip this update. This is really a signalling delay or failure 631707644d8250cc5c3c2287068a9df210d7eb3e863Tyler Gunn // from the RIL, but we will prevent it from going through as we will end up erroneously 632707644d8250cc5c3c2287068a9df210d7eb3e863Tyler Gunn // making this call active when really it should be on hold. 633707644d8250cc5c3c2287068a9df210d7eb3e863Tyler Gunn if (imsCall.isPendingHold()) { 634707644d8250cc5c3c2287068a9df210d7eb3e863Tyler Gunn Rlog.w(LOG_TAG, "update : state is ACTIVE, but call is pending hold, skipping"); 635707644d8250cc5c3c2287068a9df210d7eb3e863Tyler Gunn return false; 636707644d8250cc5c3c2287068a9df210d7eb3e863Tyler Gunn } 637707644d8250cc5c3c2287068a9df210d7eb3e863Tyler Gunn 6386a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee if (mParent.getState().isRinging() || mParent.getState().isDialing()) { 639a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onConnectedInOrOut(); 640a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 641a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 6426a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee if (mParent.getState().isRinging() || mParent == mOwner.mBackgroundCall) { 643a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //mForegroundCall should be IDLE 644a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //when accepting WAITING call 645a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //before accept WAITING call, 646a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //the ACTIVE call should be held ahead 647a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent.detach(this); 648a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent = mOwner.mForegroundCall; 649a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mParent.attach(this); 650a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 651a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (state == ImsPhoneCall.State.HOLDING) { 652a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onStartedHolding(); 653a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 654a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 655549148fb25d8b38c2bd1207c1a21027c6621932bEtan Cohen boolean updateParent = mParent.update(this, imsCall, state); 65604b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee boolean updateWifiState = updateWifiState(); 657eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh boolean updateAddressDisplay = updateAddressDisplay(imsCall); 65821048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar boolean updateMediaCapabilities = updateMediaCapabilities(imsCall); 65921048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar boolean updateExtras = updateExtras(imsCall); 660ce67e30bf7a91a3ff63f86020c2d91c248c3a71bTyler Gunn 66121048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar return updateParent || updateWifiState || updateAddressDisplay || updateMediaCapabilities 66221048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar || updateExtras; 663a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 664a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 665a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 666a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public int getPreciseDisconnectCause() { 667a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return 0; 668a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 669d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn 670d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn /** 671d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn * Notifies this Connection of a request to disconnect a participant of the conference managed 672d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn * by the connection. 673d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn * 674d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn * @param endpoint the {@link android.net.Uri} of the participant to disconnect. 675d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn */ 676d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn @Override 677d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn public void onDisconnectConferenceParticipant(Uri endpoint) { 678d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn ImsCall imsCall = getImsCall(); 679d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn if (imsCall == null) { 680d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn return; 681d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn } 682d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn try { 683d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn imsCall.removeParticipants(new String[]{endpoint.toString()}); 684d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn } catch (ImsException e) { 685d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn // No session in place -- no change 686d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn Rlog.e(LOG_TAG, "onDisconnectConferenceParticipant: no session in place. "+ 687d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn "Failed to disconnect endpoint = " + endpoint); 688d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn } 689d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn } 690541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn 691541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn /** 692fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn * Sets the conference connect time. Used when an {@code ImsConference} is created to out of 693fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn * this phone connection. 694fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn * 695fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn * @param conferenceConnectTime The conference connect time. 696fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn */ 697fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn public void setConferenceConnectTime(long conferenceConnectTime) { 698fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn mConferenceConnectTime = conferenceConnectTime; 699fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn } 700fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn 701fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn /** 702fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn * @return The conference connect time. 703fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn */ 704fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn public long getConferenceConnectTime() { 705fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn return mConferenceConnectTime; 706fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn } 707fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn 708fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn /** 709eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh * Check for a change in the address display related fields for the {@link ImsCall}, and 710eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh * update the {@link ImsPhoneConnection} with this information. 711eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh * 712eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh * @param imsCall The call to check for changes in address display fields. 713eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh * @return Whether the address display fields have been changed. 714eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh */ 715eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh private boolean updateAddressDisplay(ImsCall imsCall) { 716eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh if (imsCall == null) { 717eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh return false; 718eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh } 719eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh 720eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh boolean changed = false; 721eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh ImsCallProfile callProfile = imsCall.getCallProfile(); 722eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh if (callProfile != null) { 723eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh String address = callProfile.getCallExtra(ImsCallProfile.EXTRA_OI); 724eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh String name = callProfile.getCallExtra(ImsCallProfile.EXTRA_CNA); 725eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh int nump = ImsCallProfile.OIRToPresentation( 726eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh callProfile.getCallExtraInt(ImsCallProfile.EXTRA_OIR)); 727eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh int namep = ImsCallProfile.OIRToPresentation( 728eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh callProfile.getCallExtraInt(ImsCallProfile.EXTRA_CNAP)); 729eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh if (Phone.DEBUG_PHONE) { 730eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh Rlog.d(LOG_TAG, "address = " + address + " name = " + name + 731eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh " nump = " + nump + " namep = " + namep); 732eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh } 733eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh if(equalsHandlesNulls(mAddress, address)) { 734eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh mAddress = address; 735eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh changed = true; 736eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh } 737eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh if (TextUtils.isEmpty(name)) { 738eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh if (!TextUtils.isEmpty(mCnapName)) { 739eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh mCnapName = ""; 740eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh changed = true; 741eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh } 742eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh } else if (!name.equals(mCnapName)) { 743eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh mCnapName = name; 744eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh changed = true; 745eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh } 746eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh if (mNumberPresentation != nump) { 747eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh mNumberPresentation = nump; 748eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh changed = true; 749eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh } 750eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh if (mCnapNamePresentation != namep) { 751eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh mCnapNamePresentation = namep; 752eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh changed = true; 753eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh } 754eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh } 755eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh return changed; 756eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh } 757eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh 758eeeb1cb65e41778fa78abcaba93a9e4ebe351ec6Shriram Ganesh /** 7596a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * Check for a change in the video capabilities and audio quality for the {@link ImsCall}, and 7606a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * update the {@link ImsPhoneConnection} with this information. 7616a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * 7626a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * @param imsCall The call to check for changes in media capabilities. 7636a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * @return Whether the media capabilities have been changed. 7646a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee */ 765d9c3a08d5958e5ced0c0c9f7aabf376a5fe59bb2Anju Mathapati public boolean updateMediaCapabilities(ImsCall imsCall) { 7666a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee if (imsCall == null) { 7676a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee return false; 7686a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee } 7696a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee 7706a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee boolean changed = false; 7716a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee 7726a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee try { 773e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn // The actual call profile (negotiated between local and peer). 774e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn ImsCallProfile negotiatedCallProfile = imsCall.getCallProfile(); 775e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn // The capabilities of the local device. 7766a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee ImsCallProfile localCallProfile = imsCall.getLocalCallProfile(); 777e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn // The capabilities of the peer device. 7786a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee ImsCallProfile remoteCallProfile = imsCall.getRemoteCallProfile(); 7796a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee 780e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn if (negotiatedCallProfile != null) { 781288268d5528e0df03f348e303954813cb188c55bRekha Kumar int oldVideoState = getVideoState(); 782288268d5528e0df03f348e303954813cb188c55bRekha Kumar int newVideoState = ImsCallProfile 783288268d5528e0df03f348e303954813cb188c55bRekha Kumar .getVideoStateFromImsCallProfile(negotiatedCallProfile); 784e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn 785288268d5528e0df03f348e303954813cb188c55bRekha Kumar if (oldVideoState != newVideoState) { 786e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn setVideoState(newVideoState); 787e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn changed = true; 788e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn } 789e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn } 790e70972cf6a3b48df1f7d036877eb28529e606ca9Tyler Gunn 7916a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee if (localCallProfile != null) { 7926a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee int callType = localCallProfile.mCallType; 7936a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee 7946a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee boolean newLocalVideoCapable = callType == ImsCallProfile.CALL_TYPE_VT; 7956a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee if (isLocalVideoCapable() != newLocalVideoCapable) { 7966a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee setLocalVideoCapable(newLocalVideoCapable); 7976a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee changed = true; 7986a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee } 7996a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee } 8006a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee 801288268d5528e0df03f348e303954813cb188c55bRekha Kumar if (remoteCallProfile != null) { 802288268d5528e0df03f348e303954813cb188c55bRekha Kumar boolean newRemoteVideoCapable = remoteCallProfile.mCallType 803288268d5528e0df03f348e303954813cb188c55bRekha Kumar == ImsCallProfile.CALL_TYPE_VT; 804288268d5528e0df03f348e303954813cb188c55bRekha Kumar 805288268d5528e0df03f348e303954813cb188c55bRekha Kumar if (isRemoteVideoCapable() != newRemoteVideoCapable) { 806288268d5528e0df03f348e303954813cb188c55bRekha Kumar setRemoteVideoCapable(newRemoteVideoCapable); 807288268d5528e0df03f348e303954813cb188c55bRekha Kumar changed = true; 808288268d5528e0df03f348e303954813cb188c55bRekha Kumar } 809288268d5528e0df03f348e303954813cb188c55bRekha Kumar } 810288268d5528e0df03f348e303954813cb188c55bRekha Kumar 8116a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee int newAudioQuality = 8126a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee getAudioQualityFromCallProfile(localCallProfile, remoteCallProfile); 8136a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee if (getAudioQuality() != newAudioQuality) { 8146a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee setAudioQuality(newAudioQuality); 8156a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee changed = true; 8166a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee } 8176a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee } catch (ImsException e) { 8186a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee // No session in place -- no change 8196a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee } 8206a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee 8216a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee return changed; 8226a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee } 8236a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee 8246a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee /** 82504b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee * Check for a change in the wifi state of the ImsPhoneCallTracker and update the 82604b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee * {@link ImsPhoneConnection} with this information. 82704b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee * 82804b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee * @return Whether the ImsPhoneCallTracker's usage of wifi has been changed. 82904b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee */ 83004b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee public boolean updateWifiState() { 8312e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn // If we've received the wifi state via the ImsCallProfile.EXTRA_CALL_RAT_TYPE extra, we 8322e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn // will no longer use state updates which are based on the onFeatureCapabilityChanged 8332e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn // callback. 8342e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn if (mIsWifiStateFromExtras) { 8352e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn return false; 8362e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn } 8372e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn 83804b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee Rlog.d(LOG_TAG, "updateWifiState: " + mOwner.isVowifiEnabled()); 83904b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee if (isWifi() != mOwner.isVowifiEnabled()) { 84004b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee setWifi(mOwner.isVowifiEnabled()); 84104b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee return true; 84204b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee } 84304b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee return false; 84404b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee } 84504b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee 84604b0216a5f64b70ec4b06f129946fff4ef359878Andrew Lee /** 8472e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * Updates the wifi state based on the {@link ImsCallProfile#EXTRA_CALL_RAT_TYPE}. 8482e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * The call is considered to be a WIFI call if the extra value is 8492e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * {@link ServiceState#RIL_RADIO_TECHNOLOGY_IWLAN}. 8502e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * 8512e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn * @param extras The ImsCallProfile extras. 8522e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn */ 8532e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn private void updateWifiStateFromExtras(Bundle extras) { 8542e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn if (extras.containsKey(ImsCallProfile.EXTRA_CALL_RAT_TYPE)) { 8552e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn // The RIL (sadly) sends us the EXTRA_CALL_RAT_TYPE as a string extra, rather than an 8562e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn // integer extra, so we need to parse it. 8572e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn int radioTechnology; 8582e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn try { 8592e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn radioTechnology = Integer.parseInt(extras.getString( 8602e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn ImsCallProfile.EXTRA_CALL_RAT_TYPE)); 8612e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn } catch (NumberFormatException nfe) { 8622e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn radioTechnology = ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN; 8632e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn } 8642e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn 8652e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn // We've received the extra indicating the radio technology, so we will continue to 8662e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn // prefer the radio technology received via this extra going forward. 8672e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn mIsWifiStateFromExtras = true; 8682e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn 8692e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn boolean isWifi = radioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN; 8702e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn 8712e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn // Report any changes 8722e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn if (isWifi() != isWifi) { 8732e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn setWifi(isWifi); 8742e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn } 8752e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn } 8762e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn } 8772e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn 8782e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn /** 87921048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar * Check for a change in call extras of {@link ImsCall}, and 88021048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar * update the {@link ImsPhoneConnection} accordingly. 88121048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar * 88221048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar * @param imsCall The call to check for changes in extras. 88321048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar * @return Whether the extras fields have been changed. 88421048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar */ 88521048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar boolean updateExtras(ImsCall imsCall) { 88621048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar if (imsCall == null) { 88721048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar return false; 88821048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar } 88921048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar 89021048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar final ImsCallProfile callProfile = imsCall.getCallProfile(); 89121048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar final Bundle extras = callProfile != null ? callProfile.mCallExtras : null; 89221048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar if (extras == null && DBG) { 89321048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar Rlog.d(LOG_TAG, "Call profile extras are null."); 89421048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar } 89521048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar 89621048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar final boolean changed = !areBundlesEqual(extras, mExtras); 89721048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar if (changed) { 8982e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn updateWifiStateFromExtras(extras); 8992e66c6325d321e41b8851da9a4596f7a745c7b1eTyler Gunn 90021048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar mExtras.clear(); 90121048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar mExtras.putAll(extras); 90221048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar setConnectionExtras(mExtras); 90321048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar } 90421048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar return changed; 90521048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar } 90621048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar 90721048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar private static boolean areBundlesEqual(Bundle extras, Bundle newExtras) { 90821048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar if (extras == null || newExtras == null) { 90921048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar return extras == newExtras; 91021048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar } 91121048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar 91221048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar if (extras.size() != newExtras.size()) { 91321048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar return false; 91421048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar } 91521048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar 91621048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar for(String key : extras.keySet()) { 91721048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar if (key != null) { 91821048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar final Object value = extras.get(key); 91921048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar final Object newValue = newExtras.get(key); 92021048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar if (!Objects.equals(value, newValue)) { 92121048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar return false; 92221048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar } 92321048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar } 92421048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar } 92521048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar return true; 92621048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar } 92721048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar 92821048a2bc97d932a3ddecdfd79003a03f34263ecNivedita Sarkar /** 9296a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * Determines the {@link ImsPhoneConnection} audio quality based on the local and remote 9306a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * {@link ImsCallProfile}. If indicate a HQ audio call if the local stream profile 9316a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * indicates AMR_WB or EVRC_WB and there is no remote restrict cause. 9326a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * 9336a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * @param localCallProfile The local call profile. 9346a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * @param remoteCallProfile The remote call profile. 9356a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee * @return The audio quality. 9366a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee */ 9376a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee private int getAudioQualityFromCallProfile( 9386a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee ImsCallProfile localCallProfile, ImsCallProfile remoteCallProfile) { 9396a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee if (localCallProfile == null || remoteCallProfile == null 9406a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee || localCallProfile.mMediaProfile == null) { 9416a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee return AUDIO_QUALITY_STANDARD; 9426a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee } 9436a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee 9446a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee boolean isHighDef = (localCallProfile.mMediaProfile.mAudioQuality 9456a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee == ImsStreamMediaProfile.AUDIO_QUALITY_AMR_WB 9466a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee || localCallProfile.mMediaProfile.mAudioQuality 9476a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee == ImsStreamMediaProfile.AUDIO_QUALITY_EVRC_WB) 9486a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee && remoteCallProfile.mRestrictCause == ImsCallProfile.CALL_RESTRICT_CAUSE_NONE; 9496a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee return isHighDef ? AUDIO_QUALITY_HIGH_DEFINITION : AUDIO_QUALITY_STANDARD; 9506a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee } 9516a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee 9526a0fa4105fa8104a09b33a3403df5ae2711e0083Andrew Lee /** 953541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn * Provides a string representation of the {@link ImsPhoneConnection}. Primarily intended for 954541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn * use in log statements. 955541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn * 956541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn * @return String representation of call. 957541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn */ 958541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn @Override 959541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn public String toString() { 960541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn StringBuilder sb = new StringBuilder(); 961541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn sb.append("[ImsPhoneConnection objId: "); 962541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn sb.append(System.identityHashCode(this)); 963541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn sb.append(" address:"); 964541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn sb.append(Log.pii(getAddress())); 965541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn sb.append(" ImsCall:"); 966541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn if (mImsCall == null) { 967541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn sb.append("null"); 968541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn } else { 969541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn sb.append(mImsCall); 970541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn } 971541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn sb.append("]"); 972541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn return sb.toString(); 973541accbd8e08fac77faa1c60d14533b1a5a36347Tyler Gunn } 9748bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan 9758bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan /** 9768bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan * Indicates whether current phone connection is emergency or not 9778bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan * @return boolean: true if emergency, false otherwise 9788bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan */ 9798bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan protected boolean isEmergency() { 9808bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan return mIsEmergency; 9818bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan } 982a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville} 98364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn 984