Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b3370f9 authored by James.cf Lin's avatar James.cf Lin Committed by James Lin
Browse files

Fix the OPTIONS request does not handle that the capabilities are retrieved from cache.

Bug: 187620915
Test: atest RcsUceAdaterTest ImsServiceTest
Change-Id: I0e05f5f6a0b0e543cc498beae8b2cb053b91a94d
parent 2ecae17d
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -320,7 +320,10 @@ public class EabControllerImpl implements EabController {
            builder.addCapabilityTuple(createPresenceTuple(contactUri, cursor));
            builderWrapper.setPresenceBuilder(builder);
        } else {
            builderWrapper.setOptionsBuilder(new OptionsBuilder(contactUri));
            OptionsBuilder builder = new OptionsBuilder(contactUri, SOURCE_TYPE_CACHED);
            builder.setRequestResult(result);
            builder.addFeatureTag(createOptionTuple(cursor));
            builderWrapper.setOptionsBuilder(builder);
        }
        return builderWrapper;
    }
+3 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.ims.rcs.uce.presence.publish;

import static android.telephony.ims.RcsContactUceCapability.SOURCE_TYPE_CACHED;

import android.content.Context;
import android.net.Uri;
import android.telecom.TelecomManager;
@@ -460,7 +462,7 @@ public class DeviceCapabilityInfo {

        Set<String> capableFromReg = mServiceCapRegTracker.copyRegistrationFeatureTags();

        OptionsBuilder optionsBuilder = new OptionsBuilder(uri);
        OptionsBuilder optionsBuilder = new OptionsBuilder(uri, SOURCE_TYPE_CACHED);
        optionsBuilder.setRequestResult(RcsContactUceCapability.REQUEST_RESULT_FOUND);
        FeatureTags.addFeatureTags(optionsBuilder, hasVolteCapability(), hasVtCapability(),
                isPresenceCapable(), hasCallComposerCapability(), capableFromReg);
+6 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.ims.rcs.uce.request;

import static android.telephony.ims.RcsContactUceCapability.SOURCE_TYPE_NETWORK;

import android.annotation.NonNull;
import android.net.Uri;
import android.os.RemoteException;
@@ -144,6 +146,9 @@ public class OptionsRequest extends CapabilityRequest {
        mRequestManagerCallback.notifyNetworkResponse(mCoordinatorId, mTaskId);
    }

    /**
     * Convert the remote capabilities from string list type to RcsContactUceCapability.
     */
    private RcsContactUceCapability getContactCapabilities(Uri contact, int sipCode,
            Set<String> featureTags) {
        int requestResult = RcsContactUceCapability.REQUEST_RESULT_FOUND;
@@ -166,7 +171,7 @@ public class OptionsRequest extends CapabilityRequest {
        }

        RcsContactUceCapability.OptionsBuilder optionsBuilder
                = new RcsContactUceCapability.OptionsBuilder(contact);
                = new RcsContactUceCapability.OptionsBuilder(contact, SOURCE_TYPE_NETWORK);
        optionsBuilder.setRequestResult(requestResult);
        optionsBuilder.addFeatureTags(featureTags);
        return optionsBuilder.build();
+49 −2
Original line number Diff line number Diff line
@@ -92,6 +92,10 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
        }
    };

    // The RequestResult creator for does not need to request from the network.
    private static final RequestResultCreator sNotNeedRequestFromNetworkCreator =
            (taskId, response) -> RequestResult.createSuccessResult(taskId);

    // The callback to notify the result of the capabilities request.
    private IRcsUceControllerCallback mCapabilitiesCallback;

@@ -121,7 +125,9 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
            return;
        }

        logd("onRequestUpdated: taskId=" + taskId + ", event=" + REQUEST_EVENT_DESC.get(event));
        logd("onRequestUpdated(OptionsRequest): taskId=" + taskId + ", event=" +
                REQUEST_EVENT_DESC.get(event));

        switch (event) {
            case REQUEST_UPDATE_ERROR:
                handleRequestError(request);
@@ -132,6 +138,11 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
            case REQUEST_UPDATE_NETWORK_RESPONSE:
                handleNetworkResponse(request);
                break;
            case REQUEST_UPDATE_CACHED_CAPABILITY_UPDATE:
                handleCachedCapabilityUpdated(request);
                break;
            case REQUEST_UPDATE_NO_NEED_REQUEST_FROM_NETWORK:
                handleNoNeedRequestFromNetwork(request);
            default:
                logw("onRequestUpdated: invalid event " + event);
                break;
@@ -199,6 +210,42 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
        moveRequestToFinishedCollection(taskId, requestResult);
    }

    /**
     * This method is called when the OptionsRequest retrieves the capabilities from cache.
     */
    private void handleCachedCapabilityUpdated(OptionsRequest request) {
        CapabilityRequestResponse response = request.getRequestResponse();
        Long taskId = request.getTaskId();
        List<RcsContactUceCapability> cachedCapList = response.getCachedContactCapability();
        logd("handleCachedCapabilityUpdated: taskId=" + taskId + ", CapRequestResp=" + response);

        if (cachedCapList.isEmpty()) {
            return;
        }

        // Trigger the capabilities updated callback.
        triggerCapabilitiesReceivedCallback(cachedCapList);
        response.removeCachedContactCapabilities();
    }

    /**
     * This method is called when all the capabilities can be retrieved from the cached and it does
     * not need to request capabilities from the network.
     */
    private void handleNoNeedRequestFromNetwork(OptionsRequest request) {
        CapabilityRequestResponse response = request.getRequestResponse();
        logd("handleNoNeedRequestFromNetwork: " + response.toString());

        // Finish this request.
        request.onFinish();

        // Remove this request from the activated collection and notify RequestManager.
        long taskId = request.getTaskId();
        RequestResult requestResult = sNotNeedRequestFromNetworkCreator.createRequestResult(taskId,
                response);
        moveRequestToFinishedCollection(taskId, requestResult);
    }

    /**
     * Trigger the capabilities updated callback.
     */
@@ -269,7 +316,7 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
            // Notify UceRequestManager to remove this instance from the collection.
            mRequestManagerCallback.notifyRequestCoordinatorFinished(mCoordinatorId);

            logd("checkAndFinishRequestCoordinator done, id=" + mCoordinatorId);
            logd("checkAndFinishRequestCoordinator(OptionsRequest) done, id=" + mCoordinatorId);
        }
    }

+2 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.ims.rcs.uce.request;

import static android.telephony.ims.RcsContactUceCapability.CAPABILITY_MECHANISM_OPTIONS;
import static android.telephony.ims.RcsContactUceCapability.SOURCE_TYPE_NETWORK;

import android.net.Uri;
import android.telephony.ims.RcsContactUceCapability;
@@ -172,7 +173,7 @@ public class RemoteOptionsRequest implements UceRequest {
        // Store the remote capabilities
        Uri contactUri = mUriList.get(0);
        RcsContactUceCapability remoteCaps = FeatureTags.getContactCapability(contactUri,
                mRemoteFeatureTags);
                SOURCE_TYPE_NETWORK, mRemoteFeatureTags);
        mRequestManagerCallback.saveCapabilities(Collections.singletonList(remoteCaps));

        // Get the device's capabilities and trigger the request callback
Loading