Loading src/java/com/android/ims/rcs/uce/UceController.java +23 −0 Original line number Diff line number Diff line Loading @@ -79,11 +79,23 @@ public class UceController { */ List<EabCapabilityResult> getCapabilitiesFromCache(@NonNull List<Uri> uris); /** * Retrieve the capabilities associated with the given uris from the cache including * expired capabilities. */ List<EabCapabilityResult> getCapabilitiesFromCacheIncludingExpired(@NonNull List<Uri> uris); /** * Retrieve the contact's capabilities from the availability cache. */ EabCapabilityResult getAvailabilityFromCache(@NonNull Uri uri); /** * Retrieve the contact's capabilities from the availability cache including expired * capabilities */ EabCapabilityResult getAvailabilityFromCacheIncludingExpired(@NonNull Uri uri); /** * Store the given capabilities to the cache. */ Loading Loading @@ -506,11 +518,21 @@ public class UceController { return mEabController.getCapabilities(uris); } @Override public List<EabCapabilityResult> getCapabilitiesFromCacheIncludingExpired(List<Uri> uris) { return mEabController.getCapabilitiesIncludingExpired(uris); } @Override public EabCapabilityResult getAvailabilityFromCache(Uri contactUri) { return mEabController.getAvailability(contactUri); } @Override public EabCapabilityResult getAvailabilityFromCacheIncludingExpired(Uri contactUri) { return mEabController.getAvailabilityIncludingExpired(contactUri); } @Override public void saveCapabilities(List<RcsContactUceCapability> contactCapabilities) { mEabController.saveCapabilities(contactCapabilities); Loading Loading @@ -810,6 +832,7 @@ public class UceController { public void removeRequestDisallowedStatus() { logd("removeRequestDisallowedStatus"); mDeviceState.resetDeviceState(); mRequestManager.resetThrottlingList(); } /** Loading src/java/com/android/ims/rcs/uce/UceDeviceState.java +5 −7 Original line number Diff line number Diff line Loading @@ -258,14 +258,12 @@ public class UceDeviceState { if (requestType == UceController.REQUEST_TYPE_PUBLISH) { // Provisioning error for publish request. setDeviceState(DEVICE_STATE_PROVISION_ERROR); } else { setDeviceState(DEVICE_STATE_FORBIDDEN); } updateErrorCode(sipCode, reason, requestType); // There is no request retry time for SIP code 403 removeRequestRetryTime(); // No timer to exit the forbidden state. removeExitStateTimer(); } break; case NetworkSipCode.SIP_CODE_NOT_FOUND: // sip 404 Loading src/java/com/android/ims/rcs/uce/eab/EabController.java +12 −0 Original line number Diff line number Diff line Loading @@ -34,11 +34,23 @@ public interface EabController extends ControllerBase { */ @NonNull List<EabCapabilityResult> getCapabilities(@NonNull List<Uri> uris); /** * Get contact capabilities from cache including expired capabilities. * @param uris the uri list to get contact capabilities from cache. * @return The contact capabilities of the given uri list. */ @NonNull List<EabCapabilityResult> getCapabilitiesIncludingExpired(@NonNull List<Uri> uris); /** * Retrieve the contact's capabilities from the availability cache. */ @NonNull EabCapabilityResult getAvailability(@NonNull Uri contactUri); /** * Retrieve the contact's capabilities from the availability cache. */ @NonNull EabCapabilityResult getAvailabilityIncludingExpired(@NonNull Uri contactUri); /** * Save the capabilities to the EAB database. */ Loading src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java +87 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,7 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; /** Loading Loading @@ -165,6 +166,29 @@ public class EabControllerImpl implements EabController { return capabilityResultList; } /** * Retrieve the contacts' capabilities from the EAB database including expired capabilities. */ @Override public @NonNull List<EabCapabilityResult> getCapabilitiesIncludingExpired( @NonNull List<Uri> uris) { Objects.requireNonNull(uris); if (mIsSetDestroyedFlag) { Log.d(TAG, "EabController destroyed."); return generateDestroyedResult(uris); } Log.d(TAG, "getCapabilitiesIncludingExpired uri size=" + uris.size()); List<EabCapabilityResult> capabilityResultList = new ArrayList(); for (Uri uri : uris) { EabCapabilityResult result = generateEabResultIncludingExpired(uri, this::isCapabilityExpired); capabilityResultList.add(result); } return capabilityResultList; } /** * Retrieve the contact's capabilities from the availability cache. */ Loading @@ -181,6 +205,23 @@ public class EabControllerImpl implements EabController { return generateEabResult(contactUri, this::isAvailabilityExpired); } /** * Retrieve the contact's capabilities from the availability cache including expired * capabilities. */ @Override public @NonNull EabCapabilityResult getAvailabilityIncludingExpired(@NonNull Uri contactUri) { Objects.requireNonNull(contactUri); if (mIsSetDestroyedFlag) { Log.d(TAG, "EabController destroyed."); return new EabCapabilityResult( contactUri, EabCapabilityResult.EAB_CONTROLLER_DESTROYED_FAILURE, null); } return generateEabResultIncludingExpired(contactUri, this::isAvailabilityExpired); } /** * Update the availability catch and save the capabilities to the EAB database. */ Loading Loading @@ -299,6 +340,52 @@ public class EabControllerImpl implements EabController { return result; } private EabCapabilityResult generateEabResultIncludingExpired(Uri contactUri, Predicate<Cursor> isExpiredMethod) { RcsUceCapabilityBuilderWrapper builder = null; EabCapabilityResult result; Optional<Boolean> isExpired = Optional.empty(); // query EAB provider Uri queryUri = Uri.withAppendedPath( Uri.withAppendedPath(EabProvider.ALL_DATA_URI, String.valueOf(mSubId)), getNumberFromUri(mContext, contactUri)); Cursor cursor = mContext.getContentResolver().query(queryUri, null, null, null, null); if (cursor != null && cursor.getCount() != 0) { while (cursor.moveToNext()) { // Record whether it has expired. if (!isExpired.isPresent()) { isExpired = Optional.of(isExpiredMethod.test(cursor)); } if (builder == null) { builder = createNewBuilder(contactUri, cursor); } else { updateCapability(contactUri, cursor, builder); } } cursor.close(); // Determine the query result int eabResult = EabCapabilityResult.EAB_QUERY_SUCCESSFUL; if (isExpired.orElse(false)) { eabResult = EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE; } if (builder.getMechanism() == CAPABILITY_MECHANISM_PRESENCE) { PresenceBuilder presenceBuilder = builder.getPresenceBuilder(); result = new EabCapabilityResult(contactUri, eabResult, presenceBuilder.build()); } else { OptionsBuilder optionsBuilder = builder.getOptionsBuilder(); result = new EabCapabilityResult(contactUri, eabResult, optionsBuilder.build()); } } else { result = new EabCapabilityResult(contactUri, EabCapabilityResult.EAB_CONTACT_NOT_FOUND_FAILURE, null); } return result; } private void updateCapability(Uri contactUri, Cursor cursor, RcsUceCapabilityBuilderWrapper builderWrapper) { if (builderWrapper.getMechanism() == CAPABILITY_MECHANISM_PRESENCE) { Loading src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java +96 −9 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.util.Log; import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult; import com.android.ims.rcs.uce.eab.EabCapabilityResult; import com.android.ims.rcs.uce.presence.pidfparser.PidfParserUtils; import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback; import com.android.ims.rcs.uce.util.UceUtils; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -140,20 +141,36 @@ public abstract class CapabilityRequest implements UceRequest { return; } // Get the capabilities from the cache. final List<RcsContactUceCapability> cachedCapList = isSkipGettingFromCache() ? Collections.EMPTY_LIST : getCapabilitiesFromCache(); // Get the contact capabilities from the cache including the expired capabilities. final List<EabCapabilityResult> eabResultList = getCapabilitiesFromCache(); // Get all the unexpired capabilities from the EAB result list and add to the response. final List<RcsContactUceCapability> cachedCapList = isSkipGettingFromCache() ? Collections.EMPTY_LIST : getUnexpiredCapabilities(eabResultList); mRequestResponse.addCachedCapabilities(cachedCapList); logd("executeRequest: cached capabilities size=" + cachedCapList.size()); // Get the rest contacts which are not in the cache or has expired. final List<Uri> expiredUris = getRequestingFromNetworkUris(cachedCapList); // For those uris that are not in the cache or have expired, we should request their // capabilities from the network. However, we still need to check whether these contacts // are in the throttling list. If the contact is in the throttling list, even if it has // expired, we will get the cached capabilities. final List<RcsContactUceCapability> throttlingUris = getFromThrottlingList(expiredUris, eabResultList); mRequestResponse.addCachedCapabilities(throttlingUris); logd("executeRequest: contacts in throttling list size=" + throttlingUris.size()); // Notify that the cached capabilities are updated. if (!cachedCapList.isEmpty()) { if (!cachedCapList.isEmpty() || !throttlingUris.isEmpty()) { mRequestManagerCallback.notifyCachedCapabilitiesUpdated(mCoordinatorId, mTaskId); } // Get the rest contacts which need to request capabilities from the network. final List<Uri> requestCapUris = getRequestingFromNetworkUris(cachedCapList); List<Uri> requestCapUris = getRequestingFromNetworkUris(cachedCapList, throttlingUris); logd("executeRequest: requestCapUris size=" + requestCapUris.size()); Loading Loading @@ -193,21 +210,30 @@ public abstract class CapabilityRequest implements UceRequest { } // Get the cached capabilities by the given request type. private List<RcsContactUceCapability> getCapabilitiesFromCache() { private List<EabCapabilityResult> getCapabilitiesFromCache() { List<EabCapabilityResult> resultList = null; if (mRequestType == REQUEST_TYPE_CAPABILITY) { resultList = mRequestManagerCallback.getCapabilitiesFromCache(mUriList); resultList = mRequestManagerCallback.getCapabilitiesFromCacheIncludingExpired(mUriList); } else if (mRequestType == REQUEST_TYPE_AVAILABILITY) { // Always get the first element if the request type is availability. Uri uri = mUriList.get(0); EabCapabilityResult eabResult = mRequestManagerCallback.getAvailabilityFromCache(uri); EabCapabilityResult eabResult = mRequestManagerCallback.getAvailabilityFromCacheIncludingExpired(uri); resultList = new ArrayList<>(); resultList.add(eabResult); } if (resultList == null) { return Collections.emptyList(); } return resultList.stream() return resultList; } /** * Get the unexpired contact capabilities from the given EAB result list. * @param list the query result from the EAB */ private List<RcsContactUceCapability> getUnexpiredCapabilities(List<EabCapabilityResult> list) { return list.stream() .filter(Objects::nonNull) .filter(result -> result.getStatus() == EabCapabilityResult.EAB_QUERY_SUCCESSFUL) .map(EabCapabilityResult::getContactCapabilities) Loading @@ -226,6 +252,67 @@ public abstract class CapabilityRequest implements UceRequest { .collect(Collectors.toList()); } /** * Get the contact uris which cannot retrieve capabilities from the cache. * @param cachedCapList The capabilities which are already stored in the cache. * @param throttlingUris The capabilities which are in the throttling list. */ private List<Uri> getRequestingFromNetworkUris(List<RcsContactUceCapability> cachedCapList, List<RcsContactUceCapability> throttlingUris) { // We won't request the network query for those contacts in the cache and in the // throttling list. Merging the two list and get the rest contact uris. List<RcsContactUceCapability> notNetworkQueryList = new ArrayList<>(cachedCapList); notNetworkQueryList.addAll(throttlingUris); return getRequestingFromNetworkUris(notNetworkQueryList); } /** * Get the contact capabilities for those uri are in the throttling list. If the contact uri is * in the throttling list, the capabilities will be retrieved from cache even if it has expired. * If the capabilities cannot be found, return the non-RCS contact capabilities instead. * @param expiredUris the expired/unknown uris to check whether are in the throttling list * @return the contact capabilities for the uris are in the throttling list */ private List<RcsContactUceCapability> getFromThrottlingList(final List<Uri> expiredUris, final List<EabCapabilityResult> eabResultList) { List<RcsContactUceCapability> resultList = new ArrayList<>(); List<RcsContactUceCapability> notFoundFromCacheList = new ArrayList<>(); // Retrieve the uris put in the throttling list from the expired/unknown contacts. List<Uri> throttlingUris = mRequestManagerCallback.getInThrottlingListUris(expiredUris); // For these uris in the throttling list, check whether their capabilities are in the cache. List<EabCapabilityResult> throttlingUriFoundInEab = new ArrayList<>(); for (Uri uri : throttlingUris) { for (EabCapabilityResult eabResult : eabResultList) { if (eabResult.getContact().equals(uri)) { throttlingUriFoundInEab.add(eabResult); break; } } } throttlingUriFoundInEab.forEach(eabResult -> { if (eabResult.getStatus() == EabCapabilityResult.EAB_QUERY_SUCCESSFUL || eabResult.getStatus() == EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE) { // The capabilities are found, add to the result list resultList.add(eabResult.getContactCapabilities()); } else { // Cannot get the capabilities from cache, create the non-RCS capabilities instead. notFoundFromCacheList.add(PidfParserUtils.getNotFoundContactCapabilities( eabResult.getContact())); } }); if (!notFoundFromCacheList.isEmpty()) { resultList.addAll(notFoundFromCacheList); } logd("getFromThrottlingList: requesting uris in the list size=" + throttlingUris.size() + ", generate non-RCS size=" + notFoundFromCacheList.size()); return resultList; } /** * Set the timeout timer of this request. */ Loading Loading
src/java/com/android/ims/rcs/uce/UceController.java +23 −0 Original line number Diff line number Diff line Loading @@ -79,11 +79,23 @@ public class UceController { */ List<EabCapabilityResult> getCapabilitiesFromCache(@NonNull List<Uri> uris); /** * Retrieve the capabilities associated with the given uris from the cache including * expired capabilities. */ List<EabCapabilityResult> getCapabilitiesFromCacheIncludingExpired(@NonNull List<Uri> uris); /** * Retrieve the contact's capabilities from the availability cache. */ EabCapabilityResult getAvailabilityFromCache(@NonNull Uri uri); /** * Retrieve the contact's capabilities from the availability cache including expired * capabilities */ EabCapabilityResult getAvailabilityFromCacheIncludingExpired(@NonNull Uri uri); /** * Store the given capabilities to the cache. */ Loading Loading @@ -506,11 +518,21 @@ public class UceController { return mEabController.getCapabilities(uris); } @Override public List<EabCapabilityResult> getCapabilitiesFromCacheIncludingExpired(List<Uri> uris) { return mEabController.getCapabilitiesIncludingExpired(uris); } @Override public EabCapabilityResult getAvailabilityFromCache(Uri contactUri) { return mEabController.getAvailability(contactUri); } @Override public EabCapabilityResult getAvailabilityFromCacheIncludingExpired(Uri contactUri) { return mEabController.getAvailabilityIncludingExpired(contactUri); } @Override public void saveCapabilities(List<RcsContactUceCapability> contactCapabilities) { mEabController.saveCapabilities(contactCapabilities); Loading Loading @@ -810,6 +832,7 @@ public class UceController { public void removeRequestDisallowedStatus() { logd("removeRequestDisallowedStatus"); mDeviceState.resetDeviceState(); mRequestManager.resetThrottlingList(); } /** Loading
src/java/com/android/ims/rcs/uce/UceDeviceState.java +5 −7 Original line number Diff line number Diff line Loading @@ -258,14 +258,12 @@ public class UceDeviceState { if (requestType == UceController.REQUEST_TYPE_PUBLISH) { // Provisioning error for publish request. setDeviceState(DEVICE_STATE_PROVISION_ERROR); } else { setDeviceState(DEVICE_STATE_FORBIDDEN); } updateErrorCode(sipCode, reason, requestType); // There is no request retry time for SIP code 403 removeRequestRetryTime(); // No timer to exit the forbidden state. removeExitStateTimer(); } break; case NetworkSipCode.SIP_CODE_NOT_FOUND: // sip 404 Loading
src/java/com/android/ims/rcs/uce/eab/EabController.java +12 −0 Original line number Diff line number Diff line Loading @@ -34,11 +34,23 @@ public interface EabController extends ControllerBase { */ @NonNull List<EabCapabilityResult> getCapabilities(@NonNull List<Uri> uris); /** * Get contact capabilities from cache including expired capabilities. * @param uris the uri list to get contact capabilities from cache. * @return The contact capabilities of the given uri list. */ @NonNull List<EabCapabilityResult> getCapabilitiesIncludingExpired(@NonNull List<Uri> uris); /** * Retrieve the contact's capabilities from the availability cache. */ @NonNull EabCapabilityResult getAvailability(@NonNull Uri contactUri); /** * Retrieve the contact's capabilities from the availability cache. */ @NonNull EabCapabilityResult getAvailabilityIncludingExpired(@NonNull Uri contactUri); /** * Save the capabilities to the EAB database. */ Loading
src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java +87 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,7 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; /** Loading Loading @@ -165,6 +166,29 @@ public class EabControllerImpl implements EabController { return capabilityResultList; } /** * Retrieve the contacts' capabilities from the EAB database including expired capabilities. */ @Override public @NonNull List<EabCapabilityResult> getCapabilitiesIncludingExpired( @NonNull List<Uri> uris) { Objects.requireNonNull(uris); if (mIsSetDestroyedFlag) { Log.d(TAG, "EabController destroyed."); return generateDestroyedResult(uris); } Log.d(TAG, "getCapabilitiesIncludingExpired uri size=" + uris.size()); List<EabCapabilityResult> capabilityResultList = new ArrayList(); for (Uri uri : uris) { EabCapabilityResult result = generateEabResultIncludingExpired(uri, this::isCapabilityExpired); capabilityResultList.add(result); } return capabilityResultList; } /** * Retrieve the contact's capabilities from the availability cache. */ Loading @@ -181,6 +205,23 @@ public class EabControllerImpl implements EabController { return generateEabResult(contactUri, this::isAvailabilityExpired); } /** * Retrieve the contact's capabilities from the availability cache including expired * capabilities. */ @Override public @NonNull EabCapabilityResult getAvailabilityIncludingExpired(@NonNull Uri contactUri) { Objects.requireNonNull(contactUri); if (mIsSetDestroyedFlag) { Log.d(TAG, "EabController destroyed."); return new EabCapabilityResult( contactUri, EabCapabilityResult.EAB_CONTROLLER_DESTROYED_FAILURE, null); } return generateEabResultIncludingExpired(contactUri, this::isAvailabilityExpired); } /** * Update the availability catch and save the capabilities to the EAB database. */ Loading Loading @@ -299,6 +340,52 @@ public class EabControllerImpl implements EabController { return result; } private EabCapabilityResult generateEabResultIncludingExpired(Uri contactUri, Predicate<Cursor> isExpiredMethod) { RcsUceCapabilityBuilderWrapper builder = null; EabCapabilityResult result; Optional<Boolean> isExpired = Optional.empty(); // query EAB provider Uri queryUri = Uri.withAppendedPath( Uri.withAppendedPath(EabProvider.ALL_DATA_URI, String.valueOf(mSubId)), getNumberFromUri(mContext, contactUri)); Cursor cursor = mContext.getContentResolver().query(queryUri, null, null, null, null); if (cursor != null && cursor.getCount() != 0) { while (cursor.moveToNext()) { // Record whether it has expired. if (!isExpired.isPresent()) { isExpired = Optional.of(isExpiredMethod.test(cursor)); } if (builder == null) { builder = createNewBuilder(contactUri, cursor); } else { updateCapability(contactUri, cursor, builder); } } cursor.close(); // Determine the query result int eabResult = EabCapabilityResult.EAB_QUERY_SUCCESSFUL; if (isExpired.orElse(false)) { eabResult = EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE; } if (builder.getMechanism() == CAPABILITY_MECHANISM_PRESENCE) { PresenceBuilder presenceBuilder = builder.getPresenceBuilder(); result = new EabCapabilityResult(contactUri, eabResult, presenceBuilder.build()); } else { OptionsBuilder optionsBuilder = builder.getOptionsBuilder(); result = new EabCapabilityResult(contactUri, eabResult, optionsBuilder.build()); } } else { result = new EabCapabilityResult(contactUri, EabCapabilityResult.EAB_CONTACT_NOT_FOUND_FAILURE, null); } return result; } private void updateCapability(Uri contactUri, Cursor cursor, RcsUceCapabilityBuilderWrapper builderWrapper) { if (builderWrapper.getMechanism() == CAPABILITY_MECHANISM_PRESENCE) { Loading
src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java +96 −9 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.util.Log; import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult; import com.android.ims.rcs.uce.eab.EabCapabilityResult; import com.android.ims.rcs.uce.presence.pidfparser.PidfParserUtils; import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback; import com.android.ims.rcs.uce.util.UceUtils; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -140,20 +141,36 @@ public abstract class CapabilityRequest implements UceRequest { return; } // Get the capabilities from the cache. final List<RcsContactUceCapability> cachedCapList = isSkipGettingFromCache() ? Collections.EMPTY_LIST : getCapabilitiesFromCache(); // Get the contact capabilities from the cache including the expired capabilities. final List<EabCapabilityResult> eabResultList = getCapabilitiesFromCache(); // Get all the unexpired capabilities from the EAB result list and add to the response. final List<RcsContactUceCapability> cachedCapList = isSkipGettingFromCache() ? Collections.EMPTY_LIST : getUnexpiredCapabilities(eabResultList); mRequestResponse.addCachedCapabilities(cachedCapList); logd("executeRequest: cached capabilities size=" + cachedCapList.size()); // Get the rest contacts which are not in the cache or has expired. final List<Uri> expiredUris = getRequestingFromNetworkUris(cachedCapList); // For those uris that are not in the cache or have expired, we should request their // capabilities from the network. However, we still need to check whether these contacts // are in the throttling list. If the contact is in the throttling list, even if it has // expired, we will get the cached capabilities. final List<RcsContactUceCapability> throttlingUris = getFromThrottlingList(expiredUris, eabResultList); mRequestResponse.addCachedCapabilities(throttlingUris); logd("executeRequest: contacts in throttling list size=" + throttlingUris.size()); // Notify that the cached capabilities are updated. if (!cachedCapList.isEmpty()) { if (!cachedCapList.isEmpty() || !throttlingUris.isEmpty()) { mRequestManagerCallback.notifyCachedCapabilitiesUpdated(mCoordinatorId, mTaskId); } // Get the rest contacts which need to request capabilities from the network. final List<Uri> requestCapUris = getRequestingFromNetworkUris(cachedCapList); List<Uri> requestCapUris = getRequestingFromNetworkUris(cachedCapList, throttlingUris); logd("executeRequest: requestCapUris size=" + requestCapUris.size()); Loading Loading @@ -193,21 +210,30 @@ public abstract class CapabilityRequest implements UceRequest { } // Get the cached capabilities by the given request type. private List<RcsContactUceCapability> getCapabilitiesFromCache() { private List<EabCapabilityResult> getCapabilitiesFromCache() { List<EabCapabilityResult> resultList = null; if (mRequestType == REQUEST_TYPE_CAPABILITY) { resultList = mRequestManagerCallback.getCapabilitiesFromCache(mUriList); resultList = mRequestManagerCallback.getCapabilitiesFromCacheIncludingExpired(mUriList); } else if (mRequestType == REQUEST_TYPE_AVAILABILITY) { // Always get the first element if the request type is availability. Uri uri = mUriList.get(0); EabCapabilityResult eabResult = mRequestManagerCallback.getAvailabilityFromCache(uri); EabCapabilityResult eabResult = mRequestManagerCallback.getAvailabilityFromCacheIncludingExpired(uri); resultList = new ArrayList<>(); resultList.add(eabResult); } if (resultList == null) { return Collections.emptyList(); } return resultList.stream() return resultList; } /** * Get the unexpired contact capabilities from the given EAB result list. * @param list the query result from the EAB */ private List<RcsContactUceCapability> getUnexpiredCapabilities(List<EabCapabilityResult> list) { return list.stream() .filter(Objects::nonNull) .filter(result -> result.getStatus() == EabCapabilityResult.EAB_QUERY_SUCCESSFUL) .map(EabCapabilityResult::getContactCapabilities) Loading @@ -226,6 +252,67 @@ public abstract class CapabilityRequest implements UceRequest { .collect(Collectors.toList()); } /** * Get the contact uris which cannot retrieve capabilities from the cache. * @param cachedCapList The capabilities which are already stored in the cache. * @param throttlingUris The capabilities which are in the throttling list. */ private List<Uri> getRequestingFromNetworkUris(List<RcsContactUceCapability> cachedCapList, List<RcsContactUceCapability> throttlingUris) { // We won't request the network query for those contacts in the cache and in the // throttling list. Merging the two list and get the rest contact uris. List<RcsContactUceCapability> notNetworkQueryList = new ArrayList<>(cachedCapList); notNetworkQueryList.addAll(throttlingUris); return getRequestingFromNetworkUris(notNetworkQueryList); } /** * Get the contact capabilities for those uri are in the throttling list. If the contact uri is * in the throttling list, the capabilities will be retrieved from cache even if it has expired. * If the capabilities cannot be found, return the non-RCS contact capabilities instead. * @param expiredUris the expired/unknown uris to check whether are in the throttling list * @return the contact capabilities for the uris are in the throttling list */ private List<RcsContactUceCapability> getFromThrottlingList(final List<Uri> expiredUris, final List<EabCapabilityResult> eabResultList) { List<RcsContactUceCapability> resultList = new ArrayList<>(); List<RcsContactUceCapability> notFoundFromCacheList = new ArrayList<>(); // Retrieve the uris put in the throttling list from the expired/unknown contacts. List<Uri> throttlingUris = mRequestManagerCallback.getInThrottlingListUris(expiredUris); // For these uris in the throttling list, check whether their capabilities are in the cache. List<EabCapabilityResult> throttlingUriFoundInEab = new ArrayList<>(); for (Uri uri : throttlingUris) { for (EabCapabilityResult eabResult : eabResultList) { if (eabResult.getContact().equals(uri)) { throttlingUriFoundInEab.add(eabResult); break; } } } throttlingUriFoundInEab.forEach(eabResult -> { if (eabResult.getStatus() == EabCapabilityResult.EAB_QUERY_SUCCESSFUL || eabResult.getStatus() == EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE) { // The capabilities are found, add to the result list resultList.add(eabResult.getContactCapabilities()); } else { // Cannot get the capabilities from cache, create the non-RCS capabilities instead. notFoundFromCacheList.add(PidfParserUtils.getNotFoundContactCapabilities( eabResult.getContact())); } }); if (!notFoundFromCacheList.isEmpty()) { resultList.addAll(notFoundFromCacheList); } logd("getFromThrottlingList: requesting uris in the list size=" + throttlingUris.size() + ", generate non-RCS size=" + notFoundFromCacheList.size()); return resultList; } /** * Set the timeout timer of this request. */ Loading