diff options
Diffstat (limited to 'src/java/com/android/ims/rcs/uce/presence')
6 files changed, 194 insertions, 97 deletions
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java index c3636680..49291484 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java @@ -39,10 +39,13 @@ import android.util.Log; import com.android.ims.rcs.uce.util.FeatureTags; import com.android.ims.rcs.uce.util.UceUtils; +import com.android.internal.annotations.VisibleForTesting; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.Set; @@ -104,6 +107,11 @@ public class DeviceCapabilityInfo { private boolean mMobileData; private boolean mVtSetting; + // The service description associated with the last publication update. + private final Set<ServiceDescription> mLastSuccessfulCapabilities = new ArraySet<>(); + // The service description to temporarily store the presence capability being sent. + private Set<ServiceDescription> mPendingPublishCapabilities; + public DeviceCapabilityInfo(int subId, String[] capToRegistrationMap) { mSubId = subId; mServiceCapRegTracker = PublishServiceDescTracker.fromCarrierConfig(capToRegistrationMap); @@ -125,6 +133,8 @@ public class DeviceCapabilityInfo { mMmTelCapabilities = new MmTelCapabilities(); mMmtelAssociatedUris = Collections.EMPTY_LIST; mRcsAssociatedUris = Collections.EMPTY_LIST; + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; } /** @@ -166,7 +176,6 @@ public class DeviceCapabilityInfo { /** * Update the status that IMS MMTEL is unregistered. - * @return Mmtel registered status before change */ public synchronized boolean updateImsMmtelUnregistered() { logi("IMS MMTEL unregistered: original state=" + mMmtelRegistered); @@ -176,6 +185,8 @@ public class DeviceCapabilityInfo { changed = true; } mMmtelNetworkRegType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID; + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; return changed; } @@ -248,6 +259,8 @@ public class DeviceCapabilityInfo { mLastRegistrationFeatureTags = Collections.emptySet(); updateRegistration(mLastRegistrationFeatureTags); mRcsNetworkRegType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID; + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; return changed; } @@ -446,6 +459,67 @@ public class DeviceCapabilityInfo { return mPresenceCapable; } + // Get the device's capabilities with the PRESENCE mechanism. + public RcsContactUceCapability getChangedPresenceCapability(Context context) { + if (context == null) { + return null; + } + Set<ServiceDescription> capableFromReg = + mServiceCapRegTracker.copyRegistrationCapabilities(); + if (isPresenceCapabilityChanged(capableFromReg)) { + RcsContactUceCapability rcsContactUceCapability = getPresenceCapabilities(context); + if (rcsContactUceCapability != null) { + mPendingPublishCapabilities = mServiceCapRegTracker.copyRegistrationCapabilities(); + } + return rcsContactUceCapability; + } + return null; + } + + public void setPresencePublishResult(boolean isSuccess) { + if (isSuccess) { + mLastSuccessfulCapabilities.clear(); + if (mPendingPublishCapabilities != null) { + mLastSuccessfulCapabilities.addAll(mPendingPublishCapabilities); + } + } + mPendingPublishCapabilities = null; + } + + public void resetPresenceCapability() { + mLastSuccessfulCapabilities.clear(); + mPendingPublishCapabilities = null; + } + + public List<RcsContactPresenceTuple> getLastSuccessfulPresenceTuplesWithoutContactUri() { + List<RcsContactPresenceTuple> presenceTuples = new ArrayList<>(); + if (mLastSuccessfulCapabilities.isEmpty()) { + return presenceTuples; + } + + for (ServiceDescription capability : mLastSuccessfulCapabilities) { + presenceTuples.add(capability.getTupleBuilder().build()); + } + return presenceTuples; + } + + @VisibleForTesting + public void addLastSuccessfulServiceDescription(ServiceDescription capability) { + mLastSuccessfulCapabilities.add(capability); + } + + @VisibleForTesting + public boolean isPresenceCapabilityChanged(Set<ServiceDescription> capableFromReg) { + if (mLastSuccessfulCapabilities.isEmpty()) { + return true; + } + + if (capableFromReg.equals(mLastSuccessfulCapabilities)) { + return false; + } + return true; + } + private boolean isVolteAvailable(int networkRegType, MmTelCapabilities capabilities) { return (networkRegType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) && capabilities.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE); @@ -478,7 +552,12 @@ public class DeviceCapabilityInfo { @CapabilityMechanism int mechanism, Context context) { switch (mechanism) { case RcsContactUceCapability.CAPABILITY_MECHANISM_PRESENCE: - return getPresenceCapabilities(context); + RcsContactUceCapability rcsContactUceCapability = getPresenceCapabilities(context); + if (rcsContactUceCapability != null) { + mPendingPublishCapabilities = + mServiceCapRegTracker.copyRegistrationCapabilities(); + } + return rcsContactUceCapability; case RcsContactUceCapability.CAPABILITY_MECHANISM_OPTIONS: return getOptionsCapabilities(context); default: diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java index 91904a66..bc372054 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java @@ -276,7 +276,7 @@ public class DeviceCapabilityListener { IntentFilter filter = new IntentFilter(); filter.addAction(TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED); mContext.registerReceiver(mReceiver, filter, android.Manifest.permission.MODIFY_PHONE_STATE, - null); + null, Context.RECEIVER_EXPORTED); ContentResolver resolver = mContext.getContentResolver(); if (resolver != null) { @@ -587,9 +587,9 @@ public class DeviceCapabilityListener { * This method is called when the MMTEL is registered. */ private void handleImsMmtelRegistered(int imsTransportType) { + // update capability, but not trigger PUBLISH message. + // PUBLISH message will be sent when the Capability status changed callback is called. mCapabilityInfo.updateImsMmtelRegistered(imsTransportType); - mHandler.sendTriggeringPublishMessage( - PublishController.PUBLISH_TRIGGER_MMTEL_REGISTERED); } /* diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishController.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishController.java index a3d31b9e..732a558b 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishController.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishController.java @@ -18,9 +18,11 @@ package com.android.ims.rcs.uce.presence.publish; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.telephony.ims.RcsContactUceCapability; import android.telephony.ims.RcsContactUceCapability.CapabilityMechanism; import android.telephony.ims.RcsUceAdapter.PublishState; +import android.telephony.ims.SipDetails; import android.telephony.ims.aidl.IRcsUcePublishStateCallback; import com.android.ims.rcs.uce.ControllerBase; @@ -138,7 +140,8 @@ public interface PublishController extends ControllerBase { /** * Update the publish request result. */ - void updatePublishRequestResult(int publishState, Instant updatedTimestamp, String pidfXml); + void updatePublishRequestResult(int publishState, Instant updatedTimestamp, String pidfXml, + SipDetails details); /** * Update the value of the publish throttle. @@ -208,9 +211,7 @@ public interface PublishController extends ControllerBase { /** * Notify that the device's publish status have been changed. */ - void onPublishUpdated(int reasonCode, String reasonPhrase, - int reasonHeaderCause, String reasonHeaderText); - + void onPublishUpdated(@NonNull SipDetails details); /** * Retrieve the device's capabilities. */ diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java index 35a5d557..101aa810 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java @@ -16,7 +16,10 @@ package com.android.ims.rcs.uce.presence.publish; +import static android.telephony.ims.RcsUceAdapter.PUBLISH_STATE_OK; + import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.os.Build; import android.os.Handler; @@ -27,10 +30,13 @@ import android.os.RemoteCallbackList; import android.os.RemoteException; import android.telephony.CarrierConfigManager; import android.telephony.ims.ImsException; +import android.telephony.ims.PublishAttributes; +import android.telephony.ims.RcsContactPresenceTuple; import android.telephony.ims.RcsContactUceCapability; import android.telephony.ims.RcsContactUceCapability.CapabilityMechanism; import android.telephony.ims.RcsUceAdapter; import android.telephony.ims.RcsUceAdapter.PublishState; +import android.telephony.ims.SipDetails; import android.telephony.ims.aidl.IImsCapabilityCallback; import android.telephony.ims.aidl.IRcsUcePublishStateCallback; import android.telephony.ims.feature.RcsFeature.RcsImsCapabilities; @@ -53,6 +59,7 @@ import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.time.Instant; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -198,7 +205,7 @@ public class PublishControllerImpl implements PublishController { if (capabilityType == RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE) { return RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED; } else if (capabilityType == RcsImsCapabilities.CAPABILITY_TYPE_OPTIONS_UCE) { - return RcsUceAdapter.PUBLISH_STATE_OK; + return PUBLISH_STATE_OK; } else { return RcsUceAdapter.PUBLISH_STATE_OTHER_ERROR; } @@ -363,11 +370,9 @@ public class PublishControllerImpl implements PublishController { * Notify that the device's publish status have been changed. */ @Override - public void onPublishUpdated(int reasonCode, String reasonPhrase, - int reasonHeaderCause, String reasonHeaderText) { + public void onPublishUpdated(@NonNull SipDetails details) { if (mIsDestroyedFlag) return; - mPublishHandler.sendPublishUpdatedMessage(reasonCode, reasonPhrase, reasonHeaderCause, - reasonHeaderText); + mPublishHandler.sendPublishUpdatedMessage(details); } @Override @@ -412,9 +417,10 @@ public class PublishControllerImpl implements PublishController { @Override public void updatePublishRequestResult(@PublishState int state, - Instant updatedTime, String pidfXml) { + Instant updatedTime, String pidfXml, SipDetails details) { logd("updatePublishRequestResult: " + state + ", time=" + updatedTime); - mPublishHandler.sendPublishStateChangedMessage(state, updatedTime, pidfXml); + mPublishHandler.sendPublishStateChangedMessage(state, updatedTime, pidfXml, + details); } @Override @@ -514,9 +520,10 @@ public class PublishControllerImpl implements PublishController { int newPublishState = (Integer) args.arg1; Instant updatedTimestamp = (Instant) args.arg2; String pidfXml = (String) args.arg3; + SipDetails details = (SipDetails) args.arg4; args.recycle(); publishCtrl.handlePublishStateChangedMessage(newPublishState, updatedTimestamp, - pidfXml); + pidfXml, details); break; } case MSG_NOTIFY_CURRENT_PUBLISH_STATE: @@ -566,14 +573,8 @@ public class PublishControllerImpl implements PublishController { break; case MSG_PUBLISH_UPDATED: { - SomeArgs args = (SomeArgs) message.obj; - int reasonCode = (Integer) args.arg1; - String reasonPhrase = (String) args.arg2; - int reasonHeaderCause = (Integer) args.arg3; - String reasonHeaderText = (String) args.arg4; - args.recycle(); - publishCtrl.handlePublishUpdatedMessage(reasonCode, reasonPhrase, - reasonHeaderCause, reasonHeaderText); + SipDetails details = (SipDetails) message.obj; + publishCtrl.handlePublishUpdatedMessage(details); break; } @@ -654,7 +655,7 @@ public class PublishControllerImpl implements PublishController { * Send the message to notify the publish state is changed. */ public void sendPublishStateChangedMessage(@PublishState int publishState, - @NonNull Instant updatedTimestamp, String pidfXml) { + @NonNull Instant updatedTimestamp, String pidfXml, SipDetails details) { PublishControllerImpl publishCtrl = mPublishControllerRef.get(); if (publishCtrl == null) return; if (publishCtrl.mIsDestroyedFlag) return; @@ -663,6 +664,7 @@ public class PublishControllerImpl implements PublishController { args.arg1 = publishState; args.arg2 = updatedTimestamp; args.arg3 = pidfXml; + args.arg4 = details; Message message = obtainMessage(); message.what = MSG_PUBLISH_STATE_CHANGED; message.obj = args; @@ -689,20 +691,14 @@ public class PublishControllerImpl implements PublishController { /** * Send the message to notify the publish state is changed. */ - public void sendPublishUpdatedMessage(int reasonCode, String reasonPhrase, - int reasonHeaderCause, String reasonHeaderText) { + public void sendPublishUpdatedMessage(@NonNull SipDetails details) { PublishControllerImpl publishCtrl = mPublishControllerRef.get(); if (publishCtrl == null) return; if (publishCtrl.mIsDestroyedFlag) return; - SomeArgs args = SomeArgs.obtain(); - args.arg1 = reasonCode; - args.arg2 = reasonPhrase; - args.arg3 = reasonHeaderCause; - args.arg4 = reasonHeaderText; Message message = obtainMessage(); message.what = MSG_PUBLISH_UPDATED; - message.obj = args; + message.obj = details; sendMessage(message); } @@ -924,7 +920,7 @@ public class PublishControllerImpl implements PublishController { // PUBLISH is enabled. if (isPresencePublishEnabled()) { handlePublishStateChangedMessage(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, - Instant.now(), null /*pidfXml*/); + Instant.now(), null /*pidfXml*/, null /*SipDetails*/); } } @@ -1011,7 +1007,8 @@ public class PublishControllerImpl implements PublishController { // Update the publish state directly. Because this method is called in the // handler thread already, the process of updating publish state does not need to be // sent to the looper again. - handlePublishStateChangedMessage(updatedPublishState, Instant.now(), null /*pidfxml*/); + handlePublishStateChangedMessage(updatedPublishState, Instant.now(), null /*pidfxml*/, + null /*SipDetails*/); } } @@ -1040,7 +1037,7 @@ public class PublishControllerImpl implements PublishController { * from original state. */ private void handlePublishStateChangedMessage(@PublishState int newPublishState, - Instant updatedTimestamp, String pidfXml) { + Instant updatedTimestamp, String pidfXml, SipDetails details) { synchronized (mPublishStateLock) { if (mIsDestroyedFlag) return; // Check if the time of the given publish state is not earlier than existing time. @@ -1067,7 +1064,7 @@ public class PublishControllerImpl implements PublishController { logd("Notify publish state changed: " + mCurrentPublishState); mPublishStateCallbacks.broadcast(c -> { try { - c.onPublishStateChanged(mCurrentPublishState); + c.onPublishUpdated(getPublishAttributes(mCurrentPublishState, details)); } catch (RemoteException e) { logw("Notify publish state changed error: " + e); } @@ -1075,11 +1072,25 @@ public class PublishControllerImpl implements PublishController { logd("Notify publish state changed: completed"); } + private PublishAttributes getPublishAttributes(@PublishState int mCurrentPublishState, + SipDetails details) { + List<RcsContactPresenceTuple> tuples = null; + if (mCurrentPublishState == PUBLISH_STATE_OK) { + tuples = mDeviceCapabilityInfo.getLastSuccessfulPresenceTuplesWithoutContactUri(); + } + if (tuples != null && !tuples.isEmpty()) { + return new PublishAttributes.Builder(mCurrentPublishState).setSipDetails(details) + .setPresenceTuples(tuples).build(); + } + return new PublishAttributes.Builder(mCurrentPublishState).setSipDetails(details).build(); + } + private void handleNotifyCurrentPublishStateMessage(IRcsUcePublishStateCallback callback, boolean supportPublishingState) { if (mIsDestroyedFlag || callback == null) return; try { - callback.onPublishStateChanged(getUcePublishState(supportPublishingState)); + int publishState = getUcePublishState(supportPublishingState); + callback.onPublishUpdated(getPublishAttributes(publishState, null /*SipDetails*/)); } catch (RemoteException e) { logw("handleCurrentPublishStateUpdateMessage exception: " + e); } @@ -1146,7 +1157,8 @@ public class PublishControllerImpl implements PublishController { Instant updatedTimestamp) { if (mIsDestroyedFlag) return; mPublishProcessor.resetState(); - handlePublishStateChangedMessage(newPublishState, updatedTimestamp, null); + handlePublishStateChangedMessage(newPublishState, updatedTimestamp, + null /*pidfXml*/, null /*SipDetails*/); } private void handlePublishSentMessage() { @@ -1170,20 +1182,22 @@ public class PublishControllerImpl implements PublishController { mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_PUBLISHING; if (isSupportPublishingState) { if (callback != null) { - callback.onPublishStateChanged(mCurrentPublishState); + callback.onPublishUpdated(getPublishAttributes(mCurrentPublishState, + null /*SipDetails*/)); } } else { // If it is currently PUBLISH_STATE_OK, the state must not be changed to // PUBLISH_STATE_NOT_PUBLISHED. // And in the case of the current PUBLISH_STATE_NOT_PUBLISHED, it is // necessary to avoid reporting the duplicate state. - if (tempPublishState != RcsUceAdapter.PUBLISH_STATE_OK + if (tempPublishState != PUBLISH_STATE_OK && tempPublishState != RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED) { // set the state to PUBLISH_STATE_NOT_PUBLISHED so that // getUcePublishState is consistent with the callback mLastPublishState = RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED; if (callback != null) { - callback.onPublishStateChanged(mLastPublishState); + callback.onPublishUpdated(getPublishAttributes(mLastPublishState, + null /*SipDetails*/)); } } } @@ -1194,11 +1208,10 @@ public class PublishControllerImpl implements PublishController { } } - private void handlePublishUpdatedMessage(int reasonCode, String reasonPhrase, - int reasonHeaderCause, String reasonHeaderText) { + private void handlePublishUpdatedMessage(@NonNull SipDetails details) { if (mIsDestroyedFlag) return; PublishRequestResponse updatedPublish = new PublishRequestResponse(getLastPidfXml(), - reasonCode, reasonPhrase, reasonHeaderCause, reasonHeaderText); + details); mPublishProcessor.publishUpdated(updatedPublish); } diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java index d87eea9e..c239dd5a 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java @@ -22,6 +22,7 @@ import android.annotation.NonNull; import android.content.Context; import android.os.RemoteException; import android.telephony.ims.RcsContactUceCapability; +import android.telephony.ims.SipDetails; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.telephony.ims.stub.RcsCapabilityExchangeImplBase; import android.text.TextUtils; @@ -112,6 +113,8 @@ public class PublishProcessor { logi("onRcsDisconnected"); mRcsFeatureManager = null; mProcessorState.onRcsDisconnected(); + // reset the publish capabilities. + mDeviceCapabilities.resetPresenceCapability(); } /** @@ -152,10 +155,15 @@ public class PublishProcessor { } // Get the latest device's capabilities. - RcsContactUceCapability deviceCapability = - mDeviceCapabilities.getDeviceCapabilities(CAPABILITY_MECHANISM_PRESENCE, mContext); + RcsContactUceCapability deviceCapability; + if (triggerType == PublishController.PUBLISH_TRIGGER_SERVICE) { + deviceCapability = mDeviceCapabilities.getDeviceCapabilities( + CAPABILITY_MECHANISM_PRESENCE, mContext); + } else { + deviceCapability = mDeviceCapabilities.getChangedPresenceCapability(mContext); + } if (deviceCapability == null) { - logw("doPublishInternal: device capability is null"); + logi("doPublishInternal: device capability hasn't changed or is null"); return false; } @@ -349,6 +357,8 @@ public class PublishProcessor { // Increase the retry count mProcessorState.increaseRetryCount(); + // reset the last capabilities because of the request is failed + mDeviceCapabilities.setPresencePublishResult(false); // Reset the pending flag because it is going to resend a request. clearPendingRequest(); @@ -373,15 +383,21 @@ public class PublishProcessor { Instant responseTime = response.getResponseTimestamp(); // Record the time when the request is successful and reset the retry count. + boolean publishSuccess = false; if (response.isRequestSuccess()) { mProcessorState.setLastPublishedTime(responseTime); mProcessorState.resetRetryCount(); + publishSuccess = true; } + // set the last capabilities according to the result of request. + mDeviceCapabilities.setPresencePublishResult(publishSuccess); // Update the publish state after the request has finished. int publishState = response.getPublishState(); String pidfXml = response.getPidfXml(); - mPublishCtrlCallback.updatePublishRequestResult(publishState, responseTime, pidfXml); + SipDetails details = response.getSipDetails().orElse(null); + mPublishCtrlCallback.updatePublishRequestResult(publishState, responseTime, pidfXml, + details); // Refresh the device state with the publish request result. response.getResponseSipCode().ifPresent(sipCode -> { @@ -492,6 +508,8 @@ public class PublishProcessor { */ public void resetState() { mProcessorState.resetState(); + // reset the publish capabilities. + mDeviceCapabilities.resetPresenceCapability(); } /** diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java index 47aa37c3..aa1b27c1 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java @@ -16,8 +16,10 @@ package com.android.ims.rcs.uce.presence.publish; +import android.annotation.NonNull; import android.annotation.Nullable; import android.telephony.ims.RcsUceAdapter; +import android.telephony.ims.SipDetails; import android.telephony.ims.aidl.IPublishResponseCallback; import android.telephony.ims.stub.RcsCapabilityExchangeImplBase; import android.text.TextUtils; @@ -47,7 +49,7 @@ public class PublishRequestResponse { private Optional<String> mReasonPhrase; private Optional<Integer> mReasonHeaderCause; private Optional<String> mReasonHeaderText; - + private Optional<SipDetails> mSipDetails; // The timestamp when receive the response from the network. private Instant mResponseTimestamp; @@ -61,29 +63,29 @@ public class PublishRequestResponse { mReasonPhrase = Optional.empty(); mReasonHeaderCause = Optional.empty(); mReasonHeaderText = Optional.empty(); + mSipDetails = Optional.empty(); } - public PublishRequestResponse(String pidfXml, int sipCode, String reasonPhrase, - int reasonHeaderCause, String reasonHeaderText) { + public PublishRequestResponse(String pidfXml, @Nullable SipDetails details) { mTaskId = 0L; mPublishCtrlCallback = null; mCmdErrorCode = Optional.empty(); mPidfXml = pidfXml; mResponseTimestamp = Instant.now(); - mNetworkRespSipCode = Optional.of(sipCode); - mReasonPhrase = Optional.ofNullable(reasonPhrase); - if (reasonHeaderCause != 0) { - mReasonHeaderCause = Optional.of(reasonHeaderCause); + mNetworkRespSipCode = Optional.of(details.getResponseCode()); + mReasonPhrase = Optional.ofNullable(details.getResponsePhrase()); + if (details.getReasonHeaderCause() != 0) { + mReasonHeaderCause = Optional.of(details.getReasonHeaderCause()); } else { mReasonHeaderCause = Optional.empty(); } - if (TextUtils.isEmpty(reasonHeaderText)) { + if (TextUtils.isEmpty(details.getReasonHeaderText())) { mReasonHeaderText = Optional.empty(); } else { - mReasonHeaderText = Optional.ofNullable(reasonHeaderText); + mReasonHeaderText = Optional.ofNullable(details.getReasonHeaderText()); } - + mSipDetails = Optional.ofNullable(details); } // The result callback of the publish capability request. @@ -94,15 +96,8 @@ public class PublishRequestResponse { } @Override - public void onNetworkResponse(int code, String reason) { - PublishRequestResponse.this.onNetworkResponse(code, reason); - } - - @Override - public void onNetworkRespHeader(int code, String reasonPhrase, int reasonHeaderCause, - String reasonHeaderText) { - PublishRequestResponse.this.onNetworkResponse(code, reasonPhrase, reasonHeaderCause, - reasonHeaderText); + public void onNetworkResponse(@NonNull SipDetails details) { + PublishRequestResponse.this.onNetworkResponse(details); } }; @@ -150,6 +145,12 @@ public class PublishRequestResponse { } /** + * Retrieve the sip information which received from the network. + */ + public Optional<SipDetails> getSipDetails() { + return mSipDetails; + } + /** * Retrieve the SIP code from the network response. It will get the value from the Reason * Header first. If the ReasonHeader is not present, it will get the value from the Network * response instead. @@ -198,49 +199,34 @@ public class PublishRequestResponse { } } - private void onNetworkResponse(int sipCode, String reason) { + private void onNetworkResponse(@NonNull SipDetails details) { // When we send a request to PUBLISH and there is no change to the UCE capabilities, we // expected onCommandError() with COMMAND_CODE_NO_CHANGE. // But some of the vendor will instead send SIP code 999. - if (sipCode == 999) { + if (details.getResponseCode() == 999) { onCommandError(RcsCapabilityExchangeImplBase.COMMAND_CODE_NO_CHANGE); return; } mResponseTimestamp = Instant.now(); - mNetworkRespSipCode = Optional.of(sipCode); - mReasonPhrase = Optional.ofNullable(reason); - updateRetryFlagByNetworkResponse(); - - PublishControllerCallback ctrlCallback = mPublishCtrlCallback; - if (ctrlCallback != null) { - ctrlCallback.onRequestNetworkResp(this); - } else { - Log.d(LOG_TAG, "onNetworkResponse: already destroyed. sip code=" + sipCode); + mNetworkRespSipCode = Optional.of(details.getResponseCode()); + mReasonPhrase = Optional.ofNullable(details.getResponsePhrase()); + if (details.getReasonHeaderCause() != 0) { + mReasonHeaderCause = Optional.of(details.getReasonHeaderCause()); } - } - - private void onNetworkResponse(int sipCode, String reasonPhrase, int reasonHeaderCause, - String reasonHeaderText) { - // When we send a request to PUBLISH and there is no change to the UCE capabilities, we - // expected onCommandError() with COMMAND_CODE_NO_CHANGE. - // But some of the vendor will instead send SIP code 999. - if (sipCode == 999) { - onCommandError(RcsCapabilityExchangeImplBase.COMMAND_CODE_NO_CHANGE); - return; + if (TextUtils.isEmpty(details.getReasonHeaderText())) { + mReasonHeaderText = Optional.empty(); + } else { + mReasonHeaderText = Optional.ofNullable(details.getReasonHeaderText()); } - mResponseTimestamp = Instant.now(); - mNetworkRespSipCode = Optional.of(sipCode); - mReasonPhrase = Optional.ofNullable(reasonPhrase); - mReasonHeaderCause = Optional.of(reasonHeaderCause); - mReasonHeaderText = Optional.ofNullable(reasonHeaderText); + mSipDetails = Optional.ofNullable(details); updateRetryFlagByNetworkResponse(); PublishControllerCallback ctrlCallback = mPublishCtrlCallback; if (ctrlCallback != null) { ctrlCallback.onRequestNetworkResp(this); } else { - Log.d(LOG_TAG, "onNetworkResponse: already destroyed. sipCode=" + sipCode + - ", reasonHeader=" + reasonHeaderCause); + Log.d(LOG_TAG, "onNetworkResponse: already destroyed. sip code=" + + details.getResponseCode()); } } |