Merge "UCE OPTIONS APIs updated"

This commit is contained in:
James Lin 2021-03-23 18:47:44 +00:00 committed by Gerrit Code Review
commit fe4b99ee22
6 changed files with 70 additions and 16 deletions

View File

@ -11745,6 +11745,7 @@ package android.telephony.ims {
method @Nullable public android.telephony.ims.RcsContactPresenceTuple getCapabilityTuple(@NonNull String); method @Nullable public android.telephony.ims.RcsContactPresenceTuple getCapabilityTuple(@NonNull String);
method @NonNull public java.util.List<android.telephony.ims.RcsContactPresenceTuple> getCapabilityTuples(); method @NonNull public java.util.List<android.telephony.ims.RcsContactPresenceTuple> getCapabilityTuples();
method @NonNull public android.net.Uri getContactUri(); method @NonNull public android.net.Uri getContactUri();
method @NonNull public java.util.Set<java.lang.String> getFeatureTags();
method public int getRequestResult(); method public int getRequestResult();
method public int getSourceType(); method public int getSourceType();
method public void writeToParcel(@NonNull android.os.Parcel, int); method public void writeToParcel(@NonNull android.os.Parcel, int);
@ -11759,6 +11760,14 @@ package android.telephony.ims {
field public static final int SOURCE_TYPE_NETWORK = 0; // 0x0 field public static final int SOURCE_TYPE_NETWORK = 0; // 0x0
} }
public static final class RcsContactUceCapability.OptionsBuilder {
ctor public RcsContactUceCapability.OptionsBuilder(@NonNull android.net.Uri);
method @NonNull public android.telephony.ims.RcsContactUceCapability.OptionsBuilder addFeatureTag(@NonNull String);
method @NonNull public android.telephony.ims.RcsContactUceCapability.OptionsBuilder addFeatureTags(@NonNull java.util.Set<java.lang.String>);
method @NonNull public android.telephony.ims.RcsContactUceCapability build();
method @NonNull public android.telephony.ims.RcsContactUceCapability.OptionsBuilder setRequestResult(int);
}
public static final class RcsContactUceCapability.PresenceBuilder { public static final class RcsContactUceCapability.PresenceBuilder {
ctor public RcsContactUceCapability.PresenceBuilder(@NonNull android.net.Uri, int, int); ctor public RcsContactUceCapability.PresenceBuilder(@NonNull android.net.Uri, int, int);
method @NonNull public android.telephony.ims.RcsContactUceCapability.PresenceBuilder addCapabilityTuple(@NonNull android.telephony.ims.RcsContactPresenceTuple); method @NonNull public android.telephony.ims.RcsContactUceCapability.PresenceBuilder addCapabilityTuple(@NonNull android.telephony.ims.RcsContactPresenceTuple);
@ -12052,7 +12061,7 @@ package android.telephony.ims.feature {
package android.telephony.ims.stub { package android.telephony.ims.stub {
public interface CapabilityExchangeEventListener { public interface CapabilityExchangeEventListener {
method public void onRemoteCapabilityRequest(@NonNull android.net.Uri, @NonNull java.util.List<java.lang.String>, @NonNull android.telephony.ims.stub.CapabilityExchangeEventListener.OptionsRequestCallback) throws android.telephony.ims.ImsException; method public void onRemoteCapabilityRequest(@NonNull android.net.Uri, @NonNull java.util.Set<java.lang.String>, @NonNull android.telephony.ims.stub.CapabilityExchangeEventListener.OptionsRequestCallback) throws android.telephony.ims.ImsException;
method public void onRequestPublishCapabilities(int) throws android.telephony.ims.ImsException; method public void onRequestPublishCapabilities(int) throws android.telephony.ims.ImsException;
method public void onUnpublish() throws android.telephony.ims.ImsException; method public void onUnpublish() throws android.telephony.ims.ImsException;
} }
@ -12248,7 +12257,7 @@ package android.telephony.ims.stub {
public class RcsCapabilityExchangeImplBase { public class RcsCapabilityExchangeImplBase {
ctor public RcsCapabilityExchangeImplBase(@NonNull java.util.concurrent.Executor); ctor public RcsCapabilityExchangeImplBase(@NonNull java.util.concurrent.Executor);
method public void publishCapabilities(@NonNull String, @NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase.PublishResponseCallback); method public void publishCapabilities(@NonNull String, @NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase.PublishResponseCallback);
method public void sendOptionsCapabilityRequest(@NonNull android.net.Uri, @NonNull java.util.List<java.lang.String>, @NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase.OptionsResponseCallback); method public void sendOptionsCapabilityRequest(@NonNull android.net.Uri, @NonNull java.util.Set<java.lang.String>, @NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase.OptionsResponseCallback);
method public void subscribeForCapabilities(@NonNull java.util.Collection<android.net.Uri>, @NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase.SubscribeResponseCallback); method public void subscribeForCapabilities(@NonNull java.util.Collection<android.net.Uri>, @NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase.SubscribeResponseCallback);
field public static final int COMMAND_CODE_FETCH_ERROR = 3; // 0x3 field public static final int COMMAND_CODE_FETCH_ERROR = 3; // 0x3
field public static final int COMMAND_CODE_GENERIC_FAILURE = 1; // 0x1 field public static final int COMMAND_CODE_GENERIC_FAILURE = 1; // 0x1

View File

@ -29,7 +29,9 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* Contains the User Capability Exchange capabilities corresponding to a contact's URI. * Contains the User Capability Exchange capabilities corresponding to a contact's URI.
@ -110,7 +112,6 @@ public final class RcsContactUceCapability implements Parcelable {
/** /**
* Builder to help construct {@link RcsContactUceCapability} instances when capabilities were * Builder to help construct {@link RcsContactUceCapability} instances when capabilities were
* queried through SIP OPTIONS. * queried through SIP OPTIONS.
* @hide
*/ */
public static final class OptionsBuilder { public static final class OptionsBuilder {
@ -151,7 +152,7 @@ public final class RcsContactUceCapability implements Parcelable {
* @param tags the list of the supported feature tags * @param tags the list of the supported feature tags
* @return this OptionBuilder * @return this OptionBuilder
*/ */
public @NonNull OptionsBuilder addFeatureTags(@NonNull List<String> tags) { public @NonNull OptionsBuilder addFeatureTags(@NonNull Set<String> tags) {
mCapabilities.mFeatureTags.addAll(tags); mCapabilities.mFeatureTags.addAll(tags);
return this; return this;
} }
@ -220,7 +221,7 @@ public final class RcsContactUceCapability implements Parcelable {
private @CapabilityMechanism int mCapabilityMechanism; private @CapabilityMechanism int mCapabilityMechanism;
private @RequestResult int mRequestResult; private @RequestResult int mRequestResult;
private final List<String> mFeatureTags = new ArrayList<>(); private final Set<String> mFeatureTags = new HashSet<>();
private final List<RcsContactPresenceTuple> mPresenceTuples = new ArrayList<>(); private final List<RcsContactPresenceTuple> mPresenceTuples = new ArrayList<>();
private RcsContactUceCapability(@NonNull Uri contactUri, @CapabilityMechanism int mechanism, private RcsContactUceCapability(@NonNull Uri contactUri, @CapabilityMechanism int mechanism,
@ -235,7 +236,9 @@ public final class RcsContactUceCapability implements Parcelable {
mCapabilityMechanism = in.readInt(); mCapabilityMechanism = in.readInt();
mSourceType = in.readInt(); mSourceType = in.readInt();
mRequestResult = in.readInt(); mRequestResult = in.readInt();
in.readStringList(mFeatureTags); List<String> featureTagList = new ArrayList<>();
in.readStringList(featureTagList);
mFeatureTags.addAll(featureTagList);
in.readParcelableList(mPresenceTuples, RcsContactPresenceTuple.class.getClassLoader()); in.readParcelableList(mPresenceTuples, RcsContactPresenceTuple.class.getClassLoader());
} }
@ -245,7 +248,7 @@ public final class RcsContactUceCapability implements Parcelable {
out.writeInt(mCapabilityMechanism); out.writeInt(mCapabilityMechanism);
out.writeInt(mSourceType); out.writeInt(mSourceType);
out.writeInt(mRequestResult); out.writeInt(mRequestResult);
out.writeStringList(mFeatureTags); out.writeStringList(new ArrayList<>(mFeatureTags));
out.writeParcelableList(mPresenceTuples, flags); out.writeParcelableList(mPresenceTuples, flags);
} }
@ -285,7 +288,20 @@ public final class RcsContactUceCapability implements Parcelable {
if (mCapabilityMechanism != CAPABILITY_MECHANISM_OPTIONS) { if (mCapabilityMechanism != CAPABILITY_MECHANISM_OPTIONS) {
return Collections.emptyList(); return Collections.emptyList();
} }
return Collections.unmodifiableList(mFeatureTags); return Collections.unmodifiableList(new ArrayList<>(mFeatureTags));
}
/**
* @return The feature tags present in the OPTIONS response from the network.
* <p>
* Note: this is only populated if {@link #getCapabilityMechanism} is
* {@link RcsContactUceCapability#CAPABILITY_MECHANISM_OPTIONS}
*/
public @NonNull Set<String> getFeatureTags() {
if (mCapabilityMechanism != CAPABILITY_MECHANISM_OPTIONS) {
return Collections.emptySet();
}
return Collections.unmodifiableSet(mFeatureTags);
} }
/** /**

View File

@ -26,7 +26,8 @@ import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.stub.CapabilityExchangeEventListener; import android.telephony.ims.stub.CapabilityExchangeEventListener;
import android.util.Log; import android.util.Log;
import java.util.List; import java.util.ArrayList;
import java.util.Set;
/** /**
* The ICapabilityExchangeEventListener wrapper class to store the listener which is registered by * The ICapabilityExchangeEventListener wrapper class to store the listener which is registered by
@ -84,7 +85,7 @@ public class CapabilityExchangeAidlWrapper implements CapabilityExchangeEventLis
* request to the framework. * request to the framework.
*/ */
public void onRemoteCapabilityRequest(@NonNull Uri contactUri, public void onRemoteCapabilityRequest(@NonNull Uri contactUri,
@NonNull List<String> remoteCapabilities, @NonNull OptionsRequestCallback callback) @NonNull Set<String> remoteCapabilities, @NonNull OptionsRequestCallback callback)
throws ImsException { throws ImsException {
ICapabilityExchangeEventListener listener = mListenerBinder; ICapabilityExchangeEventListener listener = mListenerBinder;
if (listener == null) { if (listener == null) {
@ -114,7 +115,8 @@ public class CapabilityExchangeAidlWrapper implements CapabilityExchangeEventLis
}; };
try { try {
listener.onRemoteCapabilityRequest(contactUri, remoteCapabilities, internalCallback); listener.onRemoteCapabilityRequest(contactUri, new ArrayList<>(remoteCapabilities),
internalCallback);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.w(LOG_TAG, "Remote capability request exception: " + e); Log.w(LOG_TAG, "Remote capability request exception: " + e);
throw new ImsException("Remote is not available", throw new ImsException("Remote is not available",

View File

@ -47,6 +47,7 @@ import com.android.internal.telephony.util.TelephonyUtils;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@ -145,8 +146,8 @@ public class RcsFeature extends ImsFeature {
throws RemoteException { throws RemoteException {
OptionsResponseCallback callbackWrapper = new RcsOptionsResponseAidlWrapper(callback); OptionsResponseCallback callbackWrapper = new RcsOptionsResponseAidlWrapper(callback);
executeMethodAsync(() -> mReference.getCapabilityExchangeImplBaseInternal() executeMethodAsync(() -> mReference.getCapabilityExchangeImplBaseInternal()
.sendOptionsCapabilityRequest(contactUri, myCapabilities, callbackWrapper), .sendOptionsCapabilityRequest(contactUri, new HashSet<>(myCapabilities),
"sendOptionsCapabilityRequest"); callbackWrapper), "sendOptionsCapabilityRequest");
} }
// Call the methods with a clean calling identity on the executor and wait indefinitely for // Call the methods with a clean calling identity on the executor and wait indefinitely for

View File

@ -26,7 +26,7 @@ import android.telephony.ims.RcsUceAdapter;
import android.telephony.ims.feature.ImsFeature; import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.feature.RcsFeature; import android.telephony.ims.feature.RcsFeature;
import java.util.List; import java.util.Set;
/** /**
* The interface that is used by the framework to listen to events from the vendor RCS stack * The interface that is used by the framework to listen to events from the vendor RCS stack
@ -98,7 +98,8 @@ public interface CapabilityExchangeEventListener {
* {@link OptionsRequestCallback#onRespondToCapabilityRequestWithError}. * {@link OptionsRequestCallback#onRespondToCapabilityRequestWithError}.
* @param contactUri The URI associated with the remote contact that is * @param contactUri The URI associated with the remote contact that is
* requesting capabilities. * requesting capabilities.
* @param remoteCapabilities The remote contact's capability information. * @param remoteCapabilities The remote contact's capability information. The capability
* information is in the format defined in RCC.07 section 2.6.1.3.
* @param callback The callback of this request which is sent from the remote user. * @param callback The callback of this request which is sent from the remote user.
* @throws ImsException If this {@link RcsCapabilityExchangeImplBase} instance is not * @throws ImsException If this {@link RcsCapabilityExchangeImplBase} instance is not
* currently connected to the framework. This can happen if the {@link RcsFeature} is not * currently connected to the framework. This can happen if the {@link RcsFeature} is not
@ -107,6 +108,6 @@ public interface CapabilityExchangeEventListener {
* cases when the Telephony stack has crashed. * cases when the Telephony stack has crashed.
*/ */
void onRemoteCapabilityRequest(@NonNull Uri contactUri, void onRemoteCapabilityRequest(@NonNull Uri contactUri,
@NonNull List<String> remoteCapabilities, @NonNull Set<String> remoteCapabilities,
@NonNull OptionsRequestCallback callback) throws ImsException; @NonNull OptionsRequestCallback callback) throws ImsException;
} }

View File

@ -33,6 +33,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
/** /**
@ -433,6 +434,7 @@ public class RcsCapabilityExchangeImplBase {
* @param contactUri The URI of the remote user that we wish to get the capabilities of. * @param contactUri The URI of the remote user that we wish to get the capabilities of.
* @param myCapabilities The capabilities of this device to send to the remote user. * @param myCapabilities The capabilities of this device to send to the remote user.
* @param callback The callback of this request which is sent from the remote user. * @param callback The callback of this request which is sent from the remote user.
* @hide
*/ */
// executor used is defined in the constructor. // executor used is defined in the constructor.
@SuppressLint("ExecutorRegistration") @SuppressLint("ExecutorRegistration")
@ -446,4 +448,27 @@ public class RcsCapabilityExchangeImplBase {
// Do not do anything, this is a stub implementation. // Do not do anything, this is a stub implementation.
} }
} }
/**
* Push one's own capabilities to a remote user via the SIP OPTIONS presence exchange mechanism
* in order to receive the capabilities of the remote user in response.
* <p>
* The implementer must use {@link OptionsResponseCallback} to send the response of
* this query from the network back to the framework.
* @param contactUri The URI of the remote user that we wish to get the capabilities of.
* @param myCapabilities The capabilities of this device to send to the remote user.
* @param callback The callback of this request which is sent from the remote user.
*/
// executor used is defined in the constructor.
@SuppressLint("ExecutorRegistration")
public void sendOptionsCapabilityRequest(@NonNull Uri contactUri,
@NonNull Set<String> myCapabilities, @NonNull OptionsResponseCallback callback) {
// Stub - to be implemented by service
Log.w(LOG_TAG, "sendOptionsCapabilityRequest called with no implementation.");
try {
callback.onCommandError(COMMAND_CODE_NOT_SUPPORTED);
} catch (ImsException e) {
// Do not do anything, this is a stub implementation.
}
}
} }