diff options
Diffstat (limited to 'src/java/com/android/ims/rcs/uce/request')
6 files changed, 123 insertions, 49 deletions
diff --git a/src/java/com/android/ims/rcs/uce/request/CapabilityRequestResponse.java b/src/java/com/android/ims/rcs/uce/request/CapabilityRequestResponse.java index 97371b8b..6da31301 100644 --- a/src/java/com/android/ims/rcs/uce/request/CapabilityRequestResponse.java +++ b/src/java/com/android/ims/rcs/uce/request/CapabilityRequestResponse.java @@ -16,11 +16,14 @@ package com.android.ims.rcs.uce.request; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.net.Uri; import android.telephony.ims.RcsContactTerminatedReason; import android.telephony.ims.RcsContactUceCapability; import android.telephony.ims.RcsUceAdapter; import android.telephony.ims.RcsUceAdapter.ErrorCode; +import android.telephony.ims.SipDetails; import android.telephony.ims.stub.RcsCapabilityExchangeImplBase; import android.telephony.ims.stub.RcsCapabilityExchangeImplBase.CommandCode; import android.text.TextUtils; @@ -85,6 +88,9 @@ public class CapabilityRequestResponse { // The collection to record whether the request contacts have received the capabilities updated. private Map<Uri, Boolean> mContactCapsReceived; + // The SIP detail information of the network response. + private Optional<SipDetails> mSipDetails; + public CapabilityRequestResponse() { mRequestInternalError = Optional.empty(); mCommandError = Optional.empty(); @@ -99,6 +105,7 @@ public class CapabilityRequestResponse { mUpdatedCapabilityList = new ArrayList<>(); mRemoteCaps = new HashSet<>(); mContactCapsReceived = new HashMap<>(); + mSipDetails = Optional.empty(); } /** @@ -169,12 +176,20 @@ public class CapabilityRequestResponse { /** * Set the network response of this request which is sent by the network. */ - public synchronized void setNetworkResponseCode(int sipCode, String reasonPhrase, - int reasonHeaderCause, String reasonHeaderText) { - mNetworkRespSipCode = Optional.of(sipCode); - mReasonPhrase = Optional.ofNullable(reasonPhrase); - mReasonHeaderCause = Optional.of(reasonHeaderCause); - mReasonHeaderText = Optional.ofNullable(reasonHeaderText); + public synchronized void setSipDetails(@NonNull SipDetails details) { + setNetworkResponseCode(details.getResponseCode(), details.getResponsePhrase()); + if (details.getReasonHeaderCause() != 0) { + mReasonHeaderCause = Optional.of(details.getReasonHeaderCause()); + } else { + mReasonHeaderCause = Optional.empty(); + } + if (TextUtils.isEmpty(details.getReasonHeaderText())) { + mReasonHeaderText = Optional.empty(); + } else { + mReasonHeaderText = Optional.ofNullable(details.getReasonHeaderText()); + } + + mSipDetails = Optional.ofNullable(details); } // Get the sip code of the network response. @@ -239,6 +254,13 @@ public class CapabilityRequestResponse { } /** + * Retrieve the SIP information which received from the network. + */ + public Optional<SipDetails> getSipDetails() { + return mSipDetails; + } + + /** * Add the capabilities which are retrieved from the cache. */ public synchronized void addCachedCapabilities(List<RcsContactUceCapability> capabilityList) { diff --git a/src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java b/src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java index a2660931..b2db1788 100644 --- a/src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java +++ b/src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java @@ -315,7 +315,7 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator { private void triggerCompletedCallback() { try { logd("triggerCompletedCallback"); - mCapabilitiesCallback.onComplete(); + mCapabilitiesCallback.onComplete(null); } catch (RemoteException e) { logw("triggerCompletedCallback exception: " + e); } finally { @@ -329,7 +329,7 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator { private void triggerErrorCallback(int errorCode, long retryAfterMillis) { try { logd("triggerErrorCallback: errorCode=" + errorCode + ", retry=" + retryAfterMillis); - mCapabilitiesCallback.onError(errorCode, retryAfterMillis); + mCapabilitiesCallback.onError(errorCode, retryAfterMillis, null); } catch (RemoteException e) { logw("triggerErrorCallback exception: " + e); } finally { diff --git a/src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java b/src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java index bee71771..a306eb42 100644 --- a/src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java +++ b/src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java @@ -17,11 +17,13 @@ package com.android.ims.rcs.uce.request; import android.annotation.NonNull; +import android.annotation.Nullable; import android.net.Uri; import android.os.RemoteException; import android.telephony.ims.RcsContactTerminatedReason; import android.telephony.ims.RcsContactUceCapability; import android.telephony.ims.RcsUceAdapter; +import android.telephony.ims.SipDetails; import android.telephony.ims.aidl.ISubscribeResponseCallback; import android.telephony.ims.stub.RcsCapabilityExchangeImplBase.CommandCode; @@ -53,14 +55,8 @@ public class SubscribeRequest extends CapabilityRequest { SubscribeRequest.this.onCommandError(code); } @Override - public void onNetworkResponse(int code, String reason) { - SubscribeRequest.this.onNetworkResponse(code, reason); - } - @Override - public void onNetworkRespHeader(int code, String reasonPhrase, - int reasonHeaderCause, String reasonHeaderText) { - SubscribeRequest.this.onNetworkResponse(code, reasonPhrase, reasonHeaderCause, - reasonHeaderText); + public void onNetworkResponse(@NonNull SipDetails details) { + SubscribeRequest.this.onNetworkResponse(details); } @Override public void onNotifyCapabilitiesUpdate(List<String> pidfXmls) { @@ -135,28 +131,14 @@ public class SubscribeRequest extends CapabilityRequest { } // Receive the network response callback which is triggered by ISubscribeResponseCallback. - private void onNetworkResponse(int sipCode, String reason) { - logd("onNetworkResponse: code=" + sipCode + ", reason=" + reason); - if (mIsFinished) { - logw("onNetworkResponse: request is already finished"); - return; - } - mRequestResponse.setNetworkResponseCode(sipCode, reason); - mRequestManagerCallback.notifyNetworkResponse(mCoordinatorId, mTaskId); - } + private void onNetworkResponse(@NonNull SipDetails details) { + logd("onNetworkResponse: sip details=" + details.toString()); - // Receive the network response callback which is triggered by ISubscribeResponseCallback. - private void onNetworkResponse(int sipCode, String reasonPhrase, - int reasonHeaderCause, String reasonHeaderText) { - logd("onNetworkResponse: code=" + sipCode + ", reasonPhrase=" + reasonPhrase + - ", reasonHeaderCause=" + reasonHeaderCause + - ", reasonHeaderText=" + reasonHeaderText); if (mIsFinished) { logw("onNetworkResponse: request is already finished"); return; } - mRequestResponse.setNetworkResponseCode(sipCode, reasonPhrase, reasonHeaderCause, - reasonHeaderText); + mRequestResponse.setSipDetails(details); mRequestManagerCallback.notifyNetworkResponse(mCoordinatorId, mTaskId); } diff --git a/src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java b/src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java index f44686ac..26143f94 100644 --- a/src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java +++ b/src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java @@ -18,10 +18,12 @@ package com.android.ims.rcs.uce.request; import static android.telephony.ims.stub.RcsCapabilityExchangeImplBase.COMMAND_CODE_GENERIC_FAILURE; +import android.annotation.Nullable; import android.net.Uri; import android.os.RemoteException; import android.telephony.ims.RcsContactUceCapability; import android.telephony.ims.RcsUceAdapter; +import android.telephony.ims.SipDetails; import android.telephony.ims.aidl.IRcsUceControllerCallback; import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult; @@ -111,21 +113,25 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator { private static final RequestResultCreator sNetworkRespErrorCreator = (taskId, response, requestMgrCallback) -> { DeviceStateResult deviceState = requestMgrCallback.getDeviceState(); + SipDetails details = response.getSipDetails().orElse(null); if (deviceState.isRequestForbidden()) { int errorCode = deviceState.getErrorCode().orElse(RcsUceAdapter.ERROR_FORBIDDEN); long retryAfter = deviceState.getRequestRetryAfterMillis(); - return RequestResult.createFailedResult(taskId, errorCode, retryAfter); + return RequestResult.createFailedResult(taskId, errorCode, retryAfter, details); } else { int errorCode = CapabilityRequestResponse.getCapabilityErrorFromSipCode(response); long retryAfter = response.getRetryAfterMillis(); - return RequestResult.createFailedResult(taskId, errorCode, retryAfter); + return RequestResult.createFailedResult(taskId, errorCode, retryAfter, details); } }; // The RequestResult creator of the network response is not 200 OK, however, we can to treat // it as a successful result and finish the request private static final RequestResultCreator sNetworkRespSuccessfulCreator = (taskId, response, - requestMgrCallback) -> RequestResult.createSuccessResult(taskId); + requestMgrCallback) -> { + SipDetails detail = response.getSipDetails().orElse(null); + return RequestResult.createSuccessResult(taskId, detail); + }; // The RequestResult creator of the request terminated. private static final RequestResultCreator sTerminatedCreator = (taskId, response, @@ -134,6 +140,7 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator { TerminatedResult terminatedResult = SubscriptionTerminatedHelper.getAnalysisResult( response.getTerminatedReason(), response.getRetryAfterMillis(), response.haveAllRequestCapsUpdatedBeenReceived()); + SipDetails details = response.getSipDetails().orElse(null); if (terminatedResult.getErrorCode().isPresent()) { // If the terminated error code is present, it means that the request is failed. int errorCode = terminatedResult.getErrorCode().get(); @@ -143,9 +150,9 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator { // If the network response is failed or the retryAfter is not 0, this request is failed. long retryAfterMillis = response.getRetryAfterMillis(); int errorCode = CapabilityRequestResponse.getCapabilityErrorFromSipCode(response); - return RequestResult.createFailedResult(taskId, errorCode, retryAfterMillis); + return RequestResult.createFailedResult(taskId, errorCode, retryAfterMillis, details); } else { - return RequestResult.createSuccessResult(taskId); + return RequestResult.createSuccessResult(taskId, details); } }; @@ -297,7 +304,9 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator { // Trigger capabilities updated callback if there is any. List<RcsContactUceCapability> updatedCapList = response.getUpdatedContactCapability(); if (!updatedCapList.isEmpty()) { - mRequestManagerCallback.saveCapabilities(updatedCapList); + if (response.isNotFound()) { + mRequestManagerCallback.saveCapabilities(updatedCapList); + } triggerCapabilitiesReceivedCallback(updatedCapList); response.removeUpdatedCapabilities(updatedCapList); } @@ -538,14 +547,23 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator { .max(Comparator.comparingLong(result -> result.getRetryMillis().orElse(-1L))); + Optional<RequestResult> optDebugInfoResult = mFinishedRequests.values().stream() + .filter(result -> !result.getSipDetails().isEmpty()) + .findFirst(); + + SipDetails details = null; + if (optDebugInfoResult.isPresent()) { + RequestResult result = optDebugInfoResult.get(); + details = result.getSipDetails().orElse(null); + } // Trigger the callback if (optRequestResult.isPresent()) { RequestResult result = optRequestResult.get(); int errorCode = result.getErrorCode().orElse(DEFAULT_ERROR_CODE); long retryAfter = result.getRetryMillis().orElse(0L); - triggerErrorCallback(errorCode, retryAfter); + triggerErrorCallback(errorCode, retryAfter, details); } else { - triggerCompletedCallback(); + triggerCompletedCallback(details); } // Notify UceRequestManager to remove this instance from the collection. @@ -572,10 +590,10 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator { /** * Trigger the onComplete callback to notify the request is completed. */ - private void triggerCompletedCallback() { + private void triggerCompletedCallback(@Nullable SipDetails details) { try { logd("triggerCompletedCallback"); - mCapabilitiesCallback.onComplete(); + mCapabilitiesCallback.onComplete(details); } catch (RemoteException e) { logw("triggerCompletedCallback exception: " + e); } finally { @@ -586,10 +604,11 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator { /** * Trigger the onError callback to notify the request is failed. */ - private void triggerErrorCallback(int errorCode, long retryAfterMillis) { + private void triggerErrorCallback(int errorCode, long retryAfterMillis, + @Nullable SipDetails details) { try { logd("triggerErrorCallback: errorCode=" + errorCode + ", retry=" + retryAfterMillis); - mCapabilitiesCallback.onError(errorCode, retryAfterMillis); + mCapabilitiesCallback.onError(errorCode, retryAfterMillis, details); } catch (RemoteException e) { logw("triggerErrorCallback exception: " + e); } finally { diff --git a/src/java/com/android/ims/rcs/uce/request/UceRequestCoordinator.java b/src/java/com/android/ims/rcs/uce/request/UceRequestCoordinator.java index eea4fbe3..5d3a35da 100644 --- a/src/java/com/android/ims/rcs/uce/request/UceRequestCoordinator.java +++ b/src/java/com/android/ims/rcs/uce/request/UceRequestCoordinator.java @@ -20,6 +20,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.telephony.ims.RcsUceAdapter; +import android.telephony.ims.SipDetails; import android.util.Log; import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback; @@ -135,6 +136,15 @@ public abstract class UceRequestCoordinator { } /** + * Create a RequestResult that successfully completes the request. + * @param taskId the task id of the UceRequest + * @param details The SIP information related to this request. + */ + public static RequestResult createSuccessResult(long taskId, @Nullable SipDetails details) { + return new RequestResult(taskId, details); + } + + /** * Create a RequestResult for the failed request. * @param taskId the task id of the UceRequest * @param errorCode the error code of the failed request @@ -144,29 +154,66 @@ public abstract class UceRequestCoordinator { return new RequestResult(taskId, errorCode, retry); } + /** + * Create a RequestResult for the failed request. + * @param taskId the task id of the UceRequest + * @param errorCode the error code of the failed request + * @param retry When the request can be retried. + * @param details The SIP information related to this request. + */ + public static RequestResult createFailedResult(long taskId, int errorCode, long retry, + @Nullable SipDetails details) { + return new RequestResult(taskId, errorCode, retry, details); + } + private final Long mTaskId; private final Boolean mIsSuccess; private final Optional<Integer> mErrorCode; private final Optional<Long> mRetryMillis; + private final Optional<SipDetails> mSipDetails; /** * The private constructor for the successful request. */ private RequestResult(long taskId) { + this(taskId, null); + } + + /** + * The private constructor for the successful request. + */ + private RequestResult(long taskId, SipDetails details) { mTaskId = taskId; mIsSuccess = true; mErrorCode = Optional.empty(); mRetryMillis = Optional.empty(); + if (details == null) { + mSipDetails = Optional.empty(); + } else { + mSipDetails = Optional.ofNullable(details); + } } /** * The private constructor for the failed request. */ private RequestResult(long taskId, int errorCode, long retryMillis) { + this(taskId, errorCode, retryMillis, null); + } + + /** + * The private constructor for the failed request. + */ + private RequestResult(long taskId, int errorCode, long retryMillis, SipDetails details) { mTaskId = taskId; mIsSuccess = false; mErrorCode = Optional.of(errorCode); mRetryMillis = Optional.of(retryMillis); + if (details == null) { + mSipDetails = Optional.empty(); + } else { + mSipDetails = Optional.ofNullable(details); + } } public long getTaskId() { @@ -184,6 +231,10 @@ public abstract class UceRequestCoordinator { public Optional<Long> getRetryMillis() { return mRetryMillis; } + + public Optional<SipDetails> getSipDetails() { + return mSipDetails; + } } // The default capability error code. diff --git a/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java b/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java index 85908f0c..8ff39c1b 100644 --- a/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java +++ b/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java @@ -478,7 +478,7 @@ public class UceRequestManager { public void sendCapabilityRequest(List<Uri> uriList, boolean skipFromCache, IRcsUceControllerCallback callback) throws RemoteException { if (mIsDestroyed) { - callback.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L); + callback.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L, null); return; } sendRequestInternal(UceRequest.REQUEST_TYPE_CAPABILITY, uriList, skipFromCache, callback); @@ -490,7 +490,7 @@ public class UceRequestManager { public void sendAvailabilityRequest(Uri uri, IRcsUceControllerCallback callback) throws RemoteException { if (mIsDestroyed) { - callback.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L); + callback.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L, null); return; } sendRequestInternal(UceRequest.REQUEST_TYPE_AVAILABILITY, @@ -511,7 +511,7 @@ public class UceRequestManager { } if (nonCachedUris.isEmpty()) { logd("sendRequestInternal: shortcut complete, sending success result"); - callback.onComplete(); + callback.onComplete(null); return; } } @@ -525,7 +525,7 @@ public class UceRequestManager { if (requestCoordinator == null) { logw("sendRequestInternal: Neither Presence nor OPTIONS are supported"); - callback.onError(RcsUceAdapter.ERROR_NOT_ENABLED, 0L); + callback.onError(RcsUceAdapter.ERROR_NOT_ENABLED, 0L, null); return; } |