Methods Summary |
---|
private void | acquireWakeLock()
Rlog.d(LOG_TAG, "acquireWakeLock");
mPartialWakeLock.acquire();
|
public void | cancelPostDial()
setPostDialState(PostDialState.CANCELLED);
|
void | changeParent(ImsPhoneCall parent)
mParent = parent;
|
private void | createWakeLock(android.content.Context context)
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG);
|
public void | dispose()
|
static boolean | equalsHandlesNulls(java.lang.Object a, java.lang.Object b)
return (a == null) ? (b == null) : a.equals (b);
|
protected void | finalize()
releaseWakeLock();
|
private int | getAudioQualityFromCallProfile(com.android.ims.ImsCallProfile localCallProfile, com.android.ims.ImsCallProfile remoteCallProfile)Determines the {@link ImsPhoneConnection} audio quality based on the local and remote
{@link ImsCallProfile}. If indicate a HQ audio call if the local stream profile
indicates AMR_WB or EVRC_WB and there is no remote restrict cause.
if (localCallProfile == null || remoteCallProfile == null
|| localCallProfile.mMediaProfile == null) {
return AUDIO_QUALITY_STANDARD;
}
boolean isHighDef = (localCallProfile.mMediaProfile.mAudioQuality
== ImsStreamMediaProfile.AUDIO_QUALITY_AMR_WB
|| localCallProfile.mMediaProfile.mAudioQuality
== ImsStreamMediaProfile.AUDIO_QUALITY_EVRC_WB)
&& remoteCallProfile.mRestrictCause == ImsCallProfile.CALL_RESTRICT_CAUSE_NONE;
return isHighDef ? AUDIO_QUALITY_HIGH_DEFINITION : AUDIO_QUALITY_STANDARD;
|
public ImsPhoneCall | getCall()
return mParent;
|
public long | getConferenceConnectTime()
return mConferenceConnectTime;
|
public int | getDisconnectCause()
return mCause;
|
public long | getDisconnectTime()
return mDisconnectTime;
|
public long | getHoldDurationMillis()
if (getState() != ImsPhoneCall.State.HOLDING) {
// If not holding, return 0
return 0;
} else {
return SystemClock.elapsedRealtime() - mHoldingStartTime;
}
|
public long | getHoldingStartTime()
return mHoldingStartTime;
|
com.android.ims.ImsCall | getImsCall()
return mImsCall;
|
public int | getNumberPresentation()
return mNumberPresentation;
|
public com.android.internal.telephony.Connection | getOrigConnection()
return null;
|
public java.lang.String | getOrigDialString()
return mDialString;
|
public ImsPhoneCallTracker | getOwner()
return mOwner;
|
public PostDialState | getPostDialState()
return mPostDialState;
|
public int | getPreciseDisconnectCause()
return 0;
|
public java.lang.String | getRemainingPostDialString()
if (mPostDialState == PostDialState.CANCELLED
|| mPostDialState == PostDialState.COMPLETE
|| mPostDialString == null
|| mPostDialString.length() <= mNextPostDialChar
) {
return "";
}
return mPostDialString.substring(mNextPostDialChar);
|
public ImsPhoneCall.State | getState()
if (mDisconnected) {
return ImsPhoneCall.State.DISCONNECTED;
} else {
return super.getState();
}
|
public com.android.internal.telephony.UUSInfo | getUUSInfo()
return mUusInfo;
|
public void | hangup()
if (!mDisconnected) {
mOwner.hangup(this);
} else {
throw new CallStateException ("disconnected");
}
|
public boolean | isMultiparty()
return mImsCall != null && mImsCall.isMultiparty();
|
void | onConnectedInOrOut()An incoming or outgoing call has connected
mConnectTime = System.currentTimeMillis();
mConnectTimeReal = SystemClock.elapsedRealtime();
mDuration = 0;
if (Phone.DEBUG_PHONE) {
Rlog.d(LOG_TAG, "onConnectedInOrOut: connectTime=" + mConnectTime);
}
if (!mIsIncoming) {
// outgoing calls only
processNextPostDialChar();
}
releaseWakeLock();
|
public boolean | onDisconnect(int cause)Called when the connection has been disconnected
Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause);
if (mCause != DisconnectCause.LOCAL) mCause = cause;
return onDisconnect();
|
boolean | onDisconnect()
boolean changed = false;
if (!mDisconnected) {
//mIndex = -1;
mDisconnectTime = System.currentTimeMillis();
mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal;
mDisconnected = true;
mOwner.mPhone.notifyDisconnect(this);
if (mParent != null) {
changed = mParent.connectionDisconnected(this);
} else {
Rlog.d(LOG_TAG, "onDisconnect: no parent");
}
if (mImsCall != null) mImsCall.close();
mImsCall = null;
}
releaseWakeLock();
return changed;
|
public void | onDisconnectConferenceParticipant(android.net.Uri endpoint)Notifies this Connection of a request to disconnect a participant of the conference managed
by the connection.
ImsCall imsCall = getImsCall();
if (imsCall == null) {
return;
}
try {
imsCall.removeParticipants(new String[]{endpoint.toString()});
} catch (ImsException e) {
// No session in place -- no change
Rlog.e(LOG_TAG, "onDisconnectConferenceParticipant: no session in place. "+
"Failed to disconnect endpoint = " + endpoint);
}
|
void | onHangupLocal()Called when this Connection is being hung up locally (eg, user pressed "end")
mCause = DisconnectCause.LOCAL;
|
void | onStartedHolding()
mHoldingStartTime = SystemClock.elapsedRealtime();
|
public void | proceedAfterWaitChar()
if (mPostDialState != PostDialState.WAIT) {
Rlog.w(LOG_TAG, "ImsPhoneConnection.proceedAfterWaitChar(): Expected "
+ "getPostDialState() to be WAIT but was " + mPostDialState);
return;
}
setPostDialState(PostDialState.STARTED);
processNextPostDialChar();
|
public void | proceedAfterWildChar(java.lang.String str)
if (mPostDialState != PostDialState.WILD) {
Rlog.w(LOG_TAG, "ImsPhoneConnection.proceedAfterWaitChar(): Expected "
+ "getPostDialState() to be WILD but was " + mPostDialState);
return;
}
setPostDialState(PostDialState.STARTED);
// make a new postDialString, with the wild char replacement string
// at the beginning, followed by the remaining postDialString.
StringBuilder buf = new StringBuilder(str);
buf.append(mPostDialString.substring(mNextPostDialChar));
mPostDialString = buf.toString();
mNextPostDialChar = 0;
if (Phone.DEBUG_PHONE) {
Rlog.d(LOG_TAG, "proceedAfterWildChar: new postDialString is " +
mPostDialString);
}
processNextPostDialChar();
|
private void | processNextPostDialChar()
char c = 0;
Registrant postDialHandler;
if (mPostDialState == PostDialState.CANCELLED) {
//Rlog.d(LOG_TAG, "##### processNextPostDialChar: postDialState == CANCELLED, bail");
return;
}
if (mPostDialString == null || mPostDialString.length() <= mNextPostDialChar) {
setPostDialState(PostDialState.COMPLETE);
// notifyMessage.arg1 is 0 on complete
c = 0;
} else {
boolean isValid;
setPostDialState(PostDialState.STARTED);
c = mPostDialString.charAt(mNextPostDialChar++);
isValid = processPostDialChar(c);
if (!isValid) {
// Will call processNextPostDialChar
mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget();
// Don't notify application
Rlog.e(LOG_TAG, "processNextPostDialChar: c=" + c + " isn't valid!");
return;
}
}
notifyPostDialListenersNextChar(c);
// TODO: remove the following code since the handler no longer executes anything.
postDialHandler = mOwner.mPhone.mPostDialHandler;
Message notifyMessage;
if (postDialHandler != null
&& (notifyMessage = postDialHandler.messageForRegistrant()) != null) {
// The AsyncResult.result is the Connection object
PostDialState state = mPostDialState;
AsyncResult ar = AsyncResult.forMessage(notifyMessage);
ar.result = this;
ar.userObj = state;
// arg1 is the character that was/is being processed
notifyMessage.arg1 = c;
//Rlog.v(LOG_TAG, "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c);
notifyMessage.sendToTarget();
}
|
private boolean | processPostDialChar(char c)Performs the appropriate action for a post-dial char, but does not
notify application. returns false if the character is invalid and
should be ignored
if (PhoneNumberUtils.is12Key(c)) {
mOwner.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE));
} else if (c == PhoneNumberUtils.PAUSE) {
// From TS 22.101:
// It continues...
// Upon the called party answering the UE shall send the DTMF digits
// automatically to the network after a delay of 3 seconds( 20 ).
// The digits shall be sent according to the procedures and timing
// specified in 3GPP TS 24.008 [13]. The first occurrence of the
// "DTMF Control Digits Separator" shall be used by the ME to
// distinguish between the addressing digits (i.e. the phone number)
// and the DTMF digits. Upon subsequent occurrences of the
// separator,
// the UE shall pause again for 3 seconds ( 20 ) before sending
// any further DTMF digits.
mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE),
PAUSE_DELAY_MILLIS);
} else if (c == PhoneNumberUtils.WAIT) {
setPostDialState(PostDialState.WAIT);
} else if (c == PhoneNumberUtils.WILD) {
setPostDialState(PostDialState.WILD);
} else {
return false;
}
return true;
|
void | releaseWakeLock()
synchronized(mPartialWakeLock) {
if (mPartialWakeLock.isHeld()) {
Rlog.d(LOG_TAG, "releaseWakeLock");
mPartialWakeLock.release();
}
}
|
public void | separate()
throw new CallStateException ("not supported");
|
public void | setConferenceConnectTime(long conferenceConnectTime)Sets the conference connect time. Used when an {@code ImsConference} is created to out of
this phone connection.
mConferenceConnectTime = conferenceConnectTime;
|
public void | setDisconnectCause(int cause)
mCause = cause;
|
void | setImsCall(com.android.ims.ImsCall imsCall)
mImsCall = imsCall;
|
private void | setPostDialState(PostDialState s)Set post dial state and acquire wake lock while switching to "started"
state, the wake lock will be released if state switches out of "started"
state or after WAKE_LOCK_TIMEOUT_MILLIS.
if (mPostDialState != PostDialState.STARTED
&& s == PostDialState.STARTED) {
acquireWakeLock();
Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT);
mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS);
} else if (mPostDialState == PostDialState.STARTED
&& s != PostDialState.STARTED) {
mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT);
releaseWakeLock();
}
mPostDialState = s;
notifyPostDialListeners();
|
public java.lang.String | toString()Provides a string representation of the {@link ImsPhoneConnection}. Primarily intended for
use in log statements.
StringBuilder sb = new StringBuilder();
sb.append("[ImsPhoneConnection objId: ");
sb.append(System.identityHashCode(this));
sb.append(" address:");
sb.append(Log.pii(getAddress()));
sb.append(" ImsCall:");
if (mImsCall == null) {
sb.append("null");
} else {
sb.append(mImsCall);
}
sb.append("]");
return sb.toString();
|
boolean | update(com.android.ims.ImsCall imsCall, ImsPhoneCall.State state)
if (state == ImsPhoneCall.State.ACTIVE) {
if (mParent.getState().isRinging() || mParent.getState().isDialing()) {
onConnectedInOrOut();
}
if (mParent.getState().isRinging() || mParent == mOwner.mBackgroundCall) {
//mForegroundCall should be IDLE
//when accepting WAITING call
//before accept WAITING call,
//the ACTIVE call should be held ahead
mParent.detach(this);
mParent = mOwner.mForegroundCall;
mParent.attach(this);
}
} else if (state == ImsPhoneCall.State.HOLDING) {
onStartedHolding();
}
boolean updateParent = mParent.update(this, imsCall, state);
boolean updateMediaCapabilities = updateMediaCapabilities(imsCall);
return updateParent || updateMediaCapabilities;
|
private boolean | updateMediaCapabilities(com.android.ims.ImsCall imsCall)Check for a change in the video capabilities and audio quality for the {@link ImsCall}, and
update the {@link ImsPhoneConnection} with this information.
if (imsCall == null) {
return false;
}
boolean changed = false;
try {
// The actual call profile (negotiated between local and peer).
ImsCallProfile negotiatedCallProfile = imsCall.getCallProfile();
// The capabilities of the local device.
ImsCallProfile localCallProfile = imsCall.getLocalCallProfile();
// The capabilities of the peer device.
ImsCallProfile remoteCallProfile = imsCall.getRemoteCallProfile();
if (negotiatedCallProfile != null) {
int callType = negotiatedCallProfile.mCallType;
int newVideoState = ImsCallProfile.getVideoStateFromCallType(callType);
if (getVideoState() != newVideoState) {
setVideoState(newVideoState);
changed = true;
}
}
if (localCallProfile != null) {
int callType = localCallProfile.mCallType;
boolean newLocalVideoCapable = callType == ImsCallProfile.CALL_TYPE_VT;
if (isLocalVideoCapable() != newLocalVideoCapable) {
setLocalVideoCapable(newLocalVideoCapable);
changed = true;
}
}
int newAudioQuality =
getAudioQualityFromCallProfile(localCallProfile, remoteCallProfile);
if (getAudioQuality() != newAudioQuality) {
setAudioQuality(newAudioQuality);
changed = true;
}
} catch (ImsException e) {
// No session in place -- no change
}
return changed;
|