aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-15 21:47:57 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-15 21:47:57 +0000
commitabd36879c4a8da43ecfa32ab232dc30efb049941 (patch)
treec453c84db4ad6173d359006761f9beddded5d97b
parentc812bd6bdf4af2ba9b88a0997810c9cf65647643 (diff)
parentcbaaf03b8515fb290528f5892a78f8a8c309f34e (diff)
downloadims-aml_tz3_314012070.tar.gz
Change-Id: Ia81c29c3b9640be99ede4b32d385d8c7fc6a7e7f
-rw-r--r--Android.bp29
-rw-r--r--LICENSE_BSD26
-rw-r--r--TEST_MAPPING8
-rw-r--r--src/java/com/android/ims/FeatureConnection.java10
-rw-r--r--src/java/com/android/ims/FeatureConnector.java18
-rw-r--r--src/java/com/android/ims/FeatureUpdates.java3
-rwxr-xr-xsrc/java/com/android/ims/ImsCall.java14
-rw-r--r--src/java/com/android/ims/ImsCallbackAdapterManager.java187
-rw-r--r--src/java/com/android/ims/ImsEcbmStateListener.java36
-rw-r--r--src/java/com/android/ims/ImsExternalCallStateListener.java26
-rw-r--r--src/java/com/android/ims/ImsFeatureBinderRepository.java28
-rw-r--r--src/java/com/android/ims/ImsManager.java274
-rw-r--r--src/java/com/android/ims/ImsUt.java98
-rw-r--r--src/java/com/android/ims/MmTelFeatureConnection.java45
-rw-r--r--src/java/com/android/ims/RcsFeatureConnection.java14
-rw-r--r--src/java/com/android/ims/RcsFeatureManager.java21
-rw-r--r--src/java/com/android/ims/rcs/uce/UceController.java86
-rw-r--r--src/java/com/android/ims/rcs/uce/UceDeviceState.java49
-rw-r--r--src/java/com/android/ims/rcs/uce/UceStatsWriter.java263
-rw-r--r--src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java58
-rw-r--r--src/java/com/android/ims/rcs/uce/eab/EabController.java12
-rw-r--r--src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java229
-rw-r--r--src/java/com/android/ims/rcs/uce/eab/EabProvider.java18
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java44
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils.java10
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapper.java119
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Presence.java24
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Tuple.java11
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java36
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java45
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/PublishController.java27
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java277
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java86
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessorState.java10
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java39
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker.java25
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/PublishUtils.java75
-rw-r--r--src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java30
-rw-r--r--src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java105
-rw-r--r--src/java/com/android/ims/rcs/uce/request/ContactThrottlingList.java119
-rw-r--r--src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java25
-rw-r--r--src/java/com/android/ims/rcs/uce/request/RemoteOptionsCoordinator.java20
-rw-r--r--src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java44
-rw-r--r--src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java106
-rw-r--r--src/java/com/android/ims/rcs/uce/request/UceRequestManager.java194
-rw-r--r--src/java/com/android/ims/rcs/uce/util/FeatureTags.java3
-rw-r--r--src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java2
-rw-r--r--src/java/com/android/ims/rcs/uce/util/UceUtils.java65
-rw-r--r--tests/src/com/android/ims/FeatureConnectionTest.java7
-rw-r--r--tests/src/com/android/ims/FeatureConnectorTest.java102
-rw-r--r--tests/src/com/android/ims/ImsFeatureBinderRepositoryTest.java60
-rw-r--r--tests/src/com/android/ims/ImsManagerTest.java288
-rw-r--r--tests/src/com/android/ims/ImsUtTest.java4
-rw-r--r--tests/src/com/android/ims/MmTelFeatureConnectionTest.java204
-rw-r--r--tests/src/com/android/ims/rcs/uce/UceControllerTest.java12
-rw-r--r--tests/src/com/android/ims/rcs/uce/UceStatsWriterTest.java292
-rw-r--r--tests/src/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdaterTest.java29
-rw-r--r--tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java97
-rw-r--r--tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java3
-rw-r--r--tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java22
-rw-r--r--tests/src/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapperTest.java74
-rw-r--r--tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/PresenceTest.java90
-rw-r--r--tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/TupleTest.java5
-rw-r--r--tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfoTest.java149
-rw-r--r--tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java105
-rw-r--r--tests/src/com/android/ims/rcs/uce/presence/publish/PublishControllerImplTest.java209
-rw-r--r--tests/src/com/android/ims/rcs/uce/presence/publish/PublishProcessorTest.java52
-rw-r--r--tests/src/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTrackerTest.java37
-rw-r--r--tests/src/com/android/ims/rcs/uce/request/CapabilityRequestTest.java9
-rw-r--r--tests/src/com/android/ims/rcs/uce/request/OptionsCoordinatorTest.java14
-rw-r--r--tests/src/com/android/ims/rcs/uce/request/RemoteOptionsCoordinatorTest.java6
-rw-r--r--tests/src/com/android/ims/rcs/uce/request/SubscribeCoordinatorTest.java56
-rw-r--r--tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java114
73 files changed, 957 insertions, 4176 deletions
diff --git a/Android.bp b/Android.bp
index dea49d7d..6b78ebbe 100644
--- a/Android.bp
+++ b/Android.bp
@@ -13,18 +13,31 @@
// limitations under the License.
package {
- // See: http://go/android-license-faq
- default_applicable_licenses: [
- "frameworks_opt_net_ims_license",
- "Android-Apache-2.0",
- ],
+ default_applicable_licenses: ["frameworks_opt_net_ims_license"],
}
+// Added automatically by a large-scale-change that took the approach of
+// 'apply every license found to every target'. While this makes sure we respect
+// every license restriction, it may not be entirely correct.
+//
+// e.g. GPL in an MIT project might only apply to the contrib/ directory.
+//
+// Please consider splitting the single license below into multiple licenses,
+// taking care not to lose any license_kind information, and overriding the
+// default license using the 'licenses: [...]' property on targets as needed.
+//
+// For unused files, consider creating a 'fileGroup' with "//visibility:private"
+// to attach the license to, and including a comment whether the files may be
+// used in the current project.
+// See: http://go/android-license-faq
license {
name: "frameworks_opt_net_ims_license",
- package_name: "Android IMS",
- license_kinds: ["SPDX-license-identifier-BSD"],
- license_text: ["LICENSE_BSD"],
+ visibility: [":__subpackages__"],
+ license_kinds: [
+ "SPDX-license-identifier-Apache-2.0",
+ "SPDX-license-identifier-BSD",
+ ],
+ // large-scale-change unable to identify any license_text files
}
java_library {
diff --git a/LICENSE_BSD b/LICENSE_BSD
deleted file mode 100644
index 47664b8a..00000000
--- a/LICENSE_BSD
+++ /dev/null
@@ -1,26 +0,0 @@
- Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of The Linux Foundation nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/TEST_MAPPING b/TEST_MAPPING
index edb25a6f..4b2fe34b 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -7,14 +7,6 @@
"exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
- },
- {
- "name": "TeleServiceTests",
- "options": [
- {
- "exclude-annotation": "androidx.test.filters.FlakyTest"
- }
- ]
}
]
}
diff --git a/src/java/com/android/ims/FeatureConnection.java b/src/java/com/android/ims/FeatureConnection.java
index 6fee444b..748ae577 100644
--- a/src/java/com/android/ims/FeatureConnection.java
+++ b/src/java/com/android/ims/FeatureConnection.java
@@ -43,7 +43,6 @@ public abstract class FeatureConnection {
protected static boolean sImsSupportedOnDevice = true;
protected final int mSlotId;
- protected final int mSubId;
protected Context mContext;
protected IBinder mBinder;
@@ -57,10 +56,9 @@ public abstract class FeatureConnection {
private final ISipTransport mSipTransportBinder;
protected final Object mLock = new Object();
- public FeatureConnection(Context context, int slotId, int subId, IImsConfig c,
- IImsRegistration r, ISipTransport s) {
+ public FeatureConnection(Context context, int slotId, IImsConfig c, IImsRegistration r,
+ ISipTransport s) {
mSlotId = slotId;
- mSubId = subId;
mContext = context;
mRegistrationBinder = r;
mConfigBinder = c;
@@ -225,10 +223,6 @@ public abstract class FeatureConnection {
return state;
}
- public int getSubId() {
- return mSubId;
- }
-
/**
* Internal method used to retrieve the feature status from the corresponding ImsService.
*/
diff --git a/src/java/com/android/ims/FeatureConnector.java b/src/java/com/android/ims/FeatureConnector.java
index 32674d9c..19e21511 100644
--- a/src/java/com/android/ims/FeatureConnector.java
+++ b/src/java/com/android/ims/FeatureConnector.java
@@ -104,7 +104,7 @@ public class FeatureConnector<U extends FeatureUpdates> {
/**
* ImsFeature manager is connected to the underlying IMS implementation.
*/
- void connectionReady(U manager, int subId) throws ImsException;
+ void connectionReady(U manager) throws ImsException;
/**
* The underlying IMS implementation is unavailable and can not be used to communicate.
@@ -115,15 +115,15 @@ public class FeatureConnector<U extends FeatureUpdates> {
private final IImsServiceFeatureCallback mCallback = new IImsServiceFeatureCallback.Stub() {
@Override
- public void imsFeatureCreated(ImsFeatureContainer c, int subId) {
- log("imsFeatureCreated: " + c + ", subId: " + subId);
+ public void imsFeatureCreated(ImsFeatureContainer c) {
+ log("imsFeatureCreated: " + c);
synchronized (mLock) {
- mManager.associate(c, subId);
+ mManager.associate(c);
mManager.updateFeatureCapabilities(c.getCapabilities());
mDisconnectedReason = null;
}
// Notifies executor, so notify outside of lock
- imsStatusChanged(c.getState(), subId);
+ imsStatusChanged(c.getState());
}
@Override
@@ -151,7 +151,7 @@ public class FeatureConnector<U extends FeatureUpdates> {
}
@Override
- public void imsStatusChanged(int status, int subId) {
+ public void imsStatusChanged(int status) {
log("imsStatusChanged: status=" + ImsFeature.STATE_LOG_MAP.get(status));
final U manager;
final boolean isReady;
@@ -173,7 +173,7 @@ public class FeatureConnector<U extends FeatureUpdates> {
mExecutor.execute(() -> {
try {
if (isReady) {
- notifyReady(manager, subId);
+ notifyReady(manager);
} else {
notifyNotReady();
}
@@ -282,10 +282,10 @@ public class FeatureConnector<U extends FeatureUpdates> {
}
// Should be called on executor
- private void notifyReady(U manager, int subId) throws ImsException {
+ private void notifyReady(U manager) throws ImsException {
try {
if (DBG) log("notifyReady");
- mListener.connectionReady(manager, subId);
+ mListener.connectionReady(manager);
}
catch (ImsException e) {
if(DBG) log("notifyReady exception: " + e.getMessage());
diff --git a/src/java/com/android/ims/FeatureUpdates.java b/src/java/com/android/ims/FeatureUpdates.java
index 550b6046..446a78b9 100644
--- a/src/java/com/android/ims/FeatureUpdates.java
+++ b/src/java/com/android/ims/FeatureUpdates.java
@@ -48,9 +48,8 @@ public interface FeatureUpdates {
* Associate this Manager instance with the IMS Binder interfaces specified. This is usually
* done by creating a FeatureConnection instance with these interfaces.
* @param container Contains all of the related interfaces attached to a specific ImsFeature.
- * @param subId The subscription ID that the IMS Feature is being created for.
*/
- void associate(ImsFeatureContainer container, int subId);
+ void associate(ImsFeatureContainer container);
/**
* Invalidate the previously associated Binder interfaces set in {@link #associate}.
diff --git a/src/java/com/android/ims/ImsCall.java b/src/java/com/android/ims/ImsCall.java
index a5813d88..7af0b71c 100755
--- a/src/java/com/android/ims/ImsCall.java
+++ b/src/java/com/android/ims/ImsCall.java
@@ -1123,7 +1123,7 @@ public class ImsCall implements ICall {
mSession = session;
try {
- mSession.setListener(createCallSessionListener(), mContext.getMainExecutor());
+ mSession.setListener(createCallSessionListener());
} catch (Throwable t) {
loge("attachSession :: ", t);
throwImsException(t, 0);
@@ -1147,7 +1147,7 @@ public class ImsCall implements ICall {
mSession = session;
try {
- session.setListener(createCallSessionListener(), mContext.getMainExecutor());
+ session.setListener(createCallSessionListener());
session.start(callee, mCallProfile);
} catch (Throwable t) {
loge("start(1) :: ", t);
@@ -1173,7 +1173,7 @@ public class ImsCall implements ICall {
mIsConferenceHost = true;
try {
- session.setListener(createCallSessionListener(), mContext.getMainExecutor());
+ session.setListener(createCallSessionListener());
session.start(participants, mCallProfile);
} catch (Throwable t) {
loge("start(n) :: ", t);
@@ -2097,9 +2097,9 @@ public class ImsCall implements ICall {
private void setTransientSessionAsPrimary(ImsCallSession transientSession) {
synchronized (ImsCall.this) {
- mSession.setListener(null, null);
+ mSession.setListener(null);
mSession = transientSession;
- mSession.setListener(createCallSessionListener(), mContext.getMainExecutor());
+ mSession.setListener(createCallSessionListener());
}
}
@@ -2214,7 +2214,7 @@ public class ImsCall implements ICall {
// Clear the listener for this transient session, we'll create a new listener
// when it is attached to the final ImsCall that it should live on.
- transientConferenceSession.setListener(null, null);
+ transientConferenceSession.setListener(null);
// Determine which call the transient session should be moved to. If the current
// call session is still alive and the merge peer's session is not, we have a
@@ -2409,7 +2409,7 @@ public class ImsCall implements ICall {
// Try to clean up the transient session if it exists.
if (mTransientConferenceSession != null) {
- mTransientConferenceSession.setListener(null, null);
+ mTransientConferenceSession.setListener(null);
mTransientConferenceSession = null;
}
diff --git a/src/java/com/android/ims/ImsCallbackAdapterManager.java b/src/java/com/android/ims/ImsCallbackAdapterManager.java
index 931ce579..d4926b2f 100644
--- a/src/java/com/android/ims/ImsCallbackAdapterManager.java
+++ b/src/java/com/android/ims/ImsCallbackAdapterManager.java
@@ -18,10 +18,21 @@ package com.android.ims;
import android.content.Context;
import android.os.IInterface;
+import android.os.Looper;
import android.os.RemoteCallbackList;
+import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.util.ArraySet;
import android.util.Log;
+import android.util.SparseArray;
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
public abstract class ImsCallbackAdapterManager<T extends IInterface> {
private static final String TAG = "ImsCallbackAM";
@@ -29,16 +40,62 @@ public abstract class ImsCallbackAdapterManager<T extends IInterface> {
private final Context mContext;
private final Object mLock;
private final int mSlotId;
- private final int mSubId;
+
+ // Map of sub id -> List<callbacks> for sub id linked callbacks.
+ private final SparseArray<Set<T>> mCallbackSubscriptionMap = new SparseArray<>();
// List of all active callbacks to ImsService
private final RemoteCallbackList<T> mRemoteCallbacks = new RemoteCallbackList<>();
- public ImsCallbackAdapterManager(Context context, Object lock, int slotId, int subId) {
+ @VisibleForTesting
+ public SubscriptionManager.OnSubscriptionsChangedListener mSubChangedListener;
+
+ public ImsCallbackAdapterManager(Context context, Object lock, int slotId) {
mContext = context;
mLock = lock;
mSlotId = slotId;
- mSubId = subId;
+
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+
+ // Must be created after Looper.prepare() is called, or else we will get an exception.
+ mSubChangedListener = new SubscriptionManager.OnSubscriptionsChangedListener() {
+ @Override
+ public void onSubscriptionsChanged() {
+ SubscriptionManager manager = mContext.getSystemService(SubscriptionManager.class);
+ if (manager == null) {
+ Log.w(TAG + " [" + mSlotId + "]", "onSubscriptionsChanged: could not find "
+ + "SubscriptionManager.");
+ return;
+ }
+
+ List<SubscriptionInfo> subInfos = manager.getActiveSubscriptionInfoList(false);
+ if (subInfos == null) {
+ subInfos = Collections.emptyList();
+ }
+
+ Set<Integer> newSubIds = subInfos.stream()
+ .map(SubscriptionInfo::getSubscriptionId)
+ .collect(Collectors.toSet());
+
+ synchronized (mLock) {
+ Set<Integer> storedSubIds = new ArraySet<>(mCallbackSubscriptionMap.size());
+ for (int keyIndex = 0; keyIndex < mCallbackSubscriptionMap.size();
+ keyIndex++) {
+ storedSubIds.add(mCallbackSubscriptionMap.keyAt(keyIndex));
+ }
+
+ // Get the set of sub ids that are in storedSubIds that are not in newSubIds.
+ // This is the set of sub ids that need to be removed.
+ storedSubIds.removeAll(newSubIds);
+
+ for (Integer subId : storedSubIds) {
+ removeCallbacksForSubscription(subId);
+ }
+ }
+ }
+ };
}
// Add a callback to the ImsFeature associated with this manager (independent of the
@@ -50,31 +107,20 @@ public abstract class ImsCallbackAdapterManager<T extends IInterface> {
// Throws a IllegalStateException if this registration fails.
registerCallback(localCallback);
Log.i(TAG + " [" + mSlotId + "]", "Local callback added: " + localCallback);
-
mRemoteCallbacks.register(localCallback);
}
}
- // Add a callback to be associated with a subscription.
+ // Add a callback to be associated with a subscription. If that subscription is removed,
+ // remove the callback and notify the callback that the subscription has been removed.
public void addCallbackForSubscription(T localCallback, int subId) {
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
- Log.w(TAG + " [" + mSlotId + ", " + mSubId + "]", "add callback: invalid subId.");
+ Log.w(TAG + " [" + mSlotId + "]", "add callback: invalid subId " + subId);
return;
}
- if (mSubId != subId) {
- // In some cases, telephony has changed sub id and IMS is still catching up to the
- // state change. Ensure that the device does not try to register a callback on an
- // inactive subscription, because this can cause a condition where we remove the
- // callback invisibly when the new subscription loads. Instead, simulate the existing
- // IllegalStateException that happens when the ImsService is not ready/active for
- // backwards compatibility.
- Log.w(TAG + " [" + mSlotId + ", " + mSubId + "]", "add callback: inactive"
- + " subID detected: " + subId);
- throw new IllegalStateException("ImsService is not available for the subscription "
- + "specified.");
- }
synchronized (mLock) {
addCallback(localCallback);
+ linkCallbackToSubscription(localCallback, subId);
}
}
@@ -89,6 +135,110 @@ public abstract class ImsCallbackAdapterManager<T extends IInterface> {
}
}
+ // Remove an existing callback that has been linked to a subscription.
+ public void removeCallbackForSubscription(T localCallback, int subId) {
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ Log.w(TAG + " [" + mSlotId + "]", "remove callback: invalid subId " + subId);
+ return;
+ }
+ synchronized (mLock) {
+ removeCallback(localCallback);
+ unlinkCallbackFromSubscription(localCallback, subId);
+ }
+ }
+
+ // Links a callback to be tracked by a subscription. If it goes away, emove.
+ private void linkCallbackToSubscription(T callback, int subId) {
+ synchronized (mLock) {
+ if (mCallbackSubscriptionMap.size() == 0) {
+ // we are about to add the first entry to the map, register for subscriptions
+ //changed listener.
+ registerForSubscriptionsChanged();
+ }
+ Set<T> callbacksPerSub = mCallbackSubscriptionMap.get(subId);
+ if (callbacksPerSub == null) {
+ // the callback list has not been created yet for this subscription.
+ callbacksPerSub = new ArraySet<>();
+ mCallbackSubscriptionMap.put(subId, callbacksPerSub);
+ }
+ callbacksPerSub.add(callback);
+ }
+ }
+
+ // Unlink the callback from the associated subscription.
+ private void unlinkCallbackFromSubscription(T callback, int subId) {
+ synchronized (mLock) {
+ Set<T> callbacksPerSub = mCallbackSubscriptionMap.get(subId);
+ if (callbacksPerSub != null) {
+ callbacksPerSub.remove(callback);
+ if (callbacksPerSub.isEmpty()) {
+ mCallbackSubscriptionMap.remove(subId);
+ }
+ }
+ if (mCallbackSubscriptionMap.size() == 0) {
+ unregisterForSubscriptionsChanged();
+ }
+ }
+ }
+
+ // Removes all of the callbacks that have been registered to the subscription specified.
+ // This happens when Telephony sends an indication that the subscriptions have changed.
+ private void removeCallbacksForSubscription(int subId) {
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ Log.w(TAG + " [" + mSlotId + "]", "remove all callbacks: invalid subId " + subId);
+ return;
+ }
+ synchronized (mLock) {
+ Set<T> callbacksPerSub = mCallbackSubscriptionMap.get(subId);
+ if (callbacksPerSub == null) {
+ // no callbacks registered for this subscription.
+ return;
+ }
+ // clear all registered callbacks in the subscription map for this subscription.
+ mCallbackSubscriptionMap.remove(subId);
+ for (T callback : callbacksPerSub) {
+ removeCallback(callback);
+ }
+ // If there are no more callbacks being tracked, remove subscriptions changed
+ // listener.
+ if (mCallbackSubscriptionMap.size() == 0) {
+ unregisterForSubscriptionsChanged();
+ }
+ }
+ }
+
+ // Clear the Subscription -> Callback map because the ImsService connection is no longer
+ // current.
+ private void clearCallbacksForAllSubscriptions() {
+ synchronized (mLock) {
+ List<Integer> keys = new ArrayList<>();
+ for (int keyIndex = 0; keyIndex < mCallbackSubscriptionMap.size(); keyIndex++) {
+ keys.add(mCallbackSubscriptionMap.keyAt(keyIndex));
+ }
+ keys.forEach(this::removeCallbacksForSubscription);
+ }
+ }
+
+ private void registerForSubscriptionsChanged() {
+ SubscriptionManager manager = mContext.getSystemService(SubscriptionManager.class);
+ if (manager != null) {
+ manager.addOnSubscriptionsChangedListener(mSubChangedListener);
+ } else {
+ Log.w(TAG + " [" + mSlotId + "]", "registerForSubscriptionsChanged: could not find"
+ + " SubscriptionManager.");
+ }
+ }
+
+ private void unregisterForSubscriptionsChanged() {
+ SubscriptionManager manager = mContext.getSystemService(SubscriptionManager.class);
+ if (manager != null) {
+ manager.removeOnSubscriptionsChangedListener(mSubChangedListener);
+ } else {
+ Log.w(TAG + " [" + mSlotId + "]", "unregisterForSubscriptionsChanged: could not"
+ + " find SubscriptionManager.");
+ }
+ }
+
// The ImsService these callbacks are registered to has become unavailable or crashed, or
// the ImsResolver has switched to a new ImsService. In these cases, clean up all existing
// callbacks.
@@ -100,6 +250,7 @@ public abstract class ImsCallbackAdapterManager<T extends IInterface> {
unregisterCallback(callbackItem);
mRemoteCallbacks.unregister(callbackItem);
}
+ clearCallbacksForAllSubscriptions();
Log.i(TAG + " [" + mSlotId + "]", "Closing connection and clearing callbacks");
}
}
diff --git a/src/java/com/android/ims/ImsEcbmStateListener.java b/src/java/com/android/ims/ImsEcbmStateListener.java
index 814ba5fe..ea662ee2 100644
--- a/src/java/com/android/ims/ImsEcbmStateListener.java
+++ b/src/java/com/android/ims/ImsEcbmStateListener.java
@@ -29,8 +29,6 @@
package com.android.ims;
-import java.util.concurrent.Executor;
-
/**
* Listener for receiving notifications about changes to the IMS connection.
* It provides a state of IMS registration between UE and IMS network, the service
@@ -38,42 +36,18 @@ import java.util.concurrent.Executor;
*
* @hide
*/
-public abstract class ImsEcbmStateListener {
- protected Executor mListenerExecutor = Runnable::run;
- /**
- * constructor.
- *
- * @param executor the executor that will execute callbacks.
- */
- public ImsEcbmStateListener(Executor executor) {
- if (executor != null)
- mListenerExecutor = executor;
- }
+public class ImsEcbmStateListener {
/**
* Called when the device enters Emergency Callback Mode
*/
- public final void onECBMEntered() {
- onECBMEntered(mListenerExecutor);
+ public void onECBMEntered() {
+ // no-op
}
/**
- * Called when the device enters Emergency Callback Mode
- *
- * @param executor the executor that will execute callbacks.
- */
- public abstract void onECBMEntered(Executor executor);
-
- /**
* Called when the device exits Emergency Callback Mode
*/
- public final void onECBMExited() {
- onECBMExited(mListenerExecutor);
+ public void onECBMExited() {
+ // no-op
}
-
- /**
- * Called when the device exits Emergency Callback Mode
- *
- * @param executor the executor that will execute callbacks.
- */
- public abstract void onECBMExited(Executor executor);
}
diff --git a/src/java/com/android/ims/ImsExternalCallStateListener.java b/src/java/com/android/ims/ImsExternalCallStateListener.java
index 880710a5..aae4c9b8 100644
--- a/src/java/com/android/ims/ImsExternalCallStateListener.java
+++ b/src/java/com/android/ims/ImsExternalCallStateListener.java
@@ -19,7 +19,6 @@ package com.android.ims;
import android.telephony.ims.ImsExternalCallState;
import java.util.List;
-import java.util.concurrent.Executor;
/**
* Listener for receiving notifications about {@link ImsExternalCallState} information received
@@ -27,32 +26,13 @@ import java.util.concurrent.Executor;
*
* @hide
*/
-public abstract class ImsExternalCallStateListener {
- protected Executor mListenerExecutor = Runnable::run;
- /**
- * constructor.
- *
- * @param executor the executor that will execute callbacks.
- */
- public ImsExternalCallStateListener(Executor executor) {
- if (executor != null)
- mListenerExecutor = executor;
- }
+public class ImsExternalCallStateListener {
/**
* Notifies client when Dialog Event Package update is received
*
* @param externalCallState the external call state.
*/
- public final void onImsExternalCallStateUpdate(List<ImsExternalCallState> externalCallState) {
- onImsExternalCallStateUpdate(externalCallState, mListenerExecutor);
+ public void onImsExternalCallStateUpdate(List<ImsExternalCallState> externalCallState) {
+ // no-op
}
- /**
- * Notifies client when Dialog Event Package update is received
- *
- * @param externalCallState the external call state.
- *
- * @param executor the executor that will execute callbacks.
- */
- public abstract void onImsExternalCallStateUpdate(
- List<ImsExternalCallState> externalCallState, Executor executor);
}
diff --git a/src/java/com/android/ims/ImsFeatureBinderRepository.java b/src/java/com/android/ims/ImsFeatureBinderRepository.java
index 5c352b1e..538e5cf1 100644
--- a/src/java/com/android/ims/ImsFeatureBinderRepository.java
+++ b/src/java/com/android/ims/ImsFeatureBinderRepository.java
@@ -59,7 +59,7 @@ public class ImsFeatureBinderRepository {
mExecutor = e;
}
- public void notifyFeatureCreatedOrRemoved(ImsFeatureContainer connector, int subId) {
+ public void notifyFeatureCreatedOrRemoved(ImsFeatureContainer connector) {
if (connector == null) {
mExecutor.execute(() -> {
try {
@@ -73,7 +73,7 @@ public class ImsFeatureBinderRepository {
else {
mExecutor.execute(() -> {
try {
- mCallback.imsFeatureCreated(connector, subId);
+ mCallback.imsFeatureCreated(connector);
} catch (RemoteException e) {
// This listener will eventually be caught and removed during stale checks.
}
@@ -81,10 +81,10 @@ public class ImsFeatureBinderRepository {
}
}
- public void notifyStateChanged(int state, int subId) {
+ public void notifyStateChanged(int state) {
mExecutor.execute(() -> {
try {
- mCallback.imsStatusChanged(state, subId);
+ mCallback.imsStatusChanged(state);
} catch (RemoteException e) {
// This listener will eventually be caught and removed during stale checks.
}
@@ -132,7 +132,6 @@ public class ImsFeatureBinderRepository {
*/
private static final class UpdateMapper {
public final int phoneId;
- public int subId;
public final @ImsFeature.FeatureType int imsFeatureType;
private final List<ListenerContainer> mListeners = new ArrayList<>();
private ImsFeatureContainer mFeatureContainer;
@@ -151,7 +150,7 @@ public class ImsFeatureBinderRepository {
mFeatureContainer = c;
listeners = copyListenerList(mListeners);
}
- listeners.forEach(l -> l.notifyFeatureCreatedOrRemoved(mFeatureContainer, subId));
+ listeners.forEach(l -> l.notifyFeatureCreatedOrRemoved(mFeatureContainer));
}
public ImsFeatureContainer removeFeatureContainer() {
@@ -163,7 +162,7 @@ public class ImsFeatureBinderRepository {
mFeatureContainer = null;
listeners = copyListenerList(mListeners);
}
- listeners.forEach(l -> l.notifyFeatureCreatedOrRemoved(mFeatureContainer, subId));
+ listeners.forEach(l -> l.notifyFeatureCreatedOrRemoved(mFeatureContainer));
return oldContainer;
}
@@ -185,7 +184,7 @@ public class ImsFeatureBinderRepository {
}
// Do not call back until the feature container has been set.
if (featureContainer != null) {
- c.notifyFeatureCreatedOrRemoved(featureContainer, subId);
+ c.notifyFeatureCreatedOrRemoved(featureContainer);
}
}
@@ -214,7 +213,7 @@ public class ImsFeatureBinderRepository {
}
// Only update if the feature container is set.
if (featureContainer != null) {
- listeners.forEach(l -> l.notifyStateChanged(newState, subId));
+ listeners.forEach(l -> l.notifyStateChanged(newState));
}
}
@@ -237,10 +236,6 @@ public class ImsFeatureBinderRepository {
}
}
- public void updateSubId(int newSubId) {
- subId = newSubId;
- }
-
@GuardedBy("mLock")
private void removeStaleListeners() {
List<ListenerContainer> staleListeners = mListeners.stream().filter(
@@ -342,15 +337,14 @@ public class ImsFeatureBinderRepository {
* @param newConnection A Container containing the IBinder interface connections associated with
* the ImsFeature type.
*/
- public void addConnection(int phoneId, int subId, @ImsFeature.FeatureType int type,
+ public void addConnection(int phoneId, @ImsFeature.FeatureType int type,
@Nullable ImsFeatureContainer newConnection) {
if (type < 0 || type >= ImsFeature.FEATURE_MAX) {
throw new IllegalArgumentException("The type must valid");
}
- logInfoLineLocked(phoneId, "addConnection, subId=" + subId + ", type="
- + ImsFeature.FEATURE_LOG_MAP.get(type) + ", conn=" + newConnection);
+ logInfoLineLocked(phoneId, "addConnection, type=" + ImsFeature.FEATURE_LOG_MAP.get(type)
+ + ", conn=" + newConnection);
UpdateMapper m = getUpdateMapper(phoneId, type);
- m.updateSubId(subId);
m.addFeatureContainer(newConnection);
}
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index c41426d0..345cbc51 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -17,12 +17,6 @@
package com.android.ims;
import static android.telephony.ims.ProvisioningManager.KEY_VOIMS_OPT_IN_STATUS;
-import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT;
-import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO;
-import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE;
-import static android.telephony.ims.feature.RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE;
-import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
-import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_LTE;
import android.annotation.NonNull;
import android.app.PendingIntent;
@@ -242,8 +236,8 @@ public class ImsManager implements FeatureUpdates {
@VisibleForTesting
public interface MmTelFeatureConnectionFactory {
- MmTelFeatureConnection create(Context context, int phoneId, int subId,
- IImsMmTelFeature feature, IImsConfig c, IImsRegistration r, ISipTransport s);
+ MmTelFeatureConnection create(Context context, int phoneId, IImsMmTelFeature feature,
+ IImsConfig c, IImsRegistration r, ISipTransport s);
}
@VisibleForTesting
@@ -396,18 +390,15 @@ public class ImsManager implements FeatureUpdates {
try {
// If this is during initial reconnect, let all threads wait for connect
// (or timeout)
- if(!mConnectedLatch.await(CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
- mImsManager.log("ImsService not up yet - timeout waiting for connection.");
- }
+ mConnectedLatch.await(CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
// Do nothing and allow ImsService to attach behind the scenes
}
}
@Override
- public void connectionReady(ImsManager manager, int subId) {
+ public void connectionReady(ImsManager manager) {
synchronized (mLock) {
- mImsManager.logi("connectionReady, subId: " + subId);
mConnectedLatch.countDown();
}
}
@@ -415,7 +406,6 @@ public class ImsManager implements FeatureUpdates {
@Override
public void connectionUnavailable(int reason) {
synchronized (mLock) {
- mImsManager.logi("connectionUnavailable, reason: " + reason);
// only need to track the connection becoming unavailable due to telephony going
// down.
if (reason == FeatureConnector.UNAVAILABLE_REASON_SERVER_UNAVAILABLE) {
@@ -699,28 +689,6 @@ public class ImsManager implements FeatureUpdates {
}
/**
- * @return true if we are either not on TTY or TTY over VoWiFi is enabled. If we
- * are on TTY and TTY over VoWiFi is not allowed, this method will return false.
- */
- public boolean isNonTtyOrTtyOnVoWifiEnabled() {
-
- if (isTtyOnVoWifiCapable()) {
- return true;
- }
-
- TelecomManager tm = mContext.getSystemService(TelecomManager.class);
- if (tm == null) {
- logw("isNonTtyOrTtyOnVoWifiEnabled: telecom not available");
- return true;
- }
- return tm.getCurrentTtyMode() == TelecomManager.TTY_MODE_OFF;
- }
-
- public boolean isTtyOnVoWifiCapable() {
- return getBooleanCarrierConfig(CarrierConfigManager.KEY_CARRIER_VOWIFI_TTY_SUPPORTED_BOOL);
- }
-
- /**
* Returns a platform configuration for VoLTE which may override the user setting.
* @deprecated Does not support MSIM devices. Please use
* {@link #isVolteEnabledByPlatform()} instead.
@@ -849,7 +817,8 @@ public class ImsManager implements FeatureUpdates {
* Indicates whether VoLTE is provisioned on this slot.
*/
public boolean isVolteProvisionedOnDevice() {
- if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE)) {
+ if (getBooleanCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
return isVolteProvisioned();
}
@@ -860,7 +829,8 @@ public class ImsManager implements FeatureUpdates {
* Indicates whether EAB is provisioned on this slot.
*/
public boolean isEabProvisionedOnDevice() {
- if (isRcsProvisioningRequired(CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE)) {
+ if (getBooleanCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL)) {
return isEabProvisioned();
}
@@ -900,7 +870,8 @@ public class ImsManager implements FeatureUpdates {
}
}
- if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN)) {
+ if (getBooleanCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
return isWfcProvisioned();
}
@@ -927,7 +898,8 @@ public class ImsManager implements FeatureUpdates {
* Indicates whether VT is provisioned on slot.
*/
public boolean isVtProvisionedOnDevice() {
- if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE)) {
+ if (getBooleanCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
return isVtProvisioned();
}
@@ -1151,9 +1123,8 @@ public class ImsManager implements FeatureUpdates {
try {
if (enabled) {
- boolean isNonTtyWifi = isNonTtyOrTtyOnVoWifiEnabled();
CapabilityChangeRequest request = new CapabilityChangeRequest();
- updateVoiceWifiFeatureAndProvisionedValues(request, isNonTtyWifi);
+ updateVoiceWifiFeatureAndProvisionedValues(request);
changeMmTelCapability(request);
// Ensure IMS is on if this setting is updated.
turnOnIms();
@@ -1616,55 +1587,59 @@ public class ImsManager implements FeatureUpdates {
}
/**
- * Will return with MmTel config value or return false if we receive an error from the AOSP
- * storage(ImsProvisioningController) implementation for that value.
+ * Will return with config value or throw an ImsException if we receive an error from
+ * ImsConfig for that value.
*/
- private boolean getImsProvisionedBoolNoException(int capability, int tech) {
- int subId = getSubId();
- if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
- logw("getImsProvisionedBoolNoException subId is invalid");
- return false;
+ private boolean getProvisionedBool(ImsConfig config, int item) throws ImsException {
+ int value = config.getProvisionedValue(item);
+ if (value == ImsConfigImplBase.CONFIG_RESULT_UNKNOWN) {
+ throw new ImsException("getProvisionedBool failed with error for item: " + item,
+ ImsReasonInfo.CODE_LOCAL_INTERNAL_ERROR);
}
+ return value == ProvisioningManager.PROVISIONING_VALUE_ENABLED;
+ }
- ITelephony iTelephony = getITelephony();
- if (iTelephony == null) {
- logw("getImsProvisionedBoolNoException ITelephony interface is invalid");
- return false;
+ /**
+ * Will set config value or throw an ImsException if we receive an error from ImsConfig for that
+ * value.
+ */
+ private void setProvisionedBool(ImsConfig config, int item, int value) throws ImsException {
+ int result = config.setConfig(item, value);
+ if (result != ImsConfigImplBase.CONFIG_RESULT_SUCCESS) {
+ throw new ImsException("setProvisionedBool failed with error for item: " + item,
+ ImsReasonInfo.CODE_LOCAL_INTERNAL_ERROR);
}
+ }
+ /**
+ * Will return with config value or return false if we receive an error from
+ * ImsConfigImplBase implementation for that value.
+ */
+ private boolean getProvisionedBoolNoException(int item) {
try {
- return iTelephony.getImsProvisioningStatusForCapability(subId, capability, tech);
- } catch (RemoteException | IllegalArgumentException e) {
- logw("getImsProvisionedBoolNoException: operation failed for capability=" + capability
- + ". Exception:" + e.getMessage() + ". Returning false.");
+ ImsConfig config = getConfigInterface();
+ return getProvisionedBool(config, item);
+ } catch (ImsException ex) {
+ logw("getProvisionedBoolNoException: operation failed for item=" + item
+ + ". Exception:" + ex.getMessage() + ". Returning false.");
return false;
}
}
/**
- * Will return with Rcs config value or return false if we receive an error from the AOSP
- * storage(ImsProvisioningController) implementation for that value.
+ * Will return with config value or return false if we receive an error from
+ * ImsConfigImplBase implementation for that value.
*/
- private boolean getRcsProvisionedBoolNoException(int capability, int tech) {
- int subId = getSubId();
- if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
- logw("getRcsProvisionedBoolNoException subId is invalid");
- return false;
- }
-
- ITelephony iTelephony = getITelephony();
- if (iTelephony == null) {
- logw("getRcsProvisionedBoolNoException ITelephony interface is invalid");
- return false;
- }
-
+ private boolean setProvisionedBoolNoException(int item, int value) {
try {
- return iTelephony.getRcsProvisioningStatusForCapability(subId, capability, tech);
- } catch (RemoteException | IllegalArgumentException e) {
- logw("getRcsProvisionedBoolNoException: operation failed for capability=" + capability
- + ". Exception:" + e.getMessage() + ". Returning false.");
+ ImsConfig config = getConfigInterface();
+ setProvisionedBool(config, item, value);
+ } catch (ImsException ex) {
+ logw("setProvisionedBoolNoException: operation failed for item=" + item
+ + ", value=" + value + ". Exception:" + ex.getMessage());
return false;
}
+ return true;
}
/**
@@ -1696,9 +1671,8 @@ public class ImsManager implements FeatureUpdates {
logi("reevaluateCapabilities");
CapabilityChangeRequest request = new CapabilityChangeRequest();
boolean isNonTty = isNonTtyOrTtyOnVolteEnabled();
- boolean isNonTtyWifi = isNonTtyOrTtyOnVoWifiEnabled();
updateVoiceCellFeatureValue(request, isNonTty);
- updateVoiceWifiFeatureAndProvisionedValues(request, isNonTtyWifi);
+ updateVoiceWifiFeatureAndProvisionedValues(request);
updateCrossSimFeatureAndProvisionedValues(request);
updateVideoCallFeatureValue(request, isNonTty);
updateCallComposerFeatureValue(request);
@@ -1836,8 +1810,7 @@ public class ImsManager implements FeatureUpdates {
/**
* Update WFC config
*/
- private void updateVoiceWifiFeatureAndProvisionedValues(CapabilityChangeRequest request,
- boolean isNonTty) {
+ private void updateVoiceWifiFeatureAndProvisionedValues(CapabilityChangeRequest request) {
TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
boolean isNetworkRoaming = false;
if (tm == null) {
@@ -1860,10 +1833,9 @@ public class ImsManager implements FeatureUpdates {
+ ", mode = " + mode
+ ", provisioned = " + isProvisioned
+ ", roaming = " + roaming
- + ", isFeatureOn = " + isFeatureOn
- + ", isNonTtyWifi = " + isNonTty);
+ + ", isFeatureOn = " + isFeatureOn);
- if (isFeatureOn && isNonTty) {
+ if (isFeatureOn) {
request.addCapabilitiesToEnableForTech(
MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN);
@@ -1899,13 +1871,8 @@ public class ImsManager implements FeatureUpdates {
private void updateUtFeatureValue(CapabilityChangeRequest request) {
boolean isCarrierSupported = isSuppServicesOverUtEnabledByPlatform();
-
- // check new carrier config first KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
- // if that returns false, check deprecated carrier config
- // KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL
- boolean requiresProvisioning = isMmTelProvisioningRequired(CAPABILITY_TYPE_UT,
- REGISTRATION_TECH_LTE) || getBooleanCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL);
+ boolean requiresProvisioning = getBooleanCarrierConfig(
+ CarrierConfigManager.KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL);
// Count as "provisioned" if we do not require provisioning.
boolean isProvisioned = true;
if (requiresProvisioning) {
@@ -1914,7 +1881,7 @@ public class ImsManager implements FeatureUpdates {
// currently.
try {
if (telephony != null) {
- isProvisioned = telephony.getImsProvisioningStatusForCapability(getSubId(),
+ isProvisioned = telephony.isMmTelCapabilityProvisionedInCache(getSubId(),
MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT,
ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
}
@@ -1989,7 +1956,7 @@ public class ImsManager implements FeatureUpdates {
mBinderCache = new BinderCacheManager<>(ImsManager::getITelephonyInterface);
// Start off with an empty MmTelFeatureConnection, which will be replaced one an
// ImsService is available (ImsManager expects a non-null FeatureConnection)
- associate(null /*container*/, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ associate(null /*container*/);
}
/**
@@ -1997,8 +1964,7 @@ public class ImsManager implements FeatureUpdates {
*/
@VisibleForTesting
public ImsManager(Context context, int phoneId, MmTelFeatureConnectionFactory factory,
- SubscriptionManagerProxy subManagerProxy, SettingsProxy settingsProxy,
- BinderCacheManager binderCacheManager) {
+ SubscriptionManagerProxy subManagerProxy, SettingsProxy settingsProxy) {
mContext = context;
mPhoneId = phoneId;
mMmTelFeatureConnectionFactory = factory;
@@ -2008,9 +1974,9 @@ public class ImsManager implements FeatureUpdates {
Context.CARRIER_CONFIG_SERVICE);
// Do not multithread tests
mExecutor = Runnable::run;
- mBinderCache = binderCacheManager;
+ mBinderCache = new BinderCacheManager<>(ImsManager::getITelephonyInterface);
// MmTelFeatureConnection should be replaced for tests with mMmTelFeatureConnectionFactory.
- associate(null /*container*/, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ associate(null /*container*/);
}
/*
@@ -2648,14 +2614,10 @@ public class ImsManager implements FeatureUpdates {
public void setTtyMode(int ttyMode) throws ImsException {
boolean isNonTtyOrTtyOnVolteEnabled = isTtyOnVoLteCapable() ||
(ttyMode == TelecomManager.TTY_MODE_OFF);
-
- boolean isNonTtyOrTtyOnWifiEnabled = isTtyOnVoWifiCapable() ||
- (ttyMode == TelecomManager.TTY_MODE_OFF);
-
+ logi("setTtyMode: isNonTtyOrTtyOnVolteEnabled=" + isNonTtyOrTtyOnVolteEnabled);
CapabilityChangeRequest request = new CapabilityChangeRequest();
updateVoiceCellFeatureValue(request, isNonTtyOrTtyOnVolteEnabled);
updateVideoCallFeatureValue(request, isNonTtyOrTtyOnVolteEnabled);
- updateVoiceWifiFeatureAndProvisionedValues(request, isNonTtyOrTtyOnWifiEnabled);
// update MMTEL caps for the new configuration.
changeMmTelCapability(request);
if (isImsNeeded(request)) {
@@ -2797,12 +2759,6 @@ public class ImsManager implements FeatureUpdates {
throw new ImsException("Service is unavailable",
ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
}
- if (getSubId() != c.getSubId()) {
- logi("Trying to get MmTelFeature when it is still setting up, curr subId=" + getSubId()
- + ", target subId=" + c.getSubId());
- throw new ImsException("Service is still initializing",
- ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
- }
return c;
}
@@ -2854,13 +2810,13 @@ public class ImsManager implements FeatureUpdates {
}
@Override
- public void associate(ImsFeatureContainer c, int subId) {
+ public void associate(ImsFeatureContainer c) {
if (c == null) {
mMmTelConnectionRef.set(mMmTelFeatureConnectionFactory.create(
- mContext, mPhoneId, subId, null, null, null, null));
+ mContext, mPhoneId, null, null, null, null));
} else {
mMmTelConnectionRef.set(mMmTelFeatureConnectionFactory.create(
- mContext, mPhoneId, subId, IImsMmTelFeature.Stub.asInterface(c.imsFeature),
+ mContext, mPhoneId, IImsMmTelFeature.Stub.asInterface(c.imsFeature),
c.imsConfig, c.imsRegistration, c.sipTransport));
}
}
@@ -2909,7 +2865,7 @@ public class ImsManager implements FeatureUpdates {
private void logi(String s) {
Rlog.i(TAG + mLogTagPostfix + " [" + mPhoneId + "]", s);
}
-
+
private void logw(String s) {
Rlog.w(TAG + mLogTagPostfix + " [" + mPhoneId + "]", s);
}
@@ -3035,8 +2991,7 @@ public class ImsManager implements FeatureUpdates {
public @MmTelFeature.ProcessCallResult int shouldProcessCall(boolean isEmergency,
String[] numbers) throws ImsException {
try {
- MmTelFeatureConnection c = getOrThrowExceptionIfServiceUnavailable();
- return c.shouldProcessCall(isEmergency, numbers);
+ return mMmTelConnectionRef.get().shouldProcessCall(isEmergency, numbers);
} catch (RemoteException e) {
throw new ImsException("shouldProcessCall()", e,
ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
@@ -3114,6 +3069,34 @@ public class ImsManager implements FeatureUpdates {
}
}
+ public void setVolteProvisioned(boolean isProvisioned) {
+ int provisionStatus = isProvisioned ? ProvisioningManager.PROVISIONING_VALUE_ENABLED :
+ ProvisioningManager.PROVISIONING_VALUE_DISABLED;
+ setProvisionedBoolNoException(ImsConfig.ConfigConstants.VLT_SETTING_ENABLED,
+ provisionStatus);
+ }
+
+ public void setWfcProvisioned(boolean isProvisioned) {
+ int provisionStatus = isProvisioned ? ProvisioningManager.PROVISIONING_VALUE_ENABLED :
+ ProvisioningManager.PROVISIONING_VALUE_DISABLED;
+ setProvisionedBoolNoException(
+ ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED, provisionStatus);
+ }
+
+ public void setVtProvisioned(boolean isProvisioned) {
+ int provisionStatus = isProvisioned ? ProvisioningManager.PROVISIONING_VALUE_ENABLED :
+ ProvisioningManager.PROVISIONING_VALUE_DISABLED;
+ setProvisionedBoolNoException(ImsConfig.ConfigConstants.LVC_SETTING_ENABLED,
+ provisionStatus);
+ }
+
+ public void setEabProvisioned(boolean isProvisioned) {
+ int provisionStatus = isProvisioned ? ProvisioningManager.PROVISIONING_VALUE_ENABLED :
+ ProvisioningManager.PROVISIONING_VALUE_DISABLED;
+ setProvisionedBoolNoException(ImsConfig.ConfigConstants.EAB_SETTING_ENABLED,
+ provisionStatus);
+ }
+
private boolean isDataEnabled() {
TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
if (tm == null) {
@@ -3125,72 +3108,23 @@ public class ImsManager implements FeatureUpdates {
}
private boolean isVolteProvisioned() {
- return getImsProvisionedBoolNoException(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE);
+ return getProvisionedBoolNoException(
+ ImsConfig.ConfigConstants.VLT_SETTING_ENABLED);
}
private boolean isEabProvisioned() {
- return getRcsProvisionedBoolNoException(CAPABILITY_TYPE_PRESENCE_UCE,
- REGISTRATION_TECH_LTE);
+ return getProvisionedBoolNoException(
+ ImsConfig.ConfigConstants.EAB_SETTING_ENABLED);
}
private boolean isWfcProvisioned() {
- return getImsProvisionedBoolNoException(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN);
+ return getProvisionedBoolNoException(
+ ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED);
}
private boolean isVtProvisioned() {
- return getImsProvisionedBoolNoException(CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE);
- }
-
- private boolean isMmTelProvisioningRequired(int capability, int tech) {
- int subId = getSubId();
- if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
- logw("isMmTelProvisioningRequired subId is invalid");
- return false;
- }
-
- ITelephony iTelephony = getITelephony();
- if (iTelephony == null) {
- logw("isMmTelProvisioningRequired ITelephony interface is invalid");
- return false;
- }
-
- boolean required = false;
- try {
- required = iTelephony.isProvisioningRequiredForCapability(subId, capability,
- tech);
- } catch (RemoteException | IllegalArgumentException e) {
- logw("isMmTelProvisioningRequired : operation failed" + " capability=" + capability
- + " tech=" + tech + ". Exception:" + e.getMessage());
- }
-
- log("MmTel Provisioning required " + required + " for capability " + capability);
- return required;
- }
-
- private boolean isRcsProvisioningRequired(int capability, int tech) {
- int subId = getSubId();
- if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
- logw("isRcsProvisioningRequired subId is invalid");
- return false;
- }
-
- ITelephony iTelephony = getITelephony();
- if (iTelephony == null) {
- logw("isRcsProvisioningRequired ITelephony interface is invalid");
- return false;
- }
-
- boolean required = false;
- try {
- required = iTelephony.isRcsProvisioningRequiredForCapability(subId, capability,
- tech);
- } catch (RemoteException | IllegalArgumentException e) {
- logw("isRcsProvisioningRequired : operation failed" + " capability=" + capability
- + " tech=" + tech + ". Exception:" + e.getMessage());
- }
-
- log("Rcs Provisioning required " + required + " for capability " + capability);
- return required;
+ return getProvisionedBoolNoException(
+ ImsConfig.ConfigConstants.LVC_SETTING_ENABLED);
}
private static String booleanToPropertyString(boolean bool) {
diff --git a/src/java/com/android/ims/ImsUt.java b/src/java/com/android/ims/ImsUt.java
index d02ffaa5..61a11111 100644
--- a/src/java/com/android/ims/ImsUt.java
+++ b/src/java/com/android/ims/ImsUt.java
@@ -33,11 +33,9 @@ import com.android.ims.internal.IImsUt;
import com.android.ims.internal.IImsUtListener;
import com.android.internal.annotations.VisibleForTesting;
import com.android.telephony.Rlog;
-import com.android.internal.telephony.util.TelephonyUtils;
import java.util.HashMap;
import java.util.Map;
-import java.util.concurrent.Executor;
/**
* Provides APIs for the supplementary service settings using IMS (Ut interface).
@@ -87,13 +85,9 @@ public class ImsUt implements ImsUtInterface {
private HashMap<Integer, Message> mPendingCmds =
new HashMap<Integer, Message>();
private Registrant mSsIndicationRegistrant;
- private Executor mExecutor = Runnable::run;
- public ImsUt(IImsUt iUt, Executor executor) {
+ public ImsUt(IImsUt iUt) {
miUt = iUt;
- if (executor != null) {
- mExecutor = executor;
- }
if (miUt != null) {
try {
@@ -670,26 +664,22 @@ public class ImsUt implements ImsUtInterface {
*/
@Override
public void utConfigurationUpdated(IImsUt ut, int id) {
- TelephonyUtils.runWithCleanCallingIdentity(()-> {
- Integer key = Integer.valueOf(id);
+ Integer key = Integer.valueOf(id);
- synchronized(mLockObj) {
- sendSuccessReport(mPendingCmds.get(key));
- mPendingCmds.remove(key);
- }
- }, mExecutor);
+ synchronized(mLockObj) {
+ sendSuccessReport(mPendingCmds.get(key));
+ mPendingCmds.remove(key);
+ }
}
@Override
public void utConfigurationUpdateFailed(IImsUt ut, int id, ImsReasonInfo error) {
- TelephonyUtils.runWithCleanCallingIdentity(()-> {
- Integer key = Integer.valueOf(id);
+ Integer key = Integer.valueOf(id);
- synchronized(mLockObj) {
- sendFailureReport(mPendingCmds.get(key), error);
- mPendingCmds.remove(key);
- }
- }, mExecutor);
+ synchronized(mLockObj) {
+ sendFailureReport(mPendingCmds.get(key), error);
+ mPendingCmds.remove(key);
+ }
}
/**
@@ -720,24 +710,20 @@ public class ImsUt implements ImsUtInterface {
*/
@Override
public void lineIdentificationSupplementaryServiceResponse(int id, ImsSsInfo config) {
- TelephonyUtils.runWithCleanCallingIdentity(()-> {
- synchronized(mLockObj) {
- sendSuccessReport(mPendingCmds.get(id), config);
- mPendingCmds.remove(id);
- }
- }, mExecutor);
+ synchronized(mLockObj) {
+ sendSuccessReport(mPendingCmds.get(id), config);
+ mPendingCmds.remove(id);
+ }
}
@Override
public void utConfigurationQueryFailed(IImsUt ut, int id, ImsReasonInfo error) {
- TelephonyUtils.runWithCleanCallingIdentity(()-> {
- Integer key = Integer.valueOf(id);
+ Integer key = Integer.valueOf(id);
- synchronized(mLockObj) {
- sendFailureReport(mPendingCmds.get(key), error);
- mPendingCmds.remove(key);
- }
- }, mExecutor);
+ synchronized(mLockObj) {
+ sendFailureReport(mPendingCmds.get(key), error);
+ mPendingCmds.remove(key);
+ }
}
/**
@@ -746,14 +732,12 @@ public class ImsUt implements ImsUtInterface {
@Override
public void utConfigurationCallBarringQueried(IImsUt ut,
int id, ImsSsInfo[] cbInfo) {
- TelephonyUtils.runWithCleanCallingIdentity(()-> {
- Integer key = Integer.valueOf(id);
+ Integer key = Integer.valueOf(id);
- synchronized(mLockObj) {
- sendSuccessReport(mPendingCmds.get(key), cbInfo);
- mPendingCmds.remove(key);
- }
- }, mExecutor);
+ synchronized(mLockObj) {
+ sendSuccessReport(mPendingCmds.get(key), cbInfo);
+ mPendingCmds.remove(key);
+ }
}
/**
@@ -762,14 +746,12 @@ public class ImsUt implements ImsUtInterface {
@Override
public void utConfigurationCallForwardQueried(IImsUt ut,
int id, ImsCallForwardInfo[] cfInfo) {
- TelephonyUtils.runWithCleanCallingIdentity(()-> {
- Integer key = Integer.valueOf(id);
+ Integer key = Integer.valueOf(id);
- synchronized(mLockObj) {
- sendSuccessReport(mPendingCmds.get(key), cfInfo);
- mPendingCmds.remove(key);
- }
- }, mExecutor);
+ synchronized(mLockObj) {
+ sendSuccessReport(mPendingCmds.get(key), cfInfo);
+ mPendingCmds.remove(key);
+ }
}
/**
@@ -778,14 +760,12 @@ public class ImsUt implements ImsUtInterface {
@Override
public void utConfigurationCallWaitingQueried(IImsUt ut,
int id, ImsSsInfo[] cwInfo) {
- TelephonyUtils.runWithCleanCallingIdentity(()-> {
- Integer key = Integer.valueOf(id);
+ Integer key = Integer.valueOf(id);
- synchronized(mLockObj) {
- sendSuccessReport(mPendingCmds.get(key), cwInfo);
- mPendingCmds.remove(key);
- }
- }, mExecutor);
+ synchronized(mLockObj) {
+ sendSuccessReport(mPendingCmds.get(key), cwInfo);
+ mPendingCmds.remove(key);
+ }
}
/**
@@ -793,11 +773,9 @@ public class ImsUt implements ImsUtInterface {
*/
@Override
public void onSupplementaryServiceIndication(ImsSsData ssData) {
- TelephonyUtils.runWithCleanCallingIdentity(()-> {
- if (mSsIndicationRegistrant != null) {
- mSsIndicationRegistrant.notifyResult(ssData);
- }
- }, mExecutor);
+ if (mSsIndicationRegistrant != null) {
+ mSsIndicationRegistrant.notifyResult(ssData);
+ }
}
}
}
diff --git a/src/java/com/android/ims/MmTelFeatureConnection.java b/src/java/com/android/ims/MmTelFeatureConnection.java
index 3170d413..72013136 100644
--- a/src/java/com/android/ims/MmTelFeatureConnection.java
+++ b/src/java/com/android/ims/MmTelFeatureConnection.java
@@ -60,7 +60,7 @@ public class MmTelFeatureConnection extends FeatureConnection {
ImsCallbackAdapterManager<IImsRegistrationCallback> {
public ImsRegistrationCallbackAdapter(Context context, Object lock) {
- super(context, lock, mSlotId, mSubId);
+ super(context, lock, mSlotId);
}
@Override
@@ -87,10 +87,9 @@ public class MmTelFeatureConnection extends FeatureConnection {
if (imsRegistration != null) {
try {
imsRegistration.removeRegistrationCallback(localCallback);
- } catch (RemoteException | IllegalStateException e) {
+ } catch (RemoteException e) {
Log.w(TAG + " [" + mSlotId + "]", "ImsRegistrationCallbackAdapter -"
- + " unregisterCallback: couldn't remove registration callback"
- + " Exception: " + e.getMessage());
+ + " unregisterCallback: couldn't remove registration callback");
}
} else {
Log.e(TAG + " [" + mSlotId + "]", "ImsRegistrationCallbackAdapter: ImsRegistration"
@@ -102,7 +101,7 @@ public class MmTelFeatureConnection extends FeatureConnection {
private class CapabilityCallbackManager extends ImsCallbackAdapterManager<IImsCapabilityCallback> {
public CapabilityCallbackManager(Context context, Object lock) {
- super(context, lock, mSlotId, mSubId);
+ super(context, lock, mSlotId);
}
@Override
@@ -136,19 +135,22 @@ public class MmTelFeatureConnection extends FeatureConnection {
public void unregisterCallback(IImsCapabilityCallback localCallback) {
IImsMmTelFeature binder;
synchronized (mLock) {
- if (!isBinderAlive()) {
+ try {
+ checkServiceIsReady();
+ binder = getServiceInterface(mBinder);
+ } catch (RemoteException e) {
+ // binder is null
Log.w(TAG + " [" + mSlotId + "]", "CapabilityCallbackManager, unregister:"
- + " binder is not alive");
+ + " couldn't get binder.");
return;
}
- binder = getServiceInterface(mBinder);
}
if (binder != null) {
try {
binder.removeCapabilityCallback(localCallback);
- } catch (RemoteException | IllegalStateException e) {
+ } catch (RemoteException e) {
Log.w(TAG + " [" + mSlotId + "]", "CapabilityCallbackManager, unregister:"
- + " Binder is dead. Exception: " + e.getMessage());
+ + " Binder is dead.");
}
} else {
Log.w(TAG + " [" + mSlotId + "]", "CapabilityCallbackManager, unregister:"
@@ -159,7 +161,7 @@ public class MmTelFeatureConnection extends FeatureConnection {
private class ProvisioningCallbackManager extends ImsCallbackAdapterManager<IImsConfigCallback> {
public ProvisioningCallbackManager (Context context, Object lock) {
- super(context, lock, mSlotId, mSubId);
+ super(context, lock, mSlotId);
}
@Override
@@ -188,9 +190,9 @@ public class MmTelFeatureConnection extends FeatureConnection {
}
try {
binder.removeImsConfigCallback(localCallback);
- } catch (RemoteException | IllegalStateException e) {
+ } catch (RemoteException e) {
Log.w(TAG + " [" + mSlotId + "]", "ProvisioningCallbackManager - couldn't"
- + " unregister, binder is dead. Exception: " + e.getMessage());
+ + " unregister, binder is dead.");
}
}
}
@@ -248,9 +250,9 @@ public class MmTelFeatureConnection extends FeatureConnection {
private final CapabilityCallbackManager mCapabilityCallbackManager;
private final ProvisioningCallbackManager mProvisioningCallbackManager;
- public MmTelFeatureConnection(Context context, int slotId, int subId, IImsMmTelFeature f,
+ public MmTelFeatureConnection(Context context, int slotId, IImsMmTelFeature f,
IImsConfig c, IImsRegistration r, ISipTransport s) {
- super(context, slotId, subId, c, r, s);
+ super(context, slotId, c, r, s);
setBinder((f != null) ? f.asBinder() : null);
mRegistrationCallbackManager = new ImsRegistrationCallbackAdapter(context, mLock);
@@ -323,9 +325,8 @@ public class MmTelFeatureConnection extends FeatureConnection {
mMultiEndpoint.getInterface().setExternalCallStateListener(null);
mMultiEndpoint = new BinderAccessState<>(BinderAccessState.STATE_NOT_SET);
}
- } catch (RemoteException | IllegalStateException e) {
- Log.w(TAG + " [" + mSlotId + "]", "closeConnection: couldn't remove listeners!" +
- " Exception: " + e.getMessage());
+ } catch (RemoteException e) {
+ Log.w(TAG + " [" + mSlotId + "]", "closeConnection: couldn't remove listeners!");
}
}
}
@@ -345,7 +346,7 @@ public class MmTelFeatureConnection extends FeatureConnection {
public void removeRegistrationCallbackForSubscription(IImsRegistrationCallback callback,
int subId) {
- mRegistrationCallbackManager.removeCallback(callback);
+ mRegistrationCallbackManager.removeCallbackForSubscription(callback, subId);
}
public void addCapabilityCallback(IImsCapabilityCallback callback) {
@@ -363,7 +364,7 @@ public class MmTelFeatureConnection extends FeatureConnection {
public void removeCapabilityCallbackForSubscription(IImsCapabilityCallback callback,
int subId) {
- mCapabilityCallbackManager.removeCallback(callback);
+ mCapabilityCallbackManager.removeCallbackForSubscription(callback , subId);
}
public void addProvisioningCallbackForSubscription(IImsConfigCallback callback,
@@ -373,7 +374,7 @@ public class MmTelFeatureConnection extends FeatureConnection {
public void removeProvisioningCallbackForSubscription(IImsConfigCallback callback,
int subId) {
- mProvisioningCallbackManager.removeCallback(callback);
+ mProvisioningCallbackManager.removeCallbackForSubscription(callback , subId);
}
public void changeEnabledCapabilities(CapabilityChangeRequest request,
@@ -435,7 +436,7 @@ public class MmTelFeatureConnection extends FeatureConnection {
// This will internally set up a listener on the ImsUtImplBase interface, and there is
// a limitation that there can only be one. If multiple connections try to create this
// UT interface, it will throw an IllegalStateException.
- mUt = (imsUt != null) ? new ImsUt(imsUt, mContext.getMainExecutor()) : null;
+ mUt = (imsUt != null) ? new ImsUt(imsUt) : null;
return mUt;
}
}
diff --git a/src/java/com/android/ims/RcsFeatureConnection.java b/src/java/com/android/ims/RcsFeatureConnection.java
index c19c36c9..b0908104 100644
--- a/src/java/com/android/ims/RcsFeatureConnection.java
+++ b/src/java/com/android/ims/RcsFeatureConnection.java
@@ -49,7 +49,7 @@ public class RcsFeatureConnection extends FeatureConnection {
ImsCallbackAdapterManager<IImsCapabilityCallback> {
AvailabilityCallbackManager(Context context) {
- super(context, new Object() /* Lock object */, mSlotId, mSubId);
+ super(context, new Object() /* Lock object */, mSlotId);
}
@Override
@@ -77,7 +77,7 @@ public class RcsFeatureConnection extends FeatureConnection {
ImsCallbackAdapterManager<IImsRegistrationCallback> {
public RegistrationCallbackManager(Context context) {
- super(context, new Object() /* Lock object */, mSlotId, mSubId);
+ super(context, new Object() /* Lock object */, mSlotId);
}
@Override
@@ -118,9 +118,9 @@ public class RcsFeatureConnection extends FeatureConnection {
@VisibleForTesting
public RegistrationCallbackManager mRegistrationCallbackManager;
- public RcsFeatureConnection(Context context, int slotId, int subId, IImsRcsFeature feature,
- IImsConfig c, IImsRegistration r, ISipTransport s) {
- super(context, slotId, subId, c, r, s);
+ public RcsFeatureConnection(Context context, int slotId, IImsRcsFeature feature, IImsConfig c,
+ IImsRegistration r, ISipTransport s) {
+ super(context, slotId, c, r, s);
setBinder(feature != null ? feature.asBinder() : null);
mAvailabilityCallbackManager = new AvailabilityCallbackManager(mContext);
mRegistrationCallbackManager = new RegistrationCallbackManager(mContext);
@@ -184,11 +184,11 @@ public class RcsFeatureConnection extends FeatureConnection {
}
public void removeCallbackForSubscription(int subId, IImsCapabilityCallback cb) {
- mAvailabilityCallbackManager.removeCallback(cb);
+ mAvailabilityCallbackManager.removeCallbackForSubscription(cb, subId);
}
public void removeCallbackForSubscription(int subId, IImsRegistrationCallback cb) {
- mRegistrationCallbackManager.removeCallback(cb);
+ mRegistrationCallbackManager.removeCallbackForSubscription(cb, subId);
}
public void removeCallback(IImsRegistrationCallback cb) {
diff --git a/src/java/com/android/ims/RcsFeatureManager.java b/src/java/com/android/ims/RcsFeatureManager.java
index e034a68d..af2298aa 100644
--- a/src/java/com/android/ims/RcsFeatureManager.java
+++ b/src/java/com/android/ims/RcsFeatureManager.java
@@ -90,16 +90,6 @@ public class RcsFeatureManager implements FeatureUpdates {
void onUnpublish();
/**
- * Notify the framework that the ImsService has refreshed the PUBLISH
- * internally, which has resulted in a new PUBLISH result.
- * <p>
- * This method must be called to notify the framework of SUCCESS (200 OK) and FAILURE (300+)
- * codes in order to keep the AOSP stack up to date.
- */
- void onPublishUpdated(int reasonCode, String reasonPhrase,
- int reasonHeaderCause, String reasonHeaderText);
-
- /**
* Receive a capabilities request from the remote client.
*/
void onRemoteCapabilityRequest(Uri contactUri,
@@ -123,13 +113,6 @@ public class RcsFeatureManager implements FeatureUpdates {
}
@Override
- public void onPublishUpdated(int reasonCode, String reasonPhrase,
- int reasonHeaderCause, String reasonHeaderText) {
- mCapabilityEventCallback.forEach(callback -> callback.onPublishUpdated(
- reasonCode, reasonPhrase, reasonHeaderCause, reasonHeaderText));
- }
-
- @Override
public void onRemoteCapabilityRequest(Uri contactUri,
List<String> remoteCapabilities, IOptionsRequestCallback cb) {
mCapabilityEventCallback.forEach(
@@ -583,9 +566,9 @@ public class RcsFeatureManager implements FeatureUpdates {
}
@Override
- public void associate(ImsFeatureContainer c, int subId) {
+ public void associate(ImsFeatureContainer c) {
IImsRcsFeature f = IImsRcsFeature.Stub.asInterface(c.imsFeature);
- mRcsFeatureConnection = new RcsFeatureConnection(mContext, mSlotId, subId, f, c.imsConfig,
+ mRcsFeatureConnection = new RcsFeatureConnection(mContext, mSlotId, f, c.imsConfig,
c.imsRegistration, c.sipTransport);
}
diff --git a/src/java/com/android/ims/rcs/uce/UceController.java b/src/java/com/android/ims/rcs/uce/UceController.java
index 6fb27b06..c6099097 100644
--- a/src/java/com/android/ims/rcs/uce/UceController.java
+++ b/src/java/com/android/ims/rcs/uce/UceController.java
@@ -80,23 +80,11 @@ 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.
*/
void saveCapabilities(List<RcsContactUceCapability> contactCapabilities);
@@ -212,13 +200,11 @@ public class UceController {
private static class CachedCapabilityEvent {
private Optional<Integer> mRequestPublishCapabilitiesEvent;
private Optional<Boolean> mUnpublishEvent;
- private Optional<SomeArgs> mPublishUpdatedEvent;
private Optional<SomeArgs> mRemoteCapabilityRequestEvent;
public CachedCapabilityEvent() {
mRequestPublishCapabilitiesEvent = Optional.empty();
mUnpublishEvent = Optional.empty();
- mPublishUpdatedEvent = Optional.empty();
mRemoteCapabilityRequestEvent = Optional.empty();
}
@@ -237,19 +223,6 @@ public class UceController {
}
/**
- * Cache the publish update event triggered by the ImsService.
- */
- public synchronized void setOnPublishUpdatedEvent(int reasonCode, String reasonPhrase,
- int reasonHeaderCause, String reasonHeaderText) {
- SomeArgs args = SomeArgs.obtain();
- args.arg1 = reasonCode;
- args.arg2 = reasonPhrase;
- args.arg3 = reasonHeaderCause;
- args.arg4 = reasonHeaderText;
- mPublishUpdatedEvent = Optional.of(args);
- }
-
- /**
* Cache the remote capability request event triggered by the ImsService.
*/
public synchronized void setRemoteCapabilityRequestEvent(Uri contactUri,
@@ -271,11 +244,6 @@ public class UceController {
return mUnpublishEvent;
}
- /** @Return the cached pubilsh update event */
- public synchronized Optional<SomeArgs> getPublishUpdatedEvent() {
- return mPublishUpdatedEvent;
- }
-
/** @Return the cached remote capability request event */
public synchronized Optional<SomeArgs> getRemoteCapabilityRequestEvent() {
return mRemoteCapabilityRequestEvent;
@@ -285,8 +253,6 @@ public class UceController {
public synchronized void clear() {
mRequestPublishCapabilitiesEvent = Optional.empty();
mUnpublishEvent = Optional.empty();
- mPublishUpdatedEvent.ifPresent(args -> args.recycle());
- mPublishUpdatedEvent = Optional.empty();
mRemoteCapabilityRequestEvent.ifPresent(args -> args.recycle());
mRemoteCapabilityRequestEvent = Optional.empty();
}
@@ -489,15 +455,6 @@ public class UceController {
Optional<Boolean> unpublishEvent = mCachedCapabilityEvent.getUnpublishEvent();
unpublishEvent.ifPresent(unpublish -> onUnpublish());
- Optional<SomeArgs> publishUpdatedEvent = mCachedCapabilityEvent.getPublishUpdatedEvent();
- publishUpdatedEvent.ifPresent(args -> {
- int reasonCode = (Integer) args.arg1;
- String reasonPhrase = (String) args.arg2;
- int reasonHeaderCause = (Integer) args.arg3;
- String reasonHeaderText = (String) args.arg4;
- onPublishUpdated(reasonCode, reasonPhrase, reasonHeaderCause, reasonHeaderText);
- });
-
Optional<SomeArgs> remoteRequest = mCachedCapabilityEvent.getRemoteCapabilityRequestEvent();
remoteRequest.ifPresent(args -> {
Uri contactUri = (Uri) args.arg1;
@@ -519,21 +476,11 @@ public class UceController {
}
@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);
}
@@ -606,18 +553,6 @@ public class UceController {
}
@Override
- public void onPublishUpdated(int reasonCode, String reasonPhrase,
- int reasonHeaderCause, String reasonHeaderText) {
- if (isRcsConnecting()) {
- mCachedCapabilityEvent.setOnPublishUpdatedEvent(reasonCode, reasonPhrase,
- reasonHeaderCause, reasonHeaderText);
- return;
- }
- UceController.this.onPublishUpdated(reasonCode, reasonPhrase,
- reasonHeaderCause, reasonHeaderText);
- }
-
- @Override
public void onRemoteCapabilityRequest(Uri contactUri,
List<String> remoteCapabilities, IOptionsRequestCallback cb) {
if (contactUri == null || remoteCapabilities == null || cb == null) {
@@ -737,17 +672,6 @@ public class UceController {
}
/**
- * This method is triggered by the ImsService to notify framework that the device's
- * publish status has been changed.
- */
- public void onPublishUpdated(int reasonCode, String reasonPhrase,
- int reasonHeaderCause, String reasonHeaderText) {
- logi("onPublishUpdated");
- mPublishController.onPublishUpdated(reasonCode, reasonPhrase,
- reasonHeaderCause, reasonHeaderText);
- }
-
- /**
* Request publish the device's capabilities. This request is from the ImsService to send the
* capabilities to the remote side.
*/
@@ -760,9 +684,8 @@ public class UceController {
/**
* Register a {@link PublishStateCallback} to receive the published state changed.
*/
- public void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c,
- boolean supportPublishingState) {
- mPublishController.registerPublishStateCallback(c, supportPublishingState);
+ public void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c) {
+ mPublishController.registerPublishStateCallback(c);
}
/**
@@ -775,8 +698,8 @@ public class UceController {
/**
* Get the UCE publish state if the PUBLISH is supported by the carrier.
*/
- public @PublishState int getUcePublishState(boolean isSupportPublishingState) {
- return mPublishController.getUcePublishState(isSupportPublishingState);
+ public @PublishState int getUcePublishState() {
+ return mPublishController.getUcePublishState();
}
/**
@@ -832,7 +755,6 @@ public class UceController {
public void removeRequestDisallowedStatus() {
logd("removeRequestDisallowedStatus");
mDeviceState.resetDeviceState();
- mRequestManager.resetThrottlingList();
}
/**
diff --git a/src/java/com/android/ims/rcs/uce/UceDeviceState.java b/src/java/com/android/ims/rcs/uce/UceDeviceState.java
index 93445dbf..773726a6 100644
--- a/src/java/com/android/ims/rcs/uce/UceDeviceState.java
+++ b/src/java/com/android/ims/rcs/uce/UceDeviceState.java
@@ -64,18 +64,11 @@ public class UceDeviceState {
*/
private static final int DEVICE_STATE_BAD_EVENT = 3;
- /**
- * The device will be in the NO_RETRY error state when the PUBLISH request fails and the
- * SIP code is 413 REQUEST ENTITY TOO LARGE.
- */
- private static final int DEVICE_STATE_NO_RETRY = 4;
-
@IntDef(value = {
DEVICE_STATE_OK,
DEVICE_STATE_FORBIDDEN,
DEVICE_STATE_PROVISION_ERROR,
DEVICE_STATE_BAD_EVENT,
- DEVICE_STATE_NO_RETRY,
}, prefix="DEVICE_STATE_")
@Retention(RetentionPolicy.SOURCE)
public @interface DeviceStateType {}
@@ -86,7 +79,6 @@ public class UceDeviceState {
DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_FORBIDDEN, "DEVICE_STATE_FORBIDDEN");
DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_PROVISION_ERROR, "DEVICE_STATE_PROVISION_ERROR");
DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_BAD_EVENT, "DEVICE_STATE_BAD_EVENT");
- DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_NO_RETRY, "DEVICE_STATE_NO_RETRY");
}
/**
@@ -120,18 +112,6 @@ public class UceDeviceState {
}
}
- /**
- * Check current state to see if only the PUBLISH request is allowed to be executed.
- */
- public boolean isPublishRequestBlocked() {
- switch(mDeviceState) {
- case DEVICE_STATE_NO_RETRY:
- return true;
- default:
- return false;
- }
- }
-
public int getDeviceState() {
return mDeviceState;
}
@@ -255,16 +235,17 @@ public class UceDeviceState {
// Update the device state based on the given sip code.
switch (sipCode) {
case NetworkSipCode.SIP_CODE_FORBIDDEN: // sip 403
- case NetworkSipCode.SIP_CODE_SERVER_TIMEOUT: // sip 504
if (requestType == UceController.REQUEST_TYPE_PUBLISH) {
// Provisioning error for publish request.
setDeviceState(DEVICE_STATE_PROVISION_ERROR);
- updateErrorCode(sipCode, reason, requestType);
- // There is no request retry time for SIP code 403
- removeRequestRetryTime();
- // No timer to exit the forbidden state.
- removeExitStateTimer();
+ } 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
@@ -295,22 +276,6 @@ public class UceDeviceState {
// Reset the device state when the network response is OK.
resetInternal();
break;
-
- case NetworkSipCode.SIP_CODE_REQUEST_ENTITY_TOO_LARGE: // sip 413
- case NetworkSipCode.SIP_CODE_TEMPORARILY_UNAVAILABLE: // sip 480
- case NetworkSipCode.SIP_CODE_BUSY: // sip 486
- case NetworkSipCode.SIP_CODE_SERVER_INTERNAL_ERROR: // sip 500
- case NetworkSipCode.SIP_CODE_SERVICE_UNAVAILABLE: // sip 503
- case NetworkSipCode.SIP_CODE_BUSY_EVERYWHERE: // sip 600
- case NetworkSipCode.SIP_CODE_DECLINE: // sip 603
- if (requestType == UceController.REQUEST_TYPE_PUBLISH) {
- setDeviceState(DEVICE_STATE_NO_RETRY);
- // There is no request retry time for SIP code 413
- removeRequestRetryTime();
- // No timer to exit this state.
- removeExitStateTimer();
- }
- break;
}
// Get the updated device state.
diff --git a/src/java/com/android/ims/rcs/uce/UceStatsWriter.java b/src/java/com/android/ims/rcs/uce/UceStatsWriter.java
deleted file mode 100644
index 1db9040c..00000000
--- a/src/java/com/android/ims/rcs/uce/UceStatsWriter.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce;
-
-import android.annotation.IntDef;
-import android.telephony.ims.stub.ImsRegistrationImplBase;
-import android.telephony.ims.stub.RcsCapabilityExchangeImplBase;
-import android.telephony.ims.RcsContactPresenceTuple;
-import android.telephony.ims.RcsContactUceCapability;
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-/**
- * The UceStatsWriter should be a singleton class for storing atoms in RcsStats.
- * ims-common provides an interface for setting atoms to telephony-common.
- **/
-public class UceStatsWriter {
- private static UceStatsWriter sInstance = null;
- private UceStatsCallback mCallBack;
-
- /**
- * @hide
- */
- // Defines which UCE event occurred.
- @IntDef(value = {
- PUBLISH_EVENT,
- SUBSCRIBE_EVENT,
- INCOMING_OPTION_EVENT,
- OUTGOING_OPTION_EVENT
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface UceEventType {}
- /**
- * UCE events related to Publish Method.
- */
- public static final int PUBLISH_EVENT = 0;
- /**
- * UCE events related to Subscribe Method.
- */
- public static final int SUBSCRIBE_EVENT = 1;
- /**
- * UCE events related to incoming Options Method.
- */
- public static final int INCOMING_OPTION_EVENT = 2;
- /**
- * UCE events related to outgoing Options Method.
- */
- public static final int OUTGOING_OPTION_EVENT = 3;
-
- /**
- * The callback interface is called by the Metrics data creator to receive information from
- * others controllers.
- */
- public interface UceStatsCallback {
- /**
- * Notify the callback listener that the feature tag associated with
- * IMS registration of this device have changed.
- */
- public void onImsRegistrationFeatureTagStats(int subId, List<String> featureTagList,
- int registrationTech);
-
- /**
- * Notify that the active IMS registration to the carrier network has been terminated.
- */
- public void onStoreCompleteImsRegistrationFeatureTagStats(int subId);
-
- /**
- * Notify the callback listener that the PIDF ServiceDescriptions associated with
- * the UCE presence of this device have changed.
- */
- void onImsRegistrationServiceDescStats(int subId, List<String> serviceIdList,
- List<String> serviceIdVersionList, int registrationTech);
-
- /**
- * Notify the callback listener that a subscribe response received.
- */
- void onSubscribeResponse(int subId, long taskId, int networkResponse);
-
- /**
- * Notify the callback listener that a UCE Network Event has occurred.
- */
- void onUceEvent(int subId, int type, boolean successful, int commandCode,
- int networkResponse);
-
- /**
- * Notify the callback listener that a subscribe has ended.
- */
- void onSubscribeTerminated(int subId, long taskId, String reason);
-
- /**
- * Notify that the Presence Notify Event has changed.
- */
- void onPresenceNotifyEvent(int subId, long taskId,
- List<RcsContactUceCapability> updatedCapList);
-
- /**
- * Notify that the active UCE PUBLISH to the carrier network has been terminated.
- */
- void onStoreCompleteImsRegistrationServiceDescStats(int subId);
- }
-
- /**
- * create an instance of UceStatsWriter
- */
- public static UceStatsWriter init(UceStatsCallback callback) {
- synchronized (UceStatsWriter.class) {
- if (sInstance == null) {
- sInstance = new UceStatsWriter(callback);
- }
- return sInstance;
- }
- }
-
- /**
- * get the current instance of UceStatsWriter
- */
- public static UceStatsWriter getInstance() {
- synchronized (UceStatsWriter.class) {
- return sInstance;
- }
- }
-
- /**
- * Stats about each Feature tag that was included in IMS registration received from
- * the network during register.
- * @param subId The subId associated with the event.
- * @param featureTagList Ims Feature tag list.
- * @param registrationTech The registration tech associated with the feature tag.
- */
- public void setImsRegistrationFeatureTagStats(int subId, List<String> featureTagList,
- @ImsRegistrationImplBase.ImsRegistrationTech int registrationTech) {
- if (mCallBack == null) {
- return;
- }
- mCallBack.onImsRegistrationFeatureTagStats(subId, featureTagList, registrationTech);
- }
-
- /**
- * Update time of stats for each stored feature tag.
- * @param subId The subId associated with the event.
- */
- public void setStoreCompleteImsRegistrationFeatureTagStats(int subId) {
- if (mCallBack == null) {
- return;
- }
- mCallBack.onStoreCompleteImsRegistrationFeatureTagStats(subId);
- }
-
- /**
- * Stats about each ServiceDescription that was included in the PIDF XML sent to
- * the network during publish
- * @param subId The subId associated with the event.
- * @param tupleList Tuple information set in PIDF.
- * @param registrationTech The registration tech associated with the feature tag.
- */
- public void setImsRegistrationServiceDescStats(int subId,
- List<RcsContactPresenceTuple> tupleList,
- @ImsRegistrationImplBase.ImsRegistrationTech int registrationTech) {
- if (mCallBack == null) {
- return;
- }
- ArrayList<String> svcId = new ArrayList<>();
- ArrayList<String> svcVersion = new ArrayList<>();
-
- for (RcsContactPresenceTuple tuple : tupleList) {
- svcId.add(tuple.getServiceId());
- svcVersion.add(tuple.getServiceVersion());
- }
- mCallBack.onImsRegistrationServiceDescStats(subId, svcId, svcVersion, registrationTech);
- }
-
- /**
- * Stats related to UCE queries to the network
- * @param subId The subId associated with the event.
- * @param taskId The taskId associate with the event.
- * @param networkResponse The network response code for the Uce event
- */
- public void setSubscribeResponse(int subId, long taskId, int networkResponse) {
- if (mCallBack != null) {
- mCallBack.onSubscribeResponse(subId, taskId, networkResponse);
- }
- }
-
- /**
- * Stats related to UCE queries to the network
- * @param subId The subId associated with the event.
- * @param type Used to identify the message type.
- * @param successful Whether the UCE event is successfully finished.
- * @param commandCode The command error code for the Uce event
- * @param networkResponse The network response code for the Uce event
- */
- public void setUceEvent(int subId, @UceEventType int type, boolean successful,
- @RcsCapabilityExchangeImplBase.CommandCode int commandCode, int networkResponse) {
- if (mCallBack != null) {
- mCallBack.onUceEvent(subId, type, successful, commandCode, networkResponse);
- }
- }
-
- /**
- * The result of processing received notify messages.
- * @param subId The subId associated with the event.
- * @param taskId The taskId associate with the event.
- * @param updatedCapList Capability information of the user contained in Presence Notify.
- */
- public void setPresenceNotifyEvent(int subId, long taskId,
- List<RcsContactUceCapability> updatedCapList) {
- if (mCallBack == null || updatedCapList == null || updatedCapList.isEmpty()) {
- return;
- }
- mCallBack.onPresenceNotifyEvent(subId, taskId, updatedCapList);
- }
-
- /**
- * Indicates that the subscription request has become a terminated state.
- * @param subId The subId associated with the event.
- * @param taskId The taskId associate with the event.
- * @param reason The terminated reason associated with the subscription state.
- */
- public void setSubscribeTerminated(int subId, long taskId, String reason) {
- if (mCallBack != null) {
- mCallBack.onSubscribeTerminated(subId, taskId, reason);
- }
- }
-
- /**
- * indicates that the device has removed an existing PUBLISH from the carrier's network
- * containing the device's RCS capabilities state.
- * The registered time of publication must be set in ImsRegistrationServiceDescStats,
- * which is the life time of publication, so it can be set only when publication is over.
- * @param subId The subId associated with the event.
- */
- public void setUnPublish(int subId) {
- if (mCallBack != null) {
- mCallBack.onStoreCompleteImsRegistrationServiceDescStats(subId);
- }
- }
-
- @VisibleForTesting
- protected UceStatsWriter(UceStatsCallback callback) {
- mCallBack = callback;
- }
-}
diff --git a/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java b/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java
index b4406fdd..6d3eabf3 100644
--- a/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java
+++ b/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java
@@ -59,6 +59,7 @@ public final class EabBulkCapabilityUpdater {
private final AlarmManager.OnAlarmListener mCapabilityExpiredListener;
private final ContactChangedListener mContactProviderListener;
private final EabSettingsListener mEabSettingListener;
+ private final BroadcastReceiver mCarrierConfigChangedListener;
private final EabControllerImpl mEabControllerImpl;
private final EabContactSyncController mEabContactSyncController;
@@ -134,6 +135,28 @@ public final class EabBulkCapabilityUpdater {
}
}
+ /**
+ * Listen carrier config changed to prevent this instance created before carrier config loaded.
+ */
+ private class CarrierConfigChangedListener extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ boolean isSupportBulkCapabilityExchange = getBooleanCarrierConfig(
+ CarrierConfigManager.Ims.KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL, mSubId);
+
+ Log.d(TAG, "Carrier config changed. "
+ + "isCarrierConfigEnabled: " + mIsCarrierConfigEnabled
+ + ", isSupportBulkCapabilityExchange: " + isSupportBulkCapabilityExchange);
+ if (!mIsCarrierConfigEnabled && isSupportBulkCapabilityExchange) {
+ enableBulkCapability();
+ updateExpiredTimeAlert();
+ mIsCarrierConfigEnabled = true;
+ } else if (mIsCarrierConfigEnabled && !isSupportBulkCapabilityExchange) {
+ onDestroy();
+ }
+ }
+ }
+
private IRcsUceControllerCallback mRcsUceControllerCallback = new IRcsUceControllerCallback() {
@Override
public void onCapabilitiesReceived(List<RcsContactUceCapability> contactCapabilities) {
@@ -204,6 +227,7 @@ public final class EabBulkCapabilityUpdater {
mContactProviderListener = new ContactChangedListener(mHandler);
mEabSettingListener = new EabSettingsListener(mHandler);
mCapabilityExpiredListener = new CapabilityExpiredListener();
+ mCarrierConfigChangedListener = new CarrierConfigChangedListener();
Log.d(TAG, "create EabBulkCapabilityUpdater() subId: " + mSubId);
@@ -226,6 +250,7 @@ public final class EabBulkCapabilityUpdater {
registerEabUserSettingsListener();
mIsCarrierConfigEnabled = false;
} else {
+ registerCarrierConfigChanged();
Log.d(TAG, "Not support bulk capability exchange.");
}
}
@@ -396,6 +421,7 @@ public final class EabBulkCapabilityUpdater {
cancelTimeAlert(mContext);
unRegisterContactProviderListener();
unRegisterEabUserSettings();
+ unRegisterCarrierConfigChanged();
}
private void registerContactProviderListener() {
@@ -416,6 +442,14 @@ public final class EabBulkCapabilityUpdater {
mEabSettingListener);
}
+ private void registerCarrierConfigChanged() {
+ Log.d(TAG, "registerCarrierConfigChanged");
+ mIsCarrierConfigListenerRegistered = true;
+ IntentFilter FILTER_CARRIER_CONFIG_CHANGED =
+ new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
+ mContext.registerReceiver(mCarrierConfigChangedListener, FILTER_CARRIER_CONFIG_CHANGED);
+ }
+
private void unRegisterContactProviderListener() {
Log.d(TAG, "unRegisterContactProviderListener");
if (mIsContactProviderListenerRegistered) {
@@ -432,23 +466,15 @@ public final class EabBulkCapabilityUpdater {
}
}
- public void setUceRequestCallback(UceController.UceControllerCallback uceControllerCallback) {
- mUceControllerCallback = uceControllerCallback;
+ private void unRegisterCarrierConfigChanged() {
+ Log.d(TAG, "unregisterCarrierConfigChanged");
+ if (mIsCarrierConfigListenerRegistered) {
+ mIsCarrierConfigListenerRegistered = false;
+ mContext.unregisterReceiver(mCarrierConfigChangedListener);
+ }
}
- public void onCarrierConfigChanged() {
- boolean isSupportBulkCapabilityExchange = getBooleanCarrierConfig(
- CarrierConfigManager.Ims.KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL, mSubId);
-
- Log.d(TAG, "Carrier config changed. "
- + "isCarrierConfigEnabled: " + mIsCarrierConfigEnabled
- + ", isSupportBulkCapabilityExchange: " + isSupportBulkCapabilityExchange);
- if (!mIsCarrierConfigEnabled && isSupportBulkCapabilityExchange) {
- enableBulkCapability();
- updateExpiredTimeAlert();
- mIsCarrierConfigEnabled = true;
- } else if (mIsCarrierConfigEnabled && !isSupportBulkCapabilityExchange) {
- onDestroy();
- }
+ public void setUceRequestCallback(UceController.UceControllerCallback uceControllerCallback) {
+ mUceControllerCallback = uceControllerCallback;
}
}
diff --git a/src/java/com/android/ims/rcs/uce/eab/EabController.java b/src/java/com/android/ims/rcs/uce/eab/EabController.java
index b03e4659..903a19df 100644
--- a/src/java/com/android/ims/rcs/uce/eab/EabController.java
+++ b/src/java/com/android/ims/rcs/uce/eab/EabController.java
@@ -35,23 +35,11 @@ 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.
*/
void saveCapabilities(@NonNull List<RcsContactUceCapability> contactCapabilities);
diff --git a/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java b/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java
index aaab0a9f..cc1011fc 100644
--- a/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java
+++ b/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java
@@ -56,7 +56,6 @@ 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;
/**
@@ -65,10 +64,8 @@ import java.util.function.Predicate;
public class EabControllerImpl implements EabController {
private static final String TAG = "EabControllerImpl";
- // 7 days
- private static final int DEFAULT_NON_RCS_CAPABILITY_CACHE_EXPIRATION_SEC = 7 * 24 * 60 * 60;
- // 1 day
- private static final int DEFAULT_CAPABILITY_CACHE_EXPIRATION_SEC = 24 * 60 * 60;
+ // 90 days
+ private static final int DEFAULT_CAPABILITY_CACHE_EXPIRATION_SEC = 90 * 24 * 60 * 60;
private static final int DEFAULT_AVAILABILITY_CACHE_EXPIRATION_SEC = 60;
// 1 week
@@ -128,10 +125,6 @@ public class EabControllerImpl implements EabController {
// Pick up changes to CarrierConfig and run any applicable cleanup tasks associated with
// that configuration.
mCapabilityCleanupRunnable.run();
- cleanupOrphanedRows();
- if (!mIsSetDestroyedFlag) {
- mEabBulkCapabilityUpdater.onCarrierConfigChanged();
- }
}
/**
@@ -170,29 +163,6 @@ public class EabControllerImpl implements EabController {
}
/**
- * 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.
*/
@Override
@@ -209,23 +179,6 @@ public class EabControllerImpl implements EabController {
}
/**
- * 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.
*/
@Override
@@ -271,7 +224,7 @@ public class EabControllerImpl implements EabController {
c.close();
}
}
- cleanupOrphanedRows();
+
mEabBulkCapabilityUpdater.updateExpiredTimeAlert();
if (mHandler.hasCallbacks(mCapabilityCleanupRunnable)) {
@@ -281,25 +234,6 @@ public class EabControllerImpl implements EabController {
CLEAN_UP_LEGACY_CAPABILITY_DELAY_MILLI_SEC);
}
- /**
- * Cleanup the entry of common table that can't map to presence or option table
- */
- @VisibleForTesting
- public void cleanupOrphanedRows() {
- String presenceSelection =
- " (SELECT " + EabProvider.PresenceTupleColumns.EAB_COMMON_ID +
- " FROM " + EAB_PRESENCE_TUPLE_TABLE_NAME + ") ";
- String optionSelection =
- " (SELECT " + EabProvider.OptionsColumns.EAB_COMMON_ID +
- " FROM " + EAB_OPTIONS_TABLE_NAME + ") ";
-
- mContext.getContentResolver().delete(
- EabProvider.COMMON_URI,
- EabProvider.EabCommonColumns._ID + " NOT IN " + presenceSelection +
- " AND " + EabProvider.EabCommonColumns._ID+ " NOT IN " + optionSelection,
- null);
- }
-
private List<EabCapabilityResult> generateDestroyedResult(List<Uri> contactUri) {
List<EabCapabilityResult> destroyedResult = new ArrayList<>();
for (Uri uri : contactUri) {
@@ -362,62 +296,12 @@ 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) {
PresenceBuilder builder = builderWrapper.getPresenceBuilder();
- if (builder == null) {
- return;
- }
- RcsContactPresenceTuple presenceTuple = createPresenceTuple(contactUri, cursor);
- if (presenceTuple != null) {
- builder.addCapabilityTuple(presenceTuple);
+ if (builder != null) {
+ builder.addCapabilityTuple(createPresenceTuple(contactUri, cursor));
}
} else {
OptionsBuilder builder = builderWrapper.getOptionsBuilder();
@@ -436,14 +320,7 @@ public class EabControllerImpl implements EabController {
if (mechanism == CAPABILITY_MECHANISM_PRESENCE) {
PresenceBuilder builder = new PresenceBuilder(
contactUri, SOURCE_TYPE_CACHED, result);
- RcsContactPresenceTuple tuple = createPresenceTuple(contactUri, cursor);
- if (tuple != null) {
- builder.addCapabilityTuple(tuple);
- }
- String entityUri = getStringValue(cursor, EabProvider.EabCommonColumns.ENTITY_URI);
- if (!TextUtils.isEmpty(entityUri)) {
- builder.setEntityUri(Uri.parse(entityUri));
- }
+ builder.addCapabilityTuple(createPresenceTuple(contactUri, cursor));
builderWrapper.setPresenceBuilder(builder);
} else {
OptionsBuilder builder = new OptionsBuilder(contactUri, SOURCE_TYPE_CACHED);
@@ -505,34 +382,29 @@ public class EabControllerImpl implements EabController {
serviceCapabilities = serviceCapabilitiesBuilder.build();
// Create RcsContactPresenceTuple
- boolean isTupleEmpty = TextUtils.isEmpty(status) && TextUtils.isEmpty(serviceId)
- && TextUtils.isEmpty(version);
- if (!isTupleEmpty) {
- RcsContactPresenceTuple.Builder rcsContactPresenceTupleBuilder =
- new RcsContactPresenceTuple.Builder(status, serviceId, version);
- if (description != null) {
- rcsContactPresenceTupleBuilder.setServiceDescription(description);
- }
- if (contactUri != null) {
- rcsContactPresenceTupleBuilder.setContactUri(contactUri);
- }
- if (serviceCapabilities != null) {
- rcsContactPresenceTupleBuilder.setServiceCapabilities(serviceCapabilities);
- }
- if (timeStamp != null) {
- try {
- Instant instant = Instant.ofEpochSecond(Long.parseLong(timeStamp));
- rcsContactPresenceTupleBuilder.setTime(instant);
- } catch (NumberFormatException ex) {
- Log.w(TAG, "Create presence tuple: NumberFormatException");
- } catch (DateTimeParseException e) {
- Log.w(TAG, "Create presence tuple: parse timestamp failed");
- }
+ RcsContactPresenceTuple.Builder rcsContactPresenceTupleBuilder =
+ new RcsContactPresenceTuple.Builder(status, serviceId, version);
+ if (description != null) {
+ rcsContactPresenceTupleBuilder.setServiceDescription(description);
+ }
+ if (contactUri != null) {
+ rcsContactPresenceTupleBuilder.setContactUri(contactUri);
+ }
+ if (serviceCapabilities != null) {
+ rcsContactPresenceTupleBuilder.setServiceCapabilities(serviceCapabilities);
+ }
+ if (timeStamp != null) {
+ try {
+ Instant instant = Instant.ofEpochSecond(Long.parseLong(timeStamp));
+ rcsContactPresenceTupleBuilder.setTime(instant);
+ } catch (NumberFormatException ex) {
+ Log.w(TAG, "Create presence tuple: NumberFormatException");
+ } catch (DateTimeParseException e) {
+ Log.w(TAG, "Create presence tuple: parse timestamp failed");
}
- return rcsContactPresenceTupleBuilder.build();
- } else {
- return null;
}
+
+ return rcsContactPresenceTupleBuilder.build();
}
private boolean isCapabilityExpired(Cursor cursor) {
@@ -605,7 +477,7 @@ public class EabControllerImpl implements EabController {
value = carrierConfig.getInt(
CarrierConfigManager.Ims.KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT);
} else {
- value = DEFAULT_NON_RCS_CAPABILITY_CACHE_EXPIRATION_SEC;
+ value = DEFAULT_CAPABILITY_CACHE_EXPIRATION_SEC;
Log.e(TAG, "getNonRcsCapabilityCacheExpiration: " +
"CarrierConfig is null, returning default");
}
@@ -682,36 +554,12 @@ public class EabControllerImpl implements EabController {
contentValues.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, mSubId);
contentValues.put(EabProvider.EabCommonColumns.REQUEST_RESULT,
capability.getRequestResult());
- if (capability.getEntityUri() != null) {
- contentValues.put(EabProvider.EabCommonColumns.ENTITY_URI,
- capability.getEntityUri().toString());
- }
Uri result = mContext.getContentResolver().insert(EabProvider.COMMON_URI, contentValues);
int commonId = Integer.parseInt(result.getLastPathSegment());
Log.d(TAG, "Insert into common table. Id: " + commonId);
- if (capability.getCapabilityTuples().size() == 0) {
- insertEmptyTuple(commonId);
- } else {
- insertAllTuples(commonId, capability);
- }
- }
-
- private void insertEmptyTuple(int commonId) {
- Log.d(TAG, "Insert empty tuple into presence table.");
- ContentValues contentValues = new ContentValues();
- contentValues.put(EabProvider.PresenceTupleColumns.EAB_COMMON_ID, commonId);
- // Using current timestamp instead of network timestamp since there is not use cases for
- // network timestamp and the network timestamp may cause capability expire immediately.
- contentValues.put(EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP,
- mExpirationTimeFactory.getExpirationTime());
- mContext.getContentResolver().insert(EabProvider.PRESENCE_URI, contentValues);
- }
-
- private void insertAllTuples(int commonId, RcsContactUceCapability capability) {
ContentValues[] presenceContent =
new ContentValues[capability.getCapabilityTuples().size()];
-
for (int i = 0; i < presenceContent.length; i++) {
RcsContactPresenceTuple tuple = capability.getCapabilityTuples().get(i);
@@ -732,7 +580,7 @@ public class EabControllerImpl implements EabController {
}
}
- ContentValues contentValues = new ContentValues();
+ contentValues = new ContentValues();
contentValues.put(EabProvider.PresenceTupleColumns.EAB_COMMON_ID, commonId);
contentValues.put(EabProvider.PresenceTupleColumns.BASIC_STATUS, tuple.getStatus());
contentValues.put(EabProvider.PresenceTupleColumns.SERVICE_ID, tuple.getServiceId());
@@ -823,6 +671,7 @@ public class EabControllerImpl implements EabController {
cleanupCapabilities(rcsCapabilitiesExpiredTime, getRcsCommonIdList());
cleanupCapabilities(nonRcsCapabilitiesExpiredTime, getNonRcsCommonIdList());
+ cleanupOrphanedRows();
}
private void cleanupCapabilities(long rcsCapabilitiesExpiredTime, List<Integer> commonIdList) {
@@ -890,6 +739,24 @@ public class EabControllerImpl implements EabController {
return list;
}
+ /**
+ * Cleanup the entry of common table that can't map to presence or option table
+ */
+ private void cleanupOrphanedRows() {
+ String presenceSelection =
+ " (SELECT " + EabProvider.PresenceTupleColumns.EAB_COMMON_ID +
+ " FROM " + EAB_PRESENCE_TUPLE_TABLE_NAME + ") ";
+ String optionSelection =
+ " (SELECT " + EabProvider.OptionsColumns.EAB_COMMON_ID +
+ " FROM " + EAB_OPTIONS_TABLE_NAME + ") ";
+
+ mContext.getContentResolver().delete(
+ EabProvider.COMMON_URI,
+ EabProvider.EabCommonColumns._ID + " NOT IN " + presenceSelection +
+ " AND " + EabProvider.EabCommonColumns._ID+ " NOT IN " + optionSelection,
+ null);
+ }
+
private String getStringValue(Cursor cursor, String column) {
return cursor.getString(cursor.getColumnIndex(column));
}
diff --git a/src/java/com/android/ims/rcs/uce/eab/EabProvider.java b/src/java/com/android/ims/rcs/uce/eab/EabProvider.java
index e2a83086..da70349a 100644
--- a/src/java/com/android/ims/rcs/uce/eab/EabProvider.java
+++ b/src/java/com/android/ims/rcs/uce/eab/EabProvider.java
@@ -81,7 +81,7 @@ public class EabProvider extends ContentProvider {
public static final String AUTHORITY = "eab";
private static final String TAG = "EabProvider";
- private static final int DATABASE_VERSION = 4;
+ private static final int DATABASE_VERSION = 3;
public static final String EAB_CONTACT_TABLE_NAME = "eab_contact";
public static final String EAB_COMMON_TABLE_NAME = "eab_common";
@@ -205,13 +205,6 @@ public class EabProvider extends ContentProvider {
* <P>Type: INTEGER</P>
*/
public static final String SUBSCRIPTION_ID = "subscription_id";
-
- /**
- * The value of the 'entity' attribute is the 'pres' URL of the PRESENTITY publishing
- * presence document
- * <P>Type: TEXT</P>
- */
- public static final String ENTITY_URI = "entity_uri";
}
/**
@@ -361,8 +354,7 @@ public class EabProvider extends ContentProvider {
+ EabCommonColumns.EAB_CONTACT_ID + " INTEGER DEFAULT -1, "
+ EabCommonColumns.MECHANISM + " INTEGER DEFAULT NULL, "
+ EabCommonColumns.REQUEST_RESULT + " INTEGER DEFAULT -1, "
- + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1, "
- + EabCommonColumns.ENTITY_URI + " TEXT DEFAULT NULL "
+ + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1 "
+ ");";
@VisibleForTesting
@@ -455,12 +447,6 @@ public class EabProvider extends ContentProvider {
sqLiteDatabase.execSQL("ALTER TABLE temp RENAME TO " + EAB_COMMON_TABLE_NAME + ";");
oldVersion = 3;
}
-
- if (oldVersion < 4) {
- sqLiteDatabase.execSQL("ALTER TABLE " + EAB_COMMON_TABLE_NAME + " ADD COLUMN "
- + EabCommonColumns.ENTITY_URI + " Text DEFAULT NULL;");
- oldVersion = 4;
- }
}
}
diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java
index 10b43a56..dc2dc045 100644
--- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java
+++ b/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java
@@ -21,10 +21,10 @@ import android.net.Uri;
import android.telephony.ims.RcsContactPresenceTuple;
import android.telephony.ims.RcsContactPresenceTuple.ServiceCapabilities;
import android.telephony.ims.RcsContactUceCapability;
+import android.telephony.ims.RcsContactUceCapability.PresenceBuilder;
import android.text.TextUtils;
import android.util.Log;
-
import com.android.ims.rcs.uce.presence.pidfparser.capabilities.Audio;
import com.android.ims.rcs.uce.presence.pidfparser.capabilities.CapsConstant;
import com.android.ims.rcs.uce.presence.pidfparser.capabilities.Duplex;
@@ -35,7 +35,6 @@ import com.android.ims.rcs.uce.presence.pidfparser.pidf.Basic;
import com.android.ims.rcs.uce.presence.pidfparser.pidf.PidfConstant;
import com.android.ims.rcs.uce.presence.pidfparser.pidf.Presence;
import com.android.ims.rcs.uce.presence.pidfparser.pidf.Tuple;
-import com.android.ims.rcs.uce.presence.pidfparser.RcsContactUceCapabilityWrapper;
import com.android.ims.rcs.uce.util.UceUtils;
import com.android.internal.annotations.VisibleForTesting;
@@ -121,12 +120,11 @@ public class PidfParser {
}
/**
- * Get the RcsContactUceCapabilityWrapper from the given PIDF xml format.
+ * Get the RcsContactUceCapability from the given PIDF xml format.
*/
- public static @Nullable RcsContactUceCapabilityWrapper getRcsContactUceCapabilityWrapper(
- String pidf) {
+ public static @Nullable RcsContactUceCapability getRcsContactUceCapability(String pidf) {
if (TextUtils.isEmpty(pidf)) {
- Log.w(LOG_TAG, "getRcsContactUceCapabilityWrapper: The given pidf is empty");
+ Log.w(LOG_TAG, "getRcsContactUceCapability: The given pidf is empty");
return null;
}
@@ -134,7 +132,7 @@ public class PidfParser {
Matcher matcher = PIDF_PATTERN.matcher(pidf);
String formattedPidf = matcher.replaceAll("");
if (TextUtils.isEmpty(formattedPidf)) {
- Log.w(LOG_TAG, "getRcsContactUceCapabilityWrapper: The formatted pidf is empty");
+ Log.w(LOG_TAG, "getRcsContactUceCapability: The formatted pidf is empty");
return null;
}
@@ -149,7 +147,7 @@ public class PidfParser {
// Start parsing
Presence presence = parsePidf(parser);
- // Convert from the Presence to the RcsContactUceCapabilityWrapper
+ // Convert from the Presence to the RcsContactUceCapability
return convertToRcsContactUceCapability(presence);
} catch (XmlPullParserException | IOException e) {
@@ -170,12 +168,10 @@ public class PidfParser {
XmlPullParserException {
Presence presence = null;
int nextType = parser.next();
- boolean findPresenceTag = false;
do {
// Find the Presence start tag
if (nextType == XmlPullParser.START_TAG
&& Presence.ELEMENT_NAME.equals(parser.getName())) {
- findPresenceTag = true;
presence = new Presence();
presence.parse(parser);
break;
@@ -183,18 +179,13 @@ public class PidfParser {
nextType = parser.next();
} while(nextType != XmlPullParser.END_DOCUMENT);
- if (!findPresenceTag) {
- Log.w(LOG_TAG, "parsePidf: The presence start tag not found.");
- }
-
return presence;
}
/*
- * Convert the given Presence to the RcsContactUceCapabilityWrapper
+ * Convert the given Presence to the RcsContactUceCapability
*/
- private static RcsContactUceCapabilityWrapper convertToRcsContactUceCapability(
- Presence presence) {
+ private static RcsContactUceCapability convertToRcsContactUceCapability(Presence presence) {
if (presence == null) {
Log.w(LOG_TAG, "convertToRcsContactUceCapability: The presence is null");
return null;
@@ -204,24 +195,19 @@ public class PidfParser {
return null;
}
- RcsContactUceCapabilityWrapper uceCapabilityWrapper = new RcsContactUceCapabilityWrapper(
- Uri.parse(presence.getEntity()), RcsContactUceCapability.SOURCE_TYPE_NETWORK,
+ PresenceBuilder presenceBuilder = new PresenceBuilder(Uri.parse(presence.getEntity()),
+ RcsContactUceCapability.SOURCE_TYPE_NETWORK,
RcsContactUceCapability.REQUEST_RESULT_FOUND);
// Add all the capability tuples of this contact
presence.getTupleList().forEach(tuple -> {
- // The tuple that fails parsing is invalid data, so discard it.
- if (!tuple.getMalformed()) {
- RcsContactPresenceTuple capabilityTuple = getRcsContactPresenceTuple(tuple);
- if (capabilityTuple != null) {
- uceCapabilityWrapper.addCapabilityTuple(capabilityTuple);
- }
- } else {
- uceCapabilityWrapper.setMalformedContents();
+ RcsContactPresenceTuple capabilityTuple = getRcsContactPresenceTuple(tuple);
+ if (capabilityTuple != null) {
+ presenceBuilder.addCapabilityTuple(capabilityTuple);
}
});
- uceCapabilityWrapper.setEntityUri(Uri.parse(presence.getEntity()));
- return uceCapabilityWrapper;
+
+ return presenceBuilder.build();
}
/*
diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils.java
index d43819ec..f2b21bd0 100644
--- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils.java
+++ b/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils.java
@@ -284,16 +284,6 @@ public class PidfParserUtils {
}
/**
- * Get the malformed status from the given tuple.
- */
- public static boolean getTupleMalformedStatus(Tuple tuple) {
- if (tuple == null) {
- return false;
- }
- return tuple.getMalformed();
- }
-
- /**
* Get the terminated capability which disable all the capabilities.
*/
public static RcsContactUceCapability getTerminatedCapability(Uri contact, String reason) {
diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapper.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapper.java
deleted file mode 100644
index 3b2f163f..00000000
--- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapper.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce.presence.pidfparser;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.net.Uri;
-
-import android.telephony.ims.RcsContactPresenceTuple;
-import android.telephony.ims.RcsContactUceCapability;
-import android.telephony.ims.RcsContactUceCapability.PresenceBuilder;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A wrapper class that uses the parsed information to construct {@link RcsContactUceCapability}
- * instances.
- */
-
-public class RcsContactUceCapabilityWrapper {
- private final Uri mContactUri;
- private final int mSourceType;
- private final int mRequestResult;
- private boolean mIsMalformed;
- private final List<RcsContactPresenceTuple> mPresenceTuples = new ArrayList<>();
- private Uri mEntityUri;
-
- /**
- * Create the wrapper, which can be used to set UCE capabilities as well as custom
- * capability extensions.
- * @param contact The contact URI that the capabilities are attached to.
- * @param sourceType The type where the capabilities of this contact were retrieved from.
- * @param requestResult the request result
- */
- public RcsContactUceCapabilityWrapper(@NonNull Uri contact, int sourceType, int requestResult) {
- mContactUri = contact;
- mSourceType = sourceType;
- mRequestResult = requestResult;
- mIsMalformed = false;
- }
-
- /**
- * Add the {@link RcsContactPresenceTuple} into the presence tuple list.
- * @param tuple The {@link RcsContactPresenceTuple} to be added into.
- */
- public void addCapabilityTuple(@NonNull RcsContactPresenceTuple tuple) {
- mPresenceTuples.add(tuple);
- }
-
- /**
- * This flag is set if at least one tuple could not be parsed due to malformed contents.
- */
- public void setMalformedContents() {
- mIsMalformed = true;
- }
-
- /**
- * Set the entity URI related to the contact whose capabilities were requested.
- * @param entityUri the 'pres' URL of the PRESENTITY publishing presence document.
- */
- public void setEntityUri(@NonNull Uri entityUri) {
- mEntityUri = entityUri;
- }
-
- /**
- * Whether the XML is malformed.
- * @return {@code true} if all of the presence tuple information associated with
- * the entity URI ({@link #getEntityUri}) is malformed and there is no tuple info
- * available. If one or more of the tuples are still well-formed after parsing the
- * XML, this method will return {@code false}.
- */
- public boolean isMalformed() {
- if (mIsMalformed == false) {
- return false;
- }
- if (mPresenceTuples.isEmpty()) {
- return true;
- }
- return false;
- }
-
- /**
- * Retrieve the entity URI of the contact whose presence information is being requested for.
- * @return the URI representing the 'pres' URL of the PRESENTITY publishing presence document
- * or {@code null} if the entity uri does not exist in the presence document.
- */
- public @Nullable Uri getEntityUri() {
- return mEntityUri;
- }
-
- /**
- * @return a new RcsContactUceCapability instance from the contents of this wrapper.
- */
- public @NonNull RcsContactUceCapability toRcsContactUceCapability() {
-
- PresenceBuilder presenceBuilder = new PresenceBuilder(mContactUri,
- mSourceType, mRequestResult);
-
- // Add all the capability tuples of this contact
- presenceBuilder.addCapabilityTuples(mPresenceTuples);
- presenceBuilder.setEntityUri(mEntityUri);
- return presenceBuilder.build();
- }
-}
diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Presence.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Presence.java
index b2173145..e9a40a84 100644
--- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Presence.java
+++ b/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Presence.java
@@ -18,11 +18,8 @@ package com.android.ims.rcs.uce.presence.pidfparser.pidf;
import android.annotation.NonNull;
import android.net.Uri;
-import android.text.TextUtils;
-import android.util.Log;
import com.android.ims.rcs.uce.presence.pidfparser.ElementBase;
-import com.android.ims.rcs.uce.util.UceUtils;
import com.android.internal.annotations.VisibleForTesting;
import org.xmlpull.v1.XmlPullParser;
@@ -44,7 +41,6 @@ public class Presence extends ElementBase {
* 2: Any number (including 0) of <note> elements
* 3: Any number of OPTIONAL extension elements from other namespaces.
*/
- private static final String LOG_TAG = UceUtils.getLogPrefix() + "Presence";
/** The name of this element */
public static final String ELEMENT_NAME = "presence";
@@ -137,9 +133,6 @@ public class Presence extends ElementBase {
}
mEntity = parser.getAttributeValue(XmlPullParser.NO_NAMESPACE, ATTRIBUTE_NAME_ENTITY);
- if (TextUtils.isEmpty(mEntity)) {
- throw new XmlPullParserException("Entity uri of presence is empty");
- }
// Move to the next event.
int eventType = parser.next();
@@ -153,24 +146,11 @@ public class Presence extends ElementBase {
if (isTupleElement(eventType, tagName)) {
Tuple tuple = new Tuple();
- try {
- // If one tuple encounters an xml exception, we must parse the other tuple
- // and store valid information.
- tuple.parse(parser);
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- Log.w(LOG_TAG, "parse: Exception occurred during Tuple parsing.");
- tuple.setMalformed(true);
- }
+ tuple.parse(parser);
mTupleList.add(tuple);
} else if (isNoteElement(eventType, tagName)) {
Note note = new Note();
- try {
- note.parse(parser);
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- Log.w(LOG_TAG, "parse: Exception occurred during Note parsing.");
- }
+ note.parse(parser);
mNoteList.add(note);
}
}
diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Tuple.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Tuple.java
index e2744660..014dbed0 100644
--- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Tuple.java
+++ b/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Tuple.java
@@ -59,11 +59,8 @@ public class Tuple extends ElementBase {
private List<Note> mNoteList = new ArrayList<>();
private Timestamp mTimestamp;
- private boolean mMalformed;
-
public Tuple() {
mId = getTupleId();
- mMalformed = false;
}
@Override
@@ -124,14 +121,6 @@ public class Tuple extends ElementBase {
return mTimestamp;
}
- public void setMalformed(boolean malformed) {
- mMalformed = malformed;
- }
-
- public boolean getMalformed() {
- return mMalformed;
- }
-
@Override
public void serialize(XmlSerializer serializer) throws IOException {
String namespace = getNamespace();
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 dc794331..16d6cea2 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
@@ -20,7 +20,6 @@ import static android.telephony.ims.RcsContactUceCapability.SOURCE_TYPE_CACHED;
import android.content.Context;
import android.net.Uri;
-import android.telecom.PhoneAccount;
import android.telecom.TelecomManager;
import android.telephony.AccessNetworkConstants;
import android.telephony.ims.ImsRegistrationAttributes;
@@ -144,7 +143,7 @@ public class DeviceCapabilityInfo {
}
public synchronized boolean isImsRegistered() {
- return mMmtelRegistered || mRcsRegistered;
+ return mMmtelRegistered;
}
/**
@@ -274,33 +273,10 @@ public class DeviceCapabilityInfo {
}
/**
- * Get the first URI from the "p-associated-uri" header included in the IMS registration
- * response.
- * @param preferTelUri If {@code true}, prefer returning the first TEL URI. If no TEL
- * URIs exist, this method will still return the preferred (first) SIP URI
- * in the header. If {@code false}, we will return the first URI
- * in the "p-associated-uri" header, independent of the URI scheme.
+ * Get the IMS associated URI. It will first get the uri of MMTEL if it is not empty, otherwise
+ * it will try to get the uri of RCS. The null will be returned if both MMTEL and RCS are empty.
*/
- public synchronized Uri getImsAssociatedUri(boolean preferTelUri) {
- if (preferTelUri) {
- if (!mRcsAssociatedUris.isEmpty()) {
- for (Uri rcsAssociatedUri : mRcsAssociatedUris) {
- if (PhoneAccount.SCHEME_TEL.equalsIgnoreCase(rcsAssociatedUri.getScheme())) {
- return rcsAssociatedUri;
- }
- }
- }
- if (!mMmtelAssociatedUris.isEmpty()) {
- for (Uri mmtelAssociatedUri : mMmtelAssociatedUris) {
- if (PhoneAccount.SCHEME_TEL.equalsIgnoreCase(mmtelAssociatedUri.getScheme())) {
- return mmtelAssociatedUri;
- }
- }
- }
- }
-
- // Either we have not found a TEL URI or we do not prefer TEL URIs. Get the first URI from
- // p-associated-uri list.
+ public synchronized Uri getImsAssociatedUri() {
if (!mRcsAssociatedUris.isEmpty()) {
return mRcsAssociatedUris.get(0);
} else if (!mMmtelAssociatedUris.isEmpty()) {
@@ -497,7 +473,7 @@ public class DeviceCapabilityInfo {
// Get the device's capabilities with the PRESENCE mechanism.
private RcsContactUceCapability getPresenceCapabilities(Context context) {
- Uri uri = PublishUtils.getDeviceContactUri(context, mSubId, this, true);
+ Uri uri = PublishUtils.getDeviceContactUri(context, mSubId, this);
if (uri == null) {
logw("getPresenceCapabilities: uri is empty");
return null;
@@ -558,7 +534,7 @@ public class DeviceCapabilityInfo {
// Get the device's capabilities with the OPTIONS mechanism.
private RcsContactUceCapability getOptionsCapabilities(Context context) {
- Uri uri = PublishUtils.getDeviceContactUri(context, mSubId, this, false);
+ Uri uri = PublishUtils.getDeviceContactUri(context, mSubId, this);
if (uri == null) {
logw("getOptionsCapabilities: uri is empty");
return null;
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 442cf7da..e881ae0c 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
@@ -46,7 +46,6 @@ import android.util.IndentingPrintWriter;
import android.util.LocalLog;
import android.util.Log;
-import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishTriggerType;
import com.android.ims.rcs.uce.util.UceUtils;
@@ -54,12 +53,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.util.HandlerExecutor;
import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
import java.util.Objects;
-import java.util.Set;
/**
* Listen to the device changes and notify the PublishController to publish the device's
@@ -71,8 +65,6 @@ public class DeviceCapabilityListener {
private static final long REGISTER_IMS_CHANGED_DELAY = 15000L; // 15 seconds
- private final UceStatsWriter mUceStatsWriter;
-
/**
* Used to inject ImsMmTelManager instances for testing.
*/
@@ -107,7 +99,6 @@ public class DeviceCapabilityListener {
private static final int EVENT_REGISTER_IMS_CONTENT_CHANGE = 1;
private static final int EVENT_UNREGISTER_IMS_CHANGE = 2;
private static final int EVENT_REQUEST_PUBLISH = 3;
- private static final int EVENT_IMS_UNREGISTERED = 4;
DeviceCapabilityHandler(Looper looper) {
super(looper);
@@ -128,9 +119,6 @@ public class DeviceCapabilityListener {
int triggerType = msg.arg1;
mCallback.requestPublishFromInternal(triggerType);
break;
- case EVENT_IMS_UNREGISTERED:
- mCallback.updateImsUnregistered();
- break;
}
}
@@ -159,14 +147,6 @@ public class DeviceCapabilityListener {
message.arg1 = type;
sendMessageDelayed(message, TRIGGER_PUBLISH_REQUEST_DELAY_MS);
}
-
- public void sendImsUnregisteredMessage() {
- logd("sendImsUnregisteredMessage");
- // Remove the existing message and resend a new message.
- removeMessages(EVENT_IMS_UNREGISTERED);
- Message msg = obtainMessage(EVENT_IMS_UNREGISTERED);
- sendMessageDelayed(msg, TRIGGER_PUBLISH_REQUEST_DELAY_MS);
- }
}
private final int mSubId;
@@ -200,7 +180,7 @@ public class DeviceCapabilityListener {
private final Object mLock = new Object();
public DeviceCapabilityListener(Context context, int subId, DeviceCapabilityInfo info,
- PublishControllerCallback callback, UceStatsWriter uceStatsWriter) {
+ PublishControllerCallback callback) {
mSubId = subId;
logi("create");
@@ -208,7 +188,6 @@ public class DeviceCapabilityListener {
mCallback = callback;
mCapabilityInfo = info;
mInitialized = false;
- mUceStatsWriter = uceStatsWriter;
mHandlerThread = new HandlerThread("DeviceCapListenerThread");
mHandlerThread.start();
@@ -468,12 +447,6 @@ public class DeviceCapabilityListener {
synchronized (mLock) {
logi("onRcsRegistered: " + attributes);
if (!mIsImsCallbackRegistered) return;
-
- List<String> featureTagList = new ArrayList<>(attributes.getFeatureTags());
- int registrationTech = attributes.getRegistrationTechnology();
-
- mUceStatsWriter.setImsRegistrationFeatureTagStats(
- mSubId, featureTagList, registrationTech);
handleImsRcsRegistered(attributes);
}
}
@@ -483,7 +456,6 @@ public class DeviceCapabilityListener {
synchronized (mLock) {
logi("onRcsUnregistered: " + info);
if (!mIsImsCallbackRegistered) return;
- mUceStatsWriter.setStoreCompleteImsRegistrationFeatureTagStats(mSubId);
handleImsRcsUnregistered();
}
}
@@ -554,7 +526,6 @@ public class DeviceCapabilityListener {
case ProvisioningManager.KEY_VOLTE_PROVISIONING_STATUS:
case ProvisioningManager.KEY_VT_PROVISIONING_STATUS:
handleProvisioningChanged();
- break;
case ProvisioningManager.KEY_RCS_PUBLISH_SOURCE_THROTTLE_MS:
handlePublishThrottleChanged(value);
break;
@@ -614,11 +585,8 @@ public class DeviceCapabilityListener {
mCapabilityInfo.updateImsMmtelUnregistered();
// When the MMTEL is unregistered, the mmtel associated uri should be cleared.
handleMmTelSubscriberAssociatedUriChanged(null, false);
-
- // If the RCS is already unregistered, it informs that the IMS is unregistered.
- if (mCapabilityInfo.isImsRegistered() == false) {
- mHandler.sendImsUnregisteredMessage();
- }
+ mHandler.sendTriggeringPublishMessage(
+ PublishController.PUBLISH_TRIGGER_MMTEL_UNREGISTERED);
}
/*
@@ -664,9 +632,10 @@ public class DeviceCapabilityListener {
boolean hasChanged = mCapabilityInfo.updateImsRcsUnregistered();
// When the RCS is unregistered, the rcs associated uri should be cleared.
handleRcsSubscriberAssociatedUriChanged(null, false);
- // If the MMTEL is already unregistered, it informs that the IMS is unregistered.
- if (mCapabilityInfo.isImsRegistered() == false) {
- mHandler.sendImsUnregisteredMessage();
+ // Trigger publish if the state has changed.
+ if (hasChanged) {
+ mHandler.sendTriggeringPublishMessage(
+ PublishController.PUBLISH_TRIGGER_RCS_UNREGISTERED);
}
}
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 b20f5ceb..7ea90473 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
@@ -84,9 +84,6 @@ public interface PublishController extends ControllerBase {
/** The Carrier Config for the subscription has Changed **/
int PUBLISH_TRIGGER_CARRIER_CONFIG_CHANGED = 16;
- /** MMTEL and RCS are unregistered. **/
- int PUBLISH_TRIGGER_MMTEL_RCS_UNREGISTERED = 17;
-
@IntDef(value = {
PUBLISH_TRIGGER_SERVICE,
PUBLISH_TRIGGER_RETRY,
@@ -103,8 +100,7 @@ public interface PublishController extends ControllerBase {
PUBLISH_TRIGGER_RCS_URI_CHANGE,
PUBLISH_TRIGGER_PROVISIONING_CHANGE,
PUBLISH_TRIGGER_OVERRIDE_CAPS,
- PUBLISH_TRIGGER_CARRIER_CONFIG_CHANGED,
- PUBLISH_TRIGGER_MMTEL_RCS_UNREGISTERED
+ PUBLISH_TRIGGER_CARRIER_CONFIG_CHANGED
}, prefix="PUBLISH_TRIGGER_")
@Retention(RetentionPolicy.SOURCE)
@interface PublishTriggerType {}
@@ -153,16 +149,6 @@ public interface PublishController extends ControllerBase {
* Update the device state with the publish request result.
*/
void refreshDeviceState(int SipCode, String reason);
-
- /**
- * Sent the publish request to ImsService.
- */
- void notifyPendingPublishRequest();
-
- /**
- * Update the Ims unregistered. This api will be called if the IMS unregistered.
- */
- void updateImsUnregistered();
}
/**
@@ -197,7 +183,7 @@ public interface PublishController extends ControllerBase {
/**
* Retrieve the RCS UCE Publish state.
*/
- @PublishState int getUcePublishState(boolean isSupportPublishingState);
+ @PublishState int getUcePublishState();
/**
* @return the last PIDF XML used for publish or {@code null} if the device is not published.
@@ -210,12 +196,6 @@ public interface PublishController extends ControllerBase {
void onUnpublish();
/**
- * Notify that the device's publish status have been changed.
- */
- void onPublishUpdated(int reasonCode, String reasonPhrase,
- int reasonHeaderCause, String reasonHeaderText);
-
- /**
* Retrieve the device's capabilities.
*/
RcsContactUceCapability getDeviceCapabilities(@CapabilityMechanism int mechanism);
@@ -228,8 +208,7 @@ public interface PublishController extends ControllerBase {
/**
* Register a {@link PublishStateCallback} to listen to the published state changed.
*/
- void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c,
- boolean supportPublishingState);
+ void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c);
/**
* Removes an existing {@link PublishStateCallback}.
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 034d9ac2..e2340ff5 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
@@ -44,7 +44,6 @@ import com.android.ims.rcs.uce.UceController;
import com.android.ims.rcs.uce.UceController.UceControllerCallback;
import com.android.ims.rcs.uce.UceDeviceState;
import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
-import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.ims.rcs.uce.util.UceUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
@@ -80,8 +79,7 @@ public class PublishControllerImpl implements PublishController {
@VisibleForTesting
public interface DeviceCapListenerFactory {
DeviceCapabilityListener createDeviceCapListener(Context context, int subId,
- DeviceCapabilityInfo capInfo, PublishControllerCallback callback,
- UceStatsWriter uceStatsWriter);
+ DeviceCapabilityInfo capInfo, PublishControllerCallback callback);
}
private final int mSubId;
@@ -92,17 +90,11 @@ public class PublishControllerImpl implements PublishController {
private volatile boolean mReceivePublishFromService;
private volatile RcsFeatureManager mRcsFeatureManager;
private final UceControllerCallback mUceCtrlCallback;
- private final UceStatsWriter mUceStatsWriter;
// The capability type that the device is using.
private @RcsImsCapabilityFlag int mCapabilityType;
// The device publish state
- @VisibleForTesting
- public @PublishState int mLastPublishState;
- // The device publish state to support the newly added publish state
- @VisibleForTesting
- public @PublishState int mCurrentPublishState;
-
+ private @PublishState int mPublishState;
// The timestamp of updating the publish state
private Instant mPublishStateUpdatedTime = Instant.now();
// The last PIDF XML used in the publish
@@ -110,6 +102,7 @@ public class PublishControllerImpl implements PublishController {
// The callbacks to notify publish state changed.
private RemoteCallbackList<IRcsUcePublishStateCallback> mPublishStateCallbacks;
+
private final Object mPublishStateLock = new Object();
// The information of the device's capabilities.
@@ -122,9 +115,8 @@ public class PublishControllerImpl implements PublishController {
// The listener to listen to the device's capabilities changed.
private DeviceCapabilityListener mDeviceCapListener;
- private DeviceCapListenerFactory mDeviceCapListenerFactory = (context, subId, capInfo, callback,
- uceStatsWriter)
- -> new DeviceCapabilityListener(context, subId, capInfo, callback, uceStatsWriter);
+ private DeviceCapListenerFactory mDeviceCapListenerFactory = (context, subId, capInfo, callback)
+ -> new DeviceCapabilityListener(context, subId, capInfo, callback);
// Listen to the RCS availability status changed.
private final IImsCapabilityCallback mRcsCapabilitiesCallback =
@@ -149,7 +141,6 @@ public class PublishControllerImpl implements PublishController {
mSubId = subId;
mContext = context;
mUceCtrlCallback = callback;
- mUceStatsWriter = UceStatsWriter.getInstance();
logi("create");
initPublishController(looper);
}
@@ -157,20 +148,18 @@ public class PublishControllerImpl implements PublishController {
@VisibleForTesting
public PublishControllerImpl(Context context, int subId, UceControllerCallback c,
Looper looper, DeviceCapListenerFactory deviceCapFactory,
- PublishProcessorFactory processorFactory, UceStatsWriter instance) {
+ PublishProcessorFactory processorFactory) {
mSubId = subId;
mContext = context;
mUceCtrlCallback = c;
mDeviceCapListenerFactory = deviceCapFactory;
mPublishProcessorFactory = processorFactory;
- mUceStatsWriter = instance;
initPublishController(looper);
}
private void initPublishController(Looper looper) {
mCapabilityType = PublishUtils.getCapabilityType(mContext, mSubId);
- mCurrentPublishState = getInitialPublishState(mCapabilityType);
- mLastPublishState = mCurrentPublishState;
+ mPublishState = getInitialPublishState(mCapabilityType);
mPublishStateCallbacks = new RemoteCallbackList<>();
mPublishHandler = new PublishHandler(this, looper);
@@ -184,7 +173,7 @@ public class PublishControllerImpl implements PublishController {
mDeviceCapListener.initialize();
logd("initPublishController completed: capabilityType=" + mCapabilityType +
- ", publishState=" + mCurrentPublishState);
+ ", publishState=" + mPublishState);
}
/**
@@ -211,7 +200,7 @@ public class PublishControllerImpl implements PublishController {
private void initDeviceCapabilitiesListener() {
mDeviceCapListener = mDeviceCapListenerFactory.createDeviceCapListener(mContext, mSubId,
- mDeviceCapabilityInfo, mPublishControllerCallback, mUceStatsWriter);
+ mDeviceCapabilityInfo, mPublishControllerCallback);
}
@Override
@@ -239,21 +228,9 @@ public class PublishControllerImpl implements PublishController {
}
@Override
- public int getUcePublishState(boolean isSupportPublishingState) {
+ public int getUcePublishState() {
synchronized (mPublishStateLock) {
- if (mIsDestroyedFlag) {
- return RcsUceAdapter.PUBLISH_STATE_OTHER_ERROR;
- }
- if (isSupportPublishingState) {
- // in that case, the caller is support Build.VERSION_CODES.S
- // return the current state that is including newly added publishing state.
- return mCurrentPublishState;
- } else {
- if (mCurrentPublishState == RcsUceAdapter.PUBLISH_STATE_PUBLISHING) {
- return mLastPublishState;
- }
- return mCurrentPublishState;
- }
+ return (!mIsDestroyedFlag) ? mPublishState : RcsUceAdapter.PUBLISH_STATE_OTHER_ERROR;
}
}
@@ -299,16 +276,15 @@ public class PublishControllerImpl implements PublishController {
* Register a {@link PublishStateCallback} to listen to the published state changed.
*/
@Override
- public void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c,
- boolean supportPublishingState) {
+ public void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c) {
synchronized (mPublishStateLock) {
if (mIsDestroyedFlag) return;
- mPublishStateCallbacks.register(c, new Boolean(supportPublishingState));
+ mPublishStateCallbacks.register(c);
logd("registerPublishStateCallback: size="
+ mPublishStateCallbacks.getRegisteredCallbackCount());
}
// Notify the current publish state
- mPublishHandler.sendNotifyCurrentPublishStateMessage(c, supportPublishingState);
+ mPublishHandler.sendNotifyCurrentPublishStateMessage(c);
}
/**
@@ -319,8 +295,6 @@ public class PublishControllerImpl implements PublishController {
synchronized (mPublishStateLock) {
if (mIsDestroyedFlag) return;
mPublishStateCallbacks.unregister(c);
- logd("unregisterPublishStateCallback:mPublishStateCallbacks: size="
- + mPublishStateCallbacks.getRegisteredCallbackCount());
}
}
@@ -356,18 +330,8 @@ public class PublishControllerImpl implements PublishController {
public void onUnpublish() {
logd("onUnpublish");
if (mIsDestroyedFlag) return;
- mPublishHandler.sendUnpublishedMessage(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED);
- }
-
- /**
- * Notify that the device's publish status have been changed.
- */
- @Override
- public void onPublishUpdated(int reasonCode, String reasonPhrase,
- int reasonHeaderCause, String reasonHeaderText) {
- if (mIsDestroyedFlag) return;
- mPublishHandler.sendPublishUpdatedMessage(reasonCode, reasonPhrase, reasonHeaderCause,
- reasonHeaderText);
+ mPublishHandler.sendPublishStateChangedMessage(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED,
+ Instant.now(), null /*pidfXml*/);
}
@Override
@@ -428,18 +392,6 @@ public class PublishControllerImpl implements PublishController {
mUceCtrlCallback.refreshDeviceState(sipCode, reason,
UceController.REQUEST_TYPE_PUBLISH);
}
-
- @Override
- public void notifyPendingPublishRequest() {
- logd("notifyPendingPublishRequest");
- mPublishHandler.sendPublishSentMessage();
- }
-
- @Override
- public void updateImsUnregistered() {
- logd("updateImsUnregistered");
- mPublishHandler.sendImsUnregisteredMessage();
- }
};
/**
@@ -464,10 +416,6 @@ public class PublishControllerImpl implements PublishController {
private static final int MSG_REQUEST_NETWORK_RESPONSE = 10;
private static final int MSG_REQUEST_CANCELED = 11;
private static final int MSG_RESET_DEVICE_STATE = 12;
- private static final int MSG_UNPUBLISHED = 13;
- private static final int MSG_PUBLISH_SENT = 14;
- private static final int MSG_PUBLISH_UPDATED = 15;
- private static final int MSG_IMS_UNREGISTERED = 16;
private final WeakReference<PublishControllerImpl> mPublishControllerRef;
@@ -521,11 +469,7 @@ public class PublishControllerImpl implements PublishController {
}
case MSG_NOTIFY_CURRENT_PUBLISH_STATE:
IRcsUcePublishStateCallback c = (IRcsUcePublishStateCallback) message.obj;
- boolean supportPublishingState = false;
- if (message.arg1 == 1) {
- supportPublishingState = true;
- }
- publishCtrl.handleNotifyCurrentPublishStateMessage(c, supportPublishingState);
+ publishCtrl.handleNotifyCurrentPublishStateMessage(c);
break;
case MSG_REQUEST_PUBLISH:
@@ -552,36 +496,6 @@ public class PublishControllerImpl implements PublishController {
publishCtrl.handleResetDeviceStateMessage();
break;
- case MSG_UNPUBLISHED: {
- SomeArgs args = (SomeArgs) message.obj;
- int newPublishState = (Integer) args.arg1;
- Instant updatedTimestamp = (Instant) args.arg2;
- args.recycle();
- publishCtrl.handleUnpublishedMessage(newPublishState, updatedTimestamp);
- break;
- }
-
- case MSG_PUBLISH_SENT:
- publishCtrl.handlePublishSentMessage();
- 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);
- break;
- }
-
- case MSG_IMS_UNREGISTERED:
- publishCtrl.handleUnpublishedMessage(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED,
- Instant.now());
- break;
-
default:
publishCtrl.logd("invalid message: " + message.what);
break;
@@ -670,70 +584,20 @@ public class PublishControllerImpl implements PublishController {
}
/**
- * Send the message to notify the publish state is changed.
- */
- public void sendUnpublishedMessage(@PublishState int publishState) {
- PublishControllerImpl publishCtrl = mPublishControllerRef.get();
- if (publishCtrl == null) return;
- if (publishCtrl.mIsDestroyedFlag) return;
-
- SomeArgs args = SomeArgs.obtain();
- args.arg1 = publishState;
- args.arg2 = Instant.now();
- Message message = obtainMessage();
- message.what = MSG_UNPUBLISHED;
- message.obj = args;
- sendMessage(message);
- }
-
- /**
- * Send the message to notify the publish state is changed.
- */
- public void sendPublishUpdatedMessage(int reasonCode, String reasonPhrase,
- int reasonHeaderCause, String reasonHeaderText) {
- 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;
- sendMessage(message);
- }
-
- /**
* Send the message to notify the new added callback of the latest publish state.
*/
public void sendNotifyCurrentPublishStateMessage(
- IRcsUcePublishStateCallback callback, boolean supportPublishingState) {
+ IRcsUcePublishStateCallback callback) {
PublishControllerImpl publishCtrl = mPublishControllerRef.get();
if (publishCtrl == null) return;
if (publishCtrl.mIsDestroyedFlag) return;
Message message = obtainMessage();
message.what = MSG_NOTIFY_CURRENT_PUBLISH_STATE;
- message.arg1 = supportPublishingState ? 1 : 0;
message.obj = callback;
sendMessage(message);
}
- /**
- * Send the message that the publish request has been sent to the ImsService.
- */
- public void sendPublishSentMessage() {
- PublishControllerImpl publishCtrl = mPublishControllerRef.get();
- if (publishCtrl == null) return;
- if (publishCtrl.mIsDestroyedFlag) return;
- Message message = obtainMessage();
- message.what = MSG_PUBLISH_SENT;
- sendMessage(message);
- }
-
public void sendPublishMessage(@PublishTriggerType int type) {
sendPublishMessage(type, 0L);
}
@@ -825,15 +689,6 @@ public class PublishControllerImpl implements PublishController {
removeMessages(MSG_RESET_DEVICE_STATE);
}
- public void sendImsUnregisteredMessage() {
- PublishControllerImpl publishCtrl = mPublishControllerRef.get();
- if (publishCtrl == null) return;
- if (publishCtrl.mIsDestroyedFlag) return;
- Message message = obtainMessage();
- message.what = MSG_IMS_UNREGISTERED;
- sendMessage(message);
- }
-
private static Map<Integer, String> EVENT_DESCRIPTION = new HashMap<>();
static {
EVENT_DESCRIPTION.put(MSG_RCS_CONNECTED, "RCS_CONNECTED");
@@ -848,10 +703,6 @@ public class PublishControllerImpl implements PublishController {
EVENT_DESCRIPTION.put(MSG_REQUEST_NETWORK_RESPONSE, "REQUEST_NETWORK_RESPONSE");
EVENT_DESCRIPTION.put(MSG_REQUEST_CANCELED, "REQUEST_CANCELED");
EVENT_DESCRIPTION.put(MSG_RESET_DEVICE_STATE, "RESET_DEVICE_STATE");
- EVENT_DESCRIPTION.put(MSG_UNPUBLISHED, "MSG_UNPUBLISHED");
- EVENT_DESCRIPTION.put(MSG_PUBLISH_SENT, "MSG_PUBLISH_SENT");
- EVENT_DESCRIPTION.put(MSG_PUBLISH_UPDATED, "MSG_PUBLISH_UPDATED");
- EVENT_DESCRIPTION.put(MSG_IMS_UNREGISTERED, "MSG_IMS_UNREGISTERED");
}
}
@@ -874,7 +725,7 @@ public class PublishControllerImpl implements PublishController {
// Check whether the device state is not allowed to execute the PUBLISH request.
DeviceStateResult deviceState = mUceCtrlCallback.getDeviceState();
- if (deviceState.isRequestForbidden() || deviceState.isPublishRequestBlocked()) {
+ if (deviceState.isRequestForbidden()) {
logd("isPublishRequestAllowed: The device state is disallowed. "
+ deviceState.getDeviceState());
return false;
@@ -1050,24 +901,20 @@ public class PublishControllerImpl implements PublishController {
+ ", publishState=" + newPublishState);
return;
}
- logd("publish state changes from " + mCurrentPublishState + " to " + newPublishState +
+ logd("publish state changes from " + mPublishState + " to " + newPublishState +
", time=" + updatedTimestamp);
mPublishStateUpdatedTime = updatedTimestamp;
mPidfXml = pidfXml;
// Bail early and do not update listeners if the publish state didn't change.
- if (mCurrentPublishState == newPublishState) return;
- mLastPublishState = mCurrentPublishState;
- mCurrentPublishState = newPublishState;
- }
- if (newPublishState == RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED) {
- mUceStatsWriter.setUnPublish(mSubId);
+ if (mPublishState == newPublishState) return;
+ mPublishState = newPublishState;
}
// Trigger the publish state changed in handler thread since it may take time.
- logd("Notify publish state changed: " + mCurrentPublishState);
+ logd("Notify publish state changed: " + mPublishState);
mPublishStateCallbacks.broadcast(c -> {
try {
- c.onPublishStateChanged(mCurrentPublishState);
+ c.onPublishStateChanged(mPublishState);
} catch (RemoteException e) {
logw("Notify publish state changed error: " + e);
}
@@ -1075,11 +922,10 @@ public class PublishControllerImpl implements PublishController {
logd("Notify publish state changed: completed");
}
- private void handleNotifyCurrentPublishStateMessage(IRcsUcePublishStateCallback callback,
- boolean supportPublishingState) {
+ private void handleNotifyCurrentPublishStateMessage(IRcsUcePublishStateCallback callback) {
if (mIsDestroyedFlag || callback == null) return;
try {
- callback.onPublishStateChanged(getUcePublishState(supportPublishingState));
+ callback.onPublishStateChanged(getUcePublishState());
} catch (RemoteException e) {
logw("handleCurrentPublishStateUpdateMessage exception: " + e);
}
@@ -1099,7 +945,7 @@ public class PublishControllerImpl implements PublishController {
}
// Reset device state
DeviceStateResult deviceState = mUceCtrlCallback.getDeviceState();
- if (deviceState.isRequestForbidden() || deviceState.isPublishRequestBlocked()) {
+ if (deviceState.isRequestForbidden()) {
mUceCtrlCallback.resetDeviceState();
}
}
@@ -1142,71 +988,10 @@ public class PublishControllerImpl implements PublishController {
mUceCtrlCallback.resetDeviceState();
}
- private void handleUnpublishedMessage(@PublishState int newPublishState,
- Instant updatedTimestamp) {
- if (mIsDestroyedFlag) return;
- mPublishProcessor.resetState();
- handlePublishStateChangedMessage(newPublishState, updatedTimestamp, null);
- }
-
- private void handlePublishSentMessage() {
- synchronized (mPublishStateLock) {
- if (mIsDestroyedFlag) return;
- int lastIndex = mPublishStateCallbacks.getRegisteredCallbackCount() - 1;
- int tempPublishState = mCurrentPublishState;
- for (int index = lastIndex; index >= 0; index--) {
- IRcsUcePublishStateCallback callback =
- mPublishStateCallbacks.getRegisteredCallbackItem(index);
- boolean isSupportPublishingState = false;
- try {
- Object object = mPublishStateCallbacks.getRegisteredCallbackCookie(index);
- if (object != null) {
- isSupportPublishingState = (Boolean) object;
- }
- } catch (Exception e) {
- // Do not handle the exception
- }
- try {
- mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_PUBLISHING;
- if (isSupportPublishingState) {
- if (callback != null) {
- callback.onPublishStateChanged(mCurrentPublishState);
- }
- } 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
- && 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);
- }
- }
- }
- } catch (RemoteException e) {
- logw("Notify publish state changed error: " + e);
- }
- }
- }
- }
-
- private void handlePublishUpdatedMessage(int reasonCode, String reasonPhrase,
- int reasonHeaderCause, String reasonHeaderText) {
- if (mIsDestroyedFlag) return;
- PublishRequestResponse updatedPublish = new PublishRequestResponse(getLastPidfXml(),
- reasonCode, reasonPhrase, reasonHeaderCause, reasonHeaderText);
- mPublishProcessor.publishUpdated(updatedPublish);
- }
-
@VisibleForTesting
public void setCapabilityType(int type) {
mCapabilityType = type;
- mCurrentPublishState = getInitialPublishState(mCapabilityType);
- mLastPublishState = mCurrentPublishState;
+ mPublishState = getInitialPublishState(mCapabilityType);
}
@VisibleForTesting
@@ -1259,10 +1044,8 @@ public class PublishControllerImpl implements PublishController {
pw.print("isPresenceCapable=");
pw.println(mDeviceCapabilityInfo.isPresenceCapable());
- pw.print("mCurrentPublishState=");
- pw.print(mCurrentPublishState);
- pw.print("mLastPublishState=");
- pw.print(mLastPublishState);
+ pw.print("mPublishState=");
+ pw.print(mPublishState);
pw.print(" at time ");
pw.println(mPublishStateUpdatedTime);
pw.println("Last PIDF XML:");
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..68aeaa8f 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,15 +22,12 @@ import android.annotation.NonNull;
import android.content.Context;
import android.os.RemoteException;
import android.telephony.ims.RcsContactUceCapability;
-import android.telephony.ims.stub.ImsRegistrationImplBase;
-import android.telephony.ims.stub.RcsCapabilityExchangeImplBase;
import android.text.TextUtils;
import android.util.IndentingPrintWriter;
import android.util.LocalLog;
import android.util.Log;
import com.android.ims.RcsFeatureManager;
-import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.ims.rcs.uce.presence.pidfparser.PidfParser;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishTriggerType;
@@ -56,8 +53,6 @@ public class PublishProcessor {
private volatile boolean mIsDestroyed;
private volatile RcsFeatureManager mRcsFeatureManager;
- private final UceStatsWriter mUceStatsWriter;
-
// Manage the state of the publish processor.
private PublishProcessorState mProcessorState;
@@ -79,18 +74,6 @@ public class PublishProcessor {
mDeviceCapabilities = capabilityInfo;
mPublishCtrlCallback = publishCtrlCallback;
mProcessorState = new PublishProcessorState(subId);
- mUceStatsWriter = UceStatsWriter.getInstance();
- }
-
- @VisibleForTesting
- public PublishProcessor(Context context, int subId, DeviceCapabilityInfo capabilityInfo,
- PublishControllerCallback publishCtrlCallback, UceStatsWriter instance) {
- mSubId = subId;
- mContext = context;
- mDeviceCapabilities = capabilityInfo;
- mPublishCtrlCallback = publishCtrlCallback;
- mProcessorState = new PublishProcessorState(subId);
- mUceStatsWriter = instance;
}
/**
@@ -175,13 +158,6 @@ public class PublishProcessor {
return false;
}
- featureManager.getImsRegistrationTech((tech) -> {
- int registrationTech = (tech == null)
- ? ImsRegistrationImplBase.REGISTRATION_TECH_NONE : tech;
- mUceStatsWriter.setImsRegistrationServiceDescStats(mSubId,
- deviceCapability.getCapabilityTuples(), registrationTech);
- });
-
// Publish to the Presence server.
return publishCapabilities(featureManager, pidfXml);
}
@@ -199,7 +175,7 @@ public class PublishProcessor {
// Check if it has provisioned. When the provisioning changes, a new publish request will
// be triggered.
- if (!isEabProvisioned()) {
+ if (!UceUtils.isEabProvisioned(mContext, mSubId)) {
logd("isPublishAllowed: NOT provisioned");
return false;
}
@@ -241,9 +217,6 @@ public class PublishProcessor {
// Send a request canceled timer to avoid waiting too long for the response callback.
mPublishCtrlCallback.setupRequestCanceledTimer(taskId, RESPONSE_CALLBACK_WAITING_TIME);
-
- // Inform that the publish request has been sent to the Ims Service.
- mPublishCtrlCallback.notifyPendingPublishRequest();
return true;
} catch (RemoteException e) {
mLocalLog.log("publish capability exception: " + e.getMessage());
@@ -271,13 +244,6 @@ public class PublishProcessor {
mLocalLog.log("Receive command error code=" + requestResponse.getCmdErrorCode());
logd("onCommandError: " + requestResponse.toString());
- int cmdError = requestResponse.getCmdErrorCode().orElse(0);
- boolean successful = false;
- if (cmdError == RcsCapabilityExchangeImplBase.COMMAND_CODE_NO_CHANGE) {
- successful = true;
- }
- mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.PUBLISH_EVENT, successful, cmdError, 0);
-
if (requestResponse.needRetry() && !mProcessorState.isReachMaximumRetries()) {
handleRequestRespWithRetry(requestResponse);
} else {
@@ -301,10 +267,6 @@ public class PublishProcessor {
mLocalLog.log("Receive network response code=" + requestResponse.getNetworkRespSipCode());
logd("onNetworkResponse: " + requestResponse.toString());
- int responseCode = requestResponse.getNetworkRespSipCode().orElse(0);
- mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.PUBLISH_EVENT, true, 0,
- responseCode);
-
if (requestResponse.needRetry() && !mProcessorState.isReachMaximumRetries()) {
handleRequestRespWithRetry(requestResponse);
} else {
@@ -362,32 +324,28 @@ public class PublishProcessor {
* request response and it does not need to retry.
*/
private void handleRequestRespWithoutRetry(PublishRequestResponse requestResponse) {
- updatePublishStateFromResponse(requestResponse);
- // Finish the request and check if there is pending request.
- setRequestEnded(requestResponse);
- checkAndSendPendingRequest();
- }
-
- // After checking the response, it handles calling PublishCtrlCallback.
- private void updatePublishStateFromResponse(PublishRequestResponse response) {
- Instant responseTime = response.getResponseTimestamp();
+ Instant responseTime = requestResponse.getResponseTimestamp();
// Record the time when the request is successful and reset the retry count.
- if (response.isRequestSuccess()) {
+ if (requestResponse.isRequestSuccess()) {
mProcessorState.setLastPublishedTime(responseTime);
mProcessorState.resetRetryCount();
}
// Update the publish state after the request has finished.
- int publishState = response.getPublishState();
- String pidfXml = response.getPidfXml();
+ int publishState = requestResponse.getPublishState();
+ String pidfXml = requestResponse.getPidfXml();
mPublishCtrlCallback.updatePublishRequestResult(publishState, responseTime, pidfXml);
// Refresh the device state with the publish request result.
- response.getResponseSipCode().ifPresent(sipCode -> {
- String reason = response.getResponseReason().orElse("");
+ requestResponse.getResponseSipCode().ifPresent(sipCode -> {
+ String reason = requestResponse.getResponseReason().orElse("");
mPublishCtrlCallback.refreshDeviceState(sipCode, reason);
});
+
+ // Finish the request and check if there is pending request.
+ setRequestEnded(requestResponse);
+ checkAndSendPendingRequest();
}
/**
@@ -487,33 +445,11 @@ public class PublishProcessor {
return mProcessorState.isPublishingNow();
}
- /**
- * Reset the retry count and time related publish.
- */
- public void resetState() {
- mProcessorState.resetState();
- }
-
- /**
- * Update publish status after handling on onPublishUpdate case
- */
- public void publishUpdated(PublishRequestResponse response) {
- updatePublishStateFromResponse(response);
- if (response != null) {
- response.onDestroy();
- }
- }
-
@VisibleForTesting
public void setProcessorState(PublishProcessorState processorState) {
mProcessorState = processorState;
}
- @VisibleForTesting
- protected boolean isEabProvisioned() {
- return UceUtils.isEabProvisioned(mContext, mSubId);
- }
-
private void logd(String log) {
Log.d(LOG_TAG, getLogPrefix().append(log).toString());
}
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessorState.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessorState.java
index 0e9adfad..40d901f6 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessorState.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessorState.java
@@ -348,16 +348,6 @@ public class PublishProcessorState {
}
}
- /**
- * Reset the retry count and related time when the publication status has
- * changed to not_published.
- */
- public void resetState() {
- synchronized (mLock) {
- mPublishThrottle.resetState();
- }
- }
-
/*
* Check if it has reached the maximum retry count.
*/
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..a05a8d35 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
@@ -20,7 +20,6 @@ import android.annotation.Nullable;
import android.telephony.ims.RcsUceAdapter;
import android.telephony.ims.aidl.IPublishResponseCallback;
import android.telephony.ims.stub.RcsCapabilityExchangeImplBase;
-import android.text.TextUtils;
import android.util.Log;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
@@ -63,29 +62,6 @@ public class PublishRequestResponse {
mReasonHeaderText = Optional.empty();
}
- public PublishRequestResponse(String pidfXml, int sipCode, String reasonPhrase,
- int reasonHeaderCause, String reasonHeaderText) {
- 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);
- } else {
- mReasonHeaderCause = Optional.empty();
- }
- if (TextUtils.isEmpty(reasonHeaderText)) {
- mReasonHeaderText = Optional.empty();
- } else {
- mReasonHeaderText = Optional.ofNullable(reasonHeaderText);
- }
-
- }
-
// The result callback of the publish capability request.
private IPublishResponseCallback mResponseCallback = new IPublishResponseCallback.Stub() {
@Override
@@ -199,13 +175,6 @@ public class PublishRequestResponse {
}
private void onNetworkResponse(int sipCode, String reason) {
- // 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;
- }
mResponseTimestamp = Instant.now();
mNetworkRespSipCode = Optional.of(sipCode);
mReasonPhrase = Optional.ofNullable(reason);
@@ -221,13 +190,6 @@ public class PublishRequestResponse {
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;
- }
mResponseTimestamp = Instant.now();
mNetworkRespSipCode = Optional.of(sipCode);
mReasonPhrase = Optional.ofNullable(reasonPhrase);
@@ -352,7 +314,6 @@ public class PublishRequestResponse {
return RcsUceAdapter.PUBLISH_STATE_OK;
case NetworkSipCode.SIP_CODE_FORBIDDEN:
case NetworkSipCode.SIP_CODE_NOT_FOUND:
- case NetworkSipCode.SIP_CODE_SERVER_TIMEOUT:
return RcsUceAdapter.PUBLISH_STATE_RCS_PROVISION_ERROR;
case NetworkSipCode.SIP_CODE_REQUEST_TIMEOUT:
return RcsUceAdapter.PUBLISH_STATE_REQUEST_TIMEOUT;
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker.java
index a107b1ad..d527e6a3 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker.java
@@ -53,7 +53,7 @@ public class PublishServiceDescTracker {
*/
private static final Map<ServiceDescription, Set<String>> DEFAULT_SERVICE_DESCRIPTION_MAP;
static {
- ArrayMap<ServiceDescription, Set<String>> map = new ArrayMap<>(21);
+ ArrayMap<ServiceDescription, Set<String>> map = new ArrayMap<>(19);
map.put(ServiceDescription.SERVICE_DESCRIPTION_CHAT_IM,
Collections.singleton(FeatureTags.FEATURE_TAG_CHAT_IM));
map.put(ServiceDescription.SERVICE_DESCRIPTION_CHAT_SESSION,
@@ -83,32 +83,22 @@ public class PublishServiceDescTracker {
Collections.singleton(FeatureTags.FEATURE_TAG_SHARED_MAP));
map.put(ServiceDescription.SERVICE_DESCRIPTION_SHARED_SKETCH,
Collections.singleton(FeatureTags.FEATURE_TAG_SHARED_SKETCH));
- // A map has one key and one value. And if the same key is used, the value is replaced
- // with a new one.
- // The service description between SERVICE_DESCRIPTION_CHATBOT_SESSION and
- // SERVICE_DESCRIPTION_CHATBOT_SESSION_V1 is the same, but this is for botVersion=#1 .
+ // Feature tags defined twice for chatbot session because we want v1 and v2 based on bot
+ // version
map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION, new ArraySet<>(
Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_SESSION,
FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED)));
- // This is the service description for botVersion=#1,#2 .
- map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V1, new ArraySet<>(
- Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_SESSION,
- FeatureTags.FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED)));
map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V2, new ArraySet<>(
Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_SESSION,
- FeatureTags.FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED)));
- // The service description between SERVICE_DESCRIPTION_CHATBOT_SA_SESSION and
- // SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V1 is the same, but this is for botVersion=#1 .
+ FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED)));
+ // Feature tags defined twice for chatbot sa session because we want v1 and v2 based on bot
+ // version
map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SA_SESSION, new ArraySet<>(
Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_STANDALONE_MSG,
FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED)));
- // This is the service description for botVersion=#1,#2 .
- map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V1, new ArraySet<>(
- Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_STANDALONE_MSG,
- FeatureTags.FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED)));
map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V2, new ArraySet<>(
Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_STANDALONE_MSG,
- FeatureTags.FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED)));
+ FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED)));
map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_ROLE,
Collections.singleton(FeatureTags.FEATURE_TAG_CHATBOT_ROLE));
DEFAULT_SERVICE_DESCRIPTION_MAP = Collections.unmodifiableMap(map);
@@ -193,6 +183,7 @@ public class PublishServiceDescTracker {
.map(PublishServiceDescTracker::parseFeatureTags)
// Each entry should only contain one feature tag.
.map(s -> s.iterator().next()).collect(Collectors.toSet());
+
// For aliased service descriptions (service-id && version is the same, but desc is
// different), Keep a "score" of the number of feature tags that the service description
// has associated with it. If another is found with a higher score, replace this one.
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishUtils.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishUtils.java
index 1a67a40a..ea1d11b9 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishUtils.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishUtils.java
@@ -18,7 +18,6 @@ package com.android.ims.rcs.uce.presence.publish;
import android.content.Context;
import android.net.Uri;
-import android.telecom.PhoneAccount;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.telephony.ims.feature.RcsFeature.RcsImsCapabilities;
@@ -26,9 +25,6 @@ import android.telephony.ims.feature.RcsFeature.RcsImsCapabilities.RcsImsCapabil
import android.text.TextUtils;
import android.util.Log;
-import com.android.i18n.phonenumbers.NumberParseException;
-import com.android.i18n.phonenumbers.PhoneNumberUtil;
-import com.android.i18n.phonenumbers.Phonenumber;
import com.android.ims.rcs.uce.util.UceUtils;
import java.util.Arrays;
@@ -43,49 +39,29 @@ public class PublishUtils {
private static final String SCHEME_TEL = "tel";
private static final String DOMAIN_SEPARATOR = "@";
- /**
- * @return the contact URI of this device for either a PRESENCE or OPTIONS capabilities request.
- * We will first try to use the IMS service associated URIs from the p-associated-uri header
- * in the IMS registration response. If this is not available, we will fall back to using the
- * SIM card information to generate the URI.
- */
public static Uri getDeviceContactUri(Context context, int subId,
- DeviceCapabilityInfo deviceCap, boolean isForPresence) {
- boolean preferTelUri = false;
- if (isForPresence) {
- preferTelUri = UceUtils.isTelUriForPidfXmlEnabled(context, subId);
- }
- // Get the uri from the IMS p-associated-uri header which is provided by the IMS service.
- Uri contactUri = deviceCap.getImsAssociatedUri(preferTelUri);
+ DeviceCapabilityInfo deviceCap) {
+ // Get the uri from the IMS associated URI which is provided by the IMS service.
+ Uri contactUri = deviceCap.getImsAssociatedUri();
if (contactUri != null) {
- Uri convertedUri = preferTelUri ? getConvertedTelUri(context, contactUri) : contactUri;
- Log.d(LOG_TAG, "getDeviceContactUri: returning "
- + (contactUri.equals(convertedUri) ? "found" : "converted")
- + " ims associated uri");
+ Log.d(LOG_TAG, "getDeviceContactUri: ims associated uri");
return contactUri;
}
- // No IMS service provided URIs, so generate the contact uri from ISIM.
TelephonyManager telephonyManager = getTelephonyManager(context, subId);
if (telephonyManager == null) {
Log.w(LOG_TAG, "getDeviceContactUri: TelephonyManager is null");
return null;
}
+
+ // Get the contact uri from ISIM.
contactUri = getContactUriFromIsim(telephonyManager);
if (contactUri != null) {
Log.d(LOG_TAG, "getDeviceContactUri: impu");
- if (preferTelUri) {
- return getConvertedTelUri(context, contactUri);
- } else {
- return contactUri;
- }
+ return contactUri;
} else {
Log.d(LOG_TAG, "getDeviceContactUri: line number");
- if (preferTelUri) {
- return getConvertedTelUri(context, getContactUriFromLine1Number(telephonyManager));
- } else {
- return getContactUriFromLine1Number(telephonyManager);
- }
+ return getContactUriFromLine1Number(telephonyManager);
}
}
@@ -160,41 +136,6 @@ public class PublishUtils {
}
}
- /**
- * @return a TEL URI version of the contact URI if given a SIP URI. If given a TEL URI, this
- * method will return the same value given.
- */
- private static Uri getConvertedTelUri(Context context, Uri contactUri) {
- if (contactUri == null) {
- return null;
- }
- if (contactUri.getScheme().equalsIgnoreCase(SCHEME_SIP)) {
- TelephonyManager manager = context.getSystemService(TelephonyManager.class);
- if (manager.getIsimDomain() == null) {
- return contactUri;
- }
-
- String numbers = contactUri.getSchemeSpecificPart();
- String[] numberParts = numbers.split("[@;:]");
- String number = numberParts[0];
-
- String simCountryIso = manager.getSimCountryIso();
- if (!TextUtils.isEmpty(simCountryIso)) {
- simCountryIso = simCountryIso.toUpperCase();
- PhoneNumberUtil util = PhoneNumberUtil.getInstance();
- try {
- Phonenumber.PhoneNumber phoneNumber = util.parse(number, simCountryIso);
- number = util.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
- String telUri = SCHEME_TEL + ":" + number;
- contactUri = Uri.parse(telUri);
- } catch (NumberParseException e) {
- Log.w(LOG_TAG, "formatNumber: could not format " + number + ", error: " + e);
- }
- }
- }
- return contactUri;
- }
-
static @RcsImsCapabilityFlag int getCapabilityType(Context context, int subId) {
boolean isPresenceSupported = UceUtils.isPresenceSupported(context, subId);
boolean isSipOptionsSupported = UceUtils.isSipOptionsSupported(context, subId);
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java b/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java
index 0f271e1c..aa08f3a6 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java
@@ -117,8 +117,7 @@ public class ServiceDescription {
"1.0" /*version*/,
null /*description*/
);
- // this is the same as below but redefined so that it can be a separate key entry
- // in DEFAULT_SERVICE_DESCRIPTION_MAP
+
public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SESSION =
new ServiceDescription(
RcsContactPresenceTuple.SERVICE_ID_CHATBOT,
@@ -126,41 +125,26 @@ public class ServiceDescription {
null /*description*/
);
- public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SESSION_V1 =
- new ServiceDescription(
- RcsContactPresenceTuple.SERVICE_ID_CHATBOT,
- "1.0" /*version*/,
- "Chatbot Session" /*description*/
- );
-
public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SESSION_V2 =
new ServiceDescription(
RcsContactPresenceTuple.SERVICE_ID_CHATBOT,
"2.0" /*version*/,
- "Chatbot Session" /*description*/
- );
- // this is the same as below but redefined so that it can be a separate key entry
- // in DEFAULT_SERVICE_DESCRIPTION_MAP
- public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SA_SESSION =
- new ServiceDescription(
- RcsContactPresenceTuple.SERVICE_ID_CHATBOT_STANDALONE.trim(),
- "1.0" /*version*/,
null /*description*/
- );
+ );
- public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V1 =
+ public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SA_SESSION =
new ServiceDescription(
RcsContactPresenceTuple.SERVICE_ID_CHATBOT_STANDALONE.trim(),
"1.0" /*version*/,
- "Chatbot Standalone" /*description*/
- );
+ null /*description*/
+ );
public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V2 =
new ServiceDescription(
RcsContactPresenceTuple.SERVICE_ID_CHATBOT_STANDALONE.trim(),
"2.0" /*version*/,
- "Chatbot Standalone" /*description*/
- );
+ null /*description*/
+ );
public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_ROLE =
new ServiceDescription(
diff --git a/src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java b/src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java
index 17cec90b..f7a4acc6 100644
--- a/src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java
+++ b/src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java
@@ -23,7 +23,6 @@ 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;
@@ -141,36 +140,20 @@ public abstract class CapabilityRequest implements UceRequest {
return;
}
- // 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);
+ // Get the capabilities from the cache.
+ final List<RcsContactUceCapability> cachedCapList
+ = isSkipGettingFromCache() ? Collections.EMPTY_LIST : getCapabilitiesFromCache();
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() || !throttlingUris.isEmpty()) {
+ if (!cachedCapList.isEmpty()) {
mRequestManagerCallback.notifyCachedCapabilitiesUpdated(mCoordinatorId, mTaskId);
}
// Get the rest contacts which need to request capabilities from the network.
- List<Uri> requestCapUris = getRequestingFromNetworkUris(cachedCapList, throttlingUris);
+ final List<Uri> requestCapUris = getRequestingFromNetworkUris(cachedCapList);
logd("executeRequest: requestCapUris size=" + requestCapUris.size());
@@ -210,30 +193,21 @@ public abstract class CapabilityRequest implements UceRequest {
}
// Get the cached capabilities by the given request type.
- private List<EabCapabilityResult> getCapabilitiesFromCache() {
+ private List<RcsContactUceCapability> getCapabilitiesFromCache() {
List<EabCapabilityResult> resultList = null;
if (mRequestType == REQUEST_TYPE_CAPABILITY) {
- resultList = mRequestManagerCallback.getCapabilitiesFromCacheIncludingExpired(mUriList);
+ resultList = mRequestManagerCallback.getCapabilitiesFromCache(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.getAvailabilityFromCacheIncludingExpired(uri);
+ EabCapabilityResult eabResult = mRequestManagerCallback.getAvailabilityFromCache(uri);
resultList = new ArrayList<>();
resultList.add(eabResult);
}
if (resultList == null) {
return Collections.emptyList();
}
- 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()
+ return resultList.stream()
.filter(Objects::nonNull)
.filter(result -> result.getStatus() == EabCapabilityResult.EAB_QUERY_SUCCESSFUL)
.map(EabCapabilityResult::getContactCapabilities)
@@ -253,67 +227,6 @@ public abstract class CapabilityRequest implements UceRequest {
}
/**
- * 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.
*/
protected void setupRequestTimeoutTimer() {
diff --git a/src/java/com/android/ims/rcs/uce/request/ContactThrottlingList.java b/src/java/com/android/ims/rcs/uce/request/ContactThrottlingList.java
deleted file mode 100644
index da67f6c9..00000000
--- a/src/java/com/android/ims/rcs/uce/request/ContactThrottlingList.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce.request;
-
-import android.net.Uri;
-import android.util.Log;
-
-import com.android.ims.rcs.uce.util.UceUtils;
-
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * The class is used to store when the contact's capabilities request result is inconclusive.
- */
-public class ContactThrottlingList {
- private static final String LOG_TAG = UceUtils.getLogPrefix() + "ThrottlingList";
-
- private static class ContactInfo {
- Uri mContactUri;
- int mSipCode;
- Instant mThrottleEndTimestamp;
-
- public ContactInfo(Uri contactUri, int sipCode, Instant timestamp) {
- mContactUri = contactUri;
- mSipCode = sipCode;
- mThrottleEndTimestamp = timestamp;
- }
- }
-
- private final int mSubId;
- private final List<ContactInfo> mThrottlingList = new ArrayList<>();
-
- public ContactThrottlingList(int subId) {
- mSubId = subId;
- }
-
- public synchronized void reset() {
- mThrottlingList.clear();
- }
-
- public synchronized void addToThrottlingList(List<Uri> uriList, int sipCode) {
- // Clean up the expired contacts before starting.
- cleanUpExpiredContacts();
-
- List<Uri> addToThrottlingList = getNotInThrottlingListUris(uriList);
- long expiration = UceUtils.getAvailabilityCacheExpiration(mSubId);
- Instant timestamp = Instant.now().plusSeconds(expiration);
-
- List<ContactInfo> list = addToThrottlingList.stream().map(uri ->
- new ContactInfo(uri, sipCode, timestamp)).collect(Collectors.toList());
-
- int previousSize = mThrottlingList.size();
- mThrottlingList.addAll(list);
-
- logd("addToThrottlingList: previous size=" + previousSize +
- ", current size=" + mThrottlingList.size() + ", expired time=" + timestamp);
- }
-
- private synchronized List<Uri> getNotInThrottlingListUris(List<Uri> uriList) {
- List<Uri> throttlingUris = mThrottlingList.stream().map(contactInfo ->
- contactInfo.mContactUri).collect(Collectors.toList());
- List<Uri> addToThrottlingUris = new ArrayList<>(uriList);
- addToThrottlingUris.removeAll(throttlingUris);
- return addToThrottlingUris;
- }
-
- public synchronized List<Uri> getInThrottlingListUris(List<Uri> uriList) {
- // Clean up the expired contacts before starting.
- cleanUpExpiredContacts();
-
- return uriList.stream()
- .filter(uri -> mThrottlingList.stream()
- .anyMatch(contactInfo -> contactInfo.mContactUri.equals(uri)))
- .collect(Collectors.toList());
- }
-
- /**
- * Clean up the expired contacts from the throttling list.
- */
- private synchronized void cleanUpExpiredContacts() {
- final int previousSize = mThrottlingList.size();
- List<ContactInfo> expiredContacts = mThrottlingList.stream()
- .filter(contactInfo -> Instant.now()
- .isAfter(contactInfo.mThrottleEndTimestamp))
- .collect(Collectors.toList());
- mThrottlingList.removeAll(expiredContacts);
-
- logd("cleanUpExpiredContacts: previous size=" + previousSize +
- ", current size=" + mThrottlingList.size());
- }
-
- private void logd(String log) {
- Log.d(LOG_TAG, getLogPrefix().append(log).toString());
- }
-
- private StringBuilder getLogPrefix() {
- StringBuilder builder = new StringBuilder("[");
- builder.append(mSubId);
- builder.append("] ");
- return builder;
- }
-}
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..a150dd6d 100644
--- a/src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java
+++ b/src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java
@@ -24,7 +24,6 @@ import android.telephony.ims.RcsUceAdapter;
import android.telephony.ims.aidl.IRcsUceControllerCallback;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
-import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.internal.annotations.VisibleForTesting;
import java.util.Collection;
@@ -45,14 +44,7 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
public Builder(int subId, Collection<UceRequest> requests,
RequestManagerCallback callback) {
- mRequestCoordinator = new OptionsRequestCoordinator(subId, requests, callback,
- UceStatsWriter.getInstance());
- }
- @VisibleForTesting
- public Builder(int subId, Collection<UceRequest> requests,
- RequestManagerCallback callback, UceStatsWriter instance) {
- mRequestCoordinator = new OptionsRequestCoordinator(subId, requests, callback,
- instance);
+ mRequestCoordinator = new OptionsRequestCoordinator(subId, requests, callback);
}
public Builder setCapabilitiesCallback(IRcsUceControllerCallback callback) {
@@ -113,12 +105,9 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
// The callback to notify the result of the capabilities request.
private IRcsUceControllerCallback mCapabilitiesCallback;
- private final UceStatsWriter mUceStatsWriter;
-
private OptionsRequestCoordinator(int subId, Collection<UceRequest> requests,
- RequestManagerCallback requestMgrCallback, UceStatsWriter instance) {
+ RequestManagerCallback requestMgrCallback) {
super(subId, requests, requestMgrCallback);
- mUceStatsWriter = instance;
logd("OptionsRequestCoordinator: created");
}
@@ -200,11 +189,6 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
// Finish this request.
request.onFinish();
- int commandErrorCode = response.getCommandError().orElse(0);
- mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.OUTGOING_OPTION_EVENT,
- false, commandErrorCode, 0);
-
-
// Remove this request from the activated collection and notify RequestManager.
Long taskId = request.getTaskId();
RequestResult requestResult = sCommandErrorCreator.createRequestResult(taskId, response);
@@ -219,11 +203,6 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
CapabilityRequestResponse response = request.getRequestResponse();
logd("handleNetworkResponse: " + response.toString());
- int responseCode = response.getNetworkRespSipCode().orElse(0);
- mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.OUTGOING_OPTION_EVENT, true,
- 0, responseCode);
-
-
List<RcsContactUceCapability> updatedCapList = response.getUpdatedContactCapability();
if (!updatedCapList.isEmpty()) {
// Save the capabilities and trigger the capabilities callback
diff --git a/src/java/com/android/ims/rcs/uce/request/RemoteOptionsCoordinator.java b/src/java/com/android/ims/rcs/uce/request/RemoteOptionsCoordinator.java
index 5a3e33bb..c8aa3f77 100644
--- a/src/java/com/android/ims/rcs/uce/request/RemoteOptionsCoordinator.java
+++ b/src/java/com/android/ims/rcs/uce/request/RemoteOptionsCoordinator.java
@@ -25,7 +25,6 @@ import android.telephony.ims.aidl.IOptionsRequestCallback;
import com.android.ims.rcs.uce.request.RemoteOptionsRequest.RemoteOptResponse;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
-import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.internal.annotations.VisibleForTesting;
import java.util.Collection;
@@ -42,13 +41,7 @@ public class RemoteOptionsCoordinator extends UceRequestCoordinator {
RemoteOptionsCoordinator mRemoteOptionsCoordinator;
public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c) {
- mRemoteOptionsCoordinator = new RemoteOptionsCoordinator(subId, requests, c,
- UceStatsWriter.getInstance());
- }
- @VisibleForTesting
- public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c,
- UceStatsWriter instance) {
- mRemoteOptionsCoordinator = new RemoteOptionsCoordinator(subId, requests, c, instance);
+ mRemoteOptionsCoordinator = new RemoteOptionsCoordinator(subId, requests, c);
}
public Builder setOptionsRequestCallback(IOptionsRequestCallback callback) {
@@ -85,12 +78,9 @@ public class RemoteOptionsCoordinator extends UceRequestCoordinator {
// The callback to notify the result of the remote options request.
private IOptionsRequestCallback mOptionsReqCallback;
- private final UceStatsWriter mUceStatsWriter;
-
private RemoteOptionsCoordinator(int subId, Collection<UceRequest> requests,
- RequestManagerCallback requestMgrCallback, UceStatsWriter instance) {
+ RequestManagerCallback requestMgrCallback) {
super(subId, requests, requestMgrCallback);
- mUceStatsWriter = instance;
logd("RemoteOptionsCoordinator: created");
}
@@ -154,9 +144,6 @@ public class RemoteOptionsCoordinator extends UceRequestCoordinator {
boolean isRemoteNumberBlocked) {
try {
logd("triggerOptionsReqCallback: start");
- mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.INCOMING_OPTION_EVENT, true, 0,
- 200);
-
mOptionsReqCallback.respondToCapabilityRequest(deviceCaps, isRemoteNumberBlocked);
} catch (RemoteException e) {
logw("triggerOptionsReqCallback exception: " + e);
@@ -168,9 +155,6 @@ public class RemoteOptionsCoordinator extends UceRequestCoordinator {
private void triggerOptionsReqWithErrorCallback(int errorCode, String reason) {
try {
logd("triggerOptionsReqWithErrorCallback: start");
- mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.INCOMING_OPTION_EVENT, true, 0,
- errorCode);
-
mOptionsReqCallback.respondToCapabilityRequestWithError(errorCode, reason);
} catch (RemoteException e) {
logw("triggerOptionsReqWithErrorCallback exception: " + e);
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..2b5e91a9 100644
--- a/src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java
+++ b/src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java
@@ -25,15 +25,12 @@ import android.telephony.ims.RcsUceAdapter;
import android.telephony.ims.aidl.ISubscribeResponseCallback;
import android.telephony.ims.stub.RcsCapabilityExchangeImplBase.CommandCode;
-import com.android.ims.rcs.uce.eab.EabCapabilityResult;
import com.android.ims.rcs.uce.presence.pidfparser.PidfParser;
import com.android.ims.rcs.uce.presence.pidfparser.PidfParserUtils;
-import com.android.ims.rcs.uce.presence.pidfparser.RcsContactUceCapabilityWrapper;
import com.android.ims.rcs.uce.presence.subscribe.SubscribeController;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
import com.android.internal.annotations.VisibleForTesting;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@@ -192,59 +189,30 @@ public class SubscribeRequest extends CapabilityRequest {
pidfXml = Collections.EMPTY_LIST;
}
- // Convert from the pidf xml to the list of RcsContactUceCapabilityWrapper
- List<RcsContactUceCapabilityWrapper> capabilityList = pidfXml.stream()
- .map(pidf -> PidfParser.getRcsContactUceCapabilityWrapper(pidf))
+ // Convert from the pidf xml to the list of RcsContactUceCapability
+ List<RcsContactUceCapability> capabilityList = pidfXml.stream()
+ .map(pidf -> PidfParser.getRcsContactUceCapability(pidf))
.filter(Objects::nonNull)
.collect(Collectors.toList());
// When the given PIDF xml is empty, set the contacts who have not received the
// capabilities updated as non-RCS user.
- List<RcsContactUceCapability> notReceivedCapabilityList = new ArrayList<>();
if (capabilityList.isEmpty()) {
logd("onCapabilitiesUpdate: The capabilities list is empty, Set to non-RCS user.");
List<Uri> notReceiveCapUpdatedContactList =
mRequestResponse.getNotReceiveCapabilityUpdatedContact();
- notReceivedCapabilityList = notReceiveCapUpdatedContactList.stream()
+ capabilityList = notReceiveCapUpdatedContactList.stream()
.map(PidfParserUtils::getNotFoundContactCapabilities)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
- List<RcsContactUceCapability> updateCapabilityList = new ArrayList<>();
- List<Uri> malformedListWithEntityURI = new ArrayList<>();
- for (RcsContactUceCapabilityWrapper capability : capabilityList) {
- if (!capability.isMalformed()) {
- updateCapabilityList.add(capability.toRcsContactUceCapability());
- } else {
- logw("onCapabilitiesUpdate: malformed capability was found and not saved.");
- malformedListWithEntityURI.add(capability.getEntityUri());
- }
- }
logd("onCapabilitiesUpdate: PIDF size=" + pidfXml.size()
- + ", not received capability size=" + notReceivedCapabilityList.size()
- + ", normal capability size=" + updateCapabilityList.size()
- + ", malformed but entity uri is valid capability size="
- + malformedListWithEntityURI.size());
-
- for (RcsContactUceCapability emptyCapability : notReceivedCapabilityList) {
- updateCapabilityList.add(emptyCapability);
- }
+ + ", contact capability size=" + capabilityList.size());
- // All tuples in received xml are malformed but entity uri is valid.
- // The capability should be get from the DB and report it to callback.
- List<EabCapabilityResult> cachedCapabilityList =
- mRequestManagerCallback.getCapabilitiesFromCache(malformedListWithEntityURI);
- for (EabCapabilityResult cacheEabCapability : cachedCapabilityList) {
- RcsContactUceCapability cachedCapability = cacheEabCapability.getContactCapabilities();
- if (cachedCapability != null) {
- updateCapabilityList.add(cachedCapability);
- }
- }
// Add these updated RcsContactUceCapability into the RequestResponse and notify
// the RequestManager to process the RcsContactUceCapabilities updated.
- logd("onCapabilitiesUpdate: updatedCapability size=" + updateCapabilityList.size());
- mRequestResponse.addUpdatedCapabilities(updateCapabilityList);
+ mRequestResponse.addUpdatedCapabilities(capabilityList);
mRequestManagerCallback.notifyCapabilitiesUpdated(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..ee6bd356 100644
--- a/src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java
+++ b/src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java
@@ -25,14 +25,11 @@ import android.telephony.ims.RcsUceAdapter;
import android.telephony.ims.aidl.IRcsUceControllerCallback;
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.SubscriptionTerminatedHelper.TerminatedResult;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
-import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.internal.annotations.VisibleForTesting;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
@@ -54,13 +51,7 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
* The builder of the SubscribeRequestCoordinator class.
*/
public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c) {
- mRequestCoordinator = new SubscribeRequestCoordinator(subId, requests, c,
- UceStatsWriter.getInstance());
- }
- @VisibleForTesting
- public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c,
- UceStatsWriter instance) {
- mRequestCoordinator = new SubscribeRequestCoordinator(subId, requests, c, instance);
+ mRequestCoordinator = new SubscribeRequestCoordinator(subId, requests, c);
}
/**
@@ -161,12 +152,9 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
// The callback to notify the result of the capabilities request.
private volatile IRcsUceControllerCallback mCapabilitiesCallback;
- private final UceStatsWriter mUceStatsWriter;
-
private SubscribeRequestCoordinator(int subId, Collection<UceRequest> requests,
- RequestManagerCallback requestMgrCallback, UceStatsWriter instance) {
+ RequestManagerCallback requestMgrCallback) {
super(subId, requests, requestMgrCallback);
- mUceStatsWriter = instance;
logd("SubscribeRequestCoordinator: created");
}
@@ -258,10 +246,6 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
// Finish this request.
request.onFinish();
- int commandErrorCode = response.getCommandError().orElse(0);
- mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.SUBSCRIBE_EVENT,
- false, commandErrorCode, 0);
-
// Remove this request from the activated collection and notify RequestManager.
Long taskId = request.getTaskId();
RequestResult requestResult = sCommandErrorCreator.createRequestResult(taskId, response,
@@ -277,9 +261,6 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
CapabilityRequestResponse response = request.getRequestResponse();
logd("handleNetworkResponse: " + response.toString());
- int respCode = response.getNetworkRespSipCode().orElse(0);
- mUceStatsWriter.setSubscribeResponse(mSubId, request.getTaskId(), respCode);
-
// Refresh the device state with the request result.
response.getResponseSipCode().ifPresent(sipCode -> {
String reason = response.getResponseReason().orElse("");
@@ -313,7 +294,6 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
private RequestResult handleNetworkResponseFailed(SubscribeRequest request) {
final long taskId = request.getTaskId();
final CapabilityRequestResponse response = request.getRequestResponse();
- final List<Uri> requestUris = response.getNotReceiveCapabilityUpdatedContact();
RequestResult requestResult = null;
if (response.isNotFound()) {
@@ -321,7 +301,8 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
// updated callback from the ImsService afterward. Therefore, we create the capabilities
// with the result REQUEST_RESULT_NOT_FOUND by ourself and will trigger the
// capabilities received callback to the clients later.
- List<RcsContactUceCapability> capabilityList = requestUris.stream().map(uri ->
+ List<Uri> uriList = request.getContactUri();
+ List<RcsContactUceCapability> capabilityList = uriList.stream().map(uri ->
PidfParserUtils.getNotFoundContactCapabilities(uri))
.collect(Collectors.toList());
response.addUpdatedCapabilities(capabilityList);
@@ -329,18 +310,9 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
// We treat the NOT FOUND is a successful result.
requestResult = sNetworkRespSuccessfulCreator.createRequestResult(taskId, response,
mRequestManagerCallback);
- } else {
- // The request result is unsuccessful and it's not the NOT FOUND error. we need to get
- // the capabilities from the cache.
- List<RcsContactUceCapability> capabilitiesList =
- getCapabilitiesFromCacheIncludingExpired(requestUris);
- response.addUpdatedCapabilities(capabilitiesList);
-
- // Add to the throttling list for the inconclusive result of the contacts.
- mRequestManagerCallback.addToThrottlingList(requestUris,
- response.getResponseSipCode().orElse(
- com.android.ims.rcs.uce.util.NetworkSipCode.SIP_CODE_REQUEST_TIMEOUT));
+ }
+ if (requestResult == null) {
requestResult = sNetworkRespErrorCreator.createRequestResult(taskId, response,
mRequestManagerCallback);
}
@@ -348,41 +320,6 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
}
/**
- * Get the contact capabilities from the cache even if the capabilities have expired. If the
- * capabilities doesn't exist, create the non-RCS capabilities instead.
- * @param uris the uris to get the capabilities from cache.
- * @return The contact capabilities for the given uris.
- */
- private List<RcsContactUceCapability> getCapabilitiesFromCacheIncludingExpired(List<Uri> uris) {
- List<RcsContactUceCapability> resultList = new ArrayList<>();
- List<RcsContactUceCapability> notFoundFromCacheList = new ArrayList<>();
-
- // Get the capabilities from the cache.
- List<EabCapabilityResult> eabResultList =
- mRequestManagerCallback.getCapabilitiesFromCacheIncludingExpired(uris);
-
- eabResultList.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("getCapabilitiesFromCacheIncludingExpired: requesting uris size=" + uris.size() +
- ", capabilities not found from cache size=" + notFoundFromCacheList.size());
- return resultList;
- }
-
- /**
* This method is called when the given SubscribeRequest received the onNotifyCapabilitiesUpdate
* callback from the ImsService.
*/
@@ -396,7 +333,6 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
return;
}
- mUceStatsWriter.setPresenceNotifyEvent(mSubId, taskId, updatedCapList);
// Save the updated capabilities to the cache.
mRequestManagerCallback.saveCapabilities(updatedCapList);
@@ -420,8 +356,6 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
return;
}
- mUceStatsWriter.setPresenceNotifyEvent(mSubId, taskId, terminatedResources);
-
// Save the terminated capabilities to the cache.
mRequestManagerCallback.saveCapabilities(terminatedResources);
@@ -462,7 +396,6 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
// Remove this request from the activated collection and notify RequestManager.
Long taskId = request.getTaskId();
- mUceStatsWriter.setSubscribeTerminated(mSubId, taskId, response.getTerminatedReason());
RequestResult requestResult = sTerminatedCreator.createRequestResult(taskId, response,
mRequestManagerCallback);
moveRequestToFinishedCollection(taskId, requestResult);
@@ -487,39 +420,20 @@ public class SubscribeRequestCoordinator extends UceRequestCoordinator {
}
/**
- * This method is called when the framework did not receive the capabilities request result.
+ * This method is called when the framework does not receive receive the result for
+ * capabilities request.
*/
private void handleRequestTimeout(SubscribeRequest request) {
CapabilityRequestResponse response = request.getRequestResponse();
- List<Uri> requestUris = response.getNotReceiveCapabilityUpdatedContact();
logd("handleRequestTimeout: " + response);
- logd("handleRequestTimeout: not received updated uri size=" + requestUris.size());
-
- // Add to the throttling list for the inconclusive result of the contacts.
- mRequestManagerCallback.addToThrottlingList(requestUris,
- com.android.ims.rcs.uce.util.NetworkSipCode.SIP_CODE_REQUEST_TIMEOUT);
- // Get the capabilities from the cache instead and add to the response.
- List<RcsContactUceCapability> capabilitiesList =
- getCapabilitiesFromCacheIncludingExpired(requestUris);
- response.addUpdatedCapabilities(capabilitiesList);
-
- // Trigger capabilities updated callback if there is any.
- List<RcsContactUceCapability> updatedCapList = response.getUpdatedContactCapability();
- if (!updatedCapList.isEmpty()) {
- triggerCapabilitiesReceivedCallback(updatedCapList);
- response.removeUpdatedCapabilities(updatedCapList);
- }
+ // Finish this request
+ request.onFinish();
// Remove this request from the activated collection and notify RequestManager.
long taskId = request.getTaskId();
RequestResult requestResult = sRequestTimeoutCreator.createRequestResult(taskId,
response, mRequestManagerCallback);
-
- // Finish this request
- request.onFinish();
-
- // Remove this request from the activated collection and notify RequestManager.
moveRequestToFinishedCollection(taskId, requestResult);
}
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..3e12ba30 100644
--- a/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java
+++ b/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java
@@ -22,7 +22,6 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
-import android.telephony.TelephonyManager;
import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.RcsContactUceCapability.CapabilityMechanism;
import android.telephony.ims.RcsUceAdapter;
@@ -31,9 +30,6 @@ import android.telephony.ims.aidl.IRcsUceControllerCallback;
import android.text.TextUtils;
import android.util.Log;
-import com.android.i18n.phonenumbers.NumberParseException;
-import com.android.i18n.phonenumbers.PhoneNumberUtil;
-import com.android.i18n.phonenumbers.Phonenumber;
import com.android.ims.rcs.uce.UceController;
import com.android.ims.rcs.uce.UceController.UceControllerCallback;
import com.android.ims.rcs.uce.UceDeviceState;
@@ -53,7 +49,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -65,14 +60,6 @@ public class UceRequestManager {
private static final String LOG_TAG = UceUtils.getLogPrefix() + "UceRequestManager";
/**
- * When enabled, skip the request queue for requests that have numbers with valid cached
- * capabilities and return that cached info directly.
- * Note: This also has a CTS test associated with it, so this can not be disabled without
- * disabling the corresponding RcsUceAdapterTest#testCacheQuerySuccessWhenNetworkBlocked test.
- */
- private static final boolean FEATURE_SHORTCUT_QUEUE_FOR_CACHED_CAPS = true;
-
- /**
* Testing interface used to mock UceUtils in testing.
*/
@VisibleForTesting
@@ -161,21 +148,11 @@ public class UceRequestManager {
List<EabCapabilityResult> getCapabilitiesFromCache(List<Uri> uriList);
/**
- * Retrieve the contact capabilities from the cache including the expired capabilities.
- */
- List<EabCapabilityResult> getCapabilitiesFromCacheIncludingExpired(List<Uri> uriList);
-
- /**
* Retrieve the contact availability from the cache.
*/
EabCapabilityResult getAvailabilityFromCache(Uri uri);
/**
- * Retrieve the contact availability from the cache including the expired capabilities.
- */
- EabCapabilityResult getAvailabilityFromCacheIncludingExpired(Uri uri);
-
- /**
* Store the given contact capabilities to the cache.
*/
void saveCapabilities(List<RcsContactUceCapability> contactCapabilities);
@@ -264,19 +241,6 @@ public class UceRequestManager {
* to remove the coordinator from the UceRequestRepository.
*/
void notifyRequestCoordinatorFinished(long requestCoordinatorId);
-
- /**
- * Check whether the given uris are in the throttling list.
- * @param uriList the uris to check if it is in the throttling list
- * @return the uris in the throttling list
- */
- List<Uri> getInThrottlingListUris(List<Uri> uriList);
-
- /**
- * Add the given uris to the throttling list because the capabilities request result
- * is inconclusive.
- */
- void addToThrottlingList(List<Uri> uriList, int sipCode);
}
private RequestManagerCallback mRequestMgrCallback = new RequestManagerCallback() {
@@ -291,21 +255,11 @@ public class UceRequestManager {
}
@Override
- public List<EabCapabilityResult> getCapabilitiesFromCacheIncludingExpired(List<Uri> uris) {
- return mControllerCallback.getCapabilitiesFromCacheIncludingExpired(uris);
- }
-
- @Override
public EabCapabilityResult getAvailabilityFromCache(Uri uri) {
return mControllerCallback.getAvailabilityFromCache(uri);
}
@Override
- public EabCapabilityResult getAvailabilityFromCacheIncludingExpired(Uri uri) {
- return mControllerCallback.getAvailabilityFromCacheIncludingExpired(uri);
- }
-
- @Override
public void saveCapabilities(List<RcsContactUceCapability> contactCapabilities) {
mControllerCallback.saveCapabilities(contactCapabilities);
}
@@ -396,23 +350,12 @@ public class UceRequestManager {
public void notifyRequestCoordinatorFinished(long requestCoordinatorId) {
mHandler.sendRequestCoordinatorFinishedMessage(requestCoordinatorId);
}
-
- @Override
- public List<Uri> getInThrottlingListUris(List<Uri> uriList) {
- return mThrottlingList.getInThrottlingListUris(uriList);
- }
-
- @Override
- public void addToThrottlingList(List<Uri> uriList, int sipCode) {
- mThrottlingList.addToThrottlingList(uriList, sipCode);
- }
};
private final int mSubId;
private final Context mContext;
private final UceRequestHandler mHandler;
private final UceRequestRepository mRequestRepository;
- private final ContactThrottlingList mThrottlingList;
private volatile boolean mIsDestroyed;
private OptionsController mOptionsCtrl;
@@ -424,7 +367,6 @@ public class UceRequestManager {
mContext = context;
mControllerCallback = c;
mHandler = new UceRequestHandler(this, looper);
- mThrottlingList = new ContactThrottlingList(mSubId);
mRequestRepository = new UceRequestRepository(subId, mRequestMgrCallback);
logi("create");
}
@@ -437,7 +379,6 @@ public class UceRequestManager {
mControllerCallback = c;
mHandler = new UceRequestHandler(this, looper);
mRequestRepository = requestRepository;
- mThrottlingList = new ContactThrottlingList(mSubId);
}
/**
@@ -461,18 +402,10 @@ public class UceRequestManager {
logi("onDestroy");
mIsDestroyed = true;
mHandler.onDestroy();
- mThrottlingList.reset();
mRequestRepository.onDestroy();
}
/**
- * Clear the throttling list.
- */
- public void resetThrottlingList() {
- mThrottlingList.reset();
- }
-
- /**
* Send a new capability request. It is called by UceController.
*/
public void sendCapabilityRequest(List<Uri> uriList, boolean skipFromCache,
@@ -500,27 +433,12 @@ public class UceRequestManager {
private void sendRequestInternal(@UceRequestType int type, List<Uri> uriList,
boolean skipFromCache, IRcsUceControllerCallback callback) throws RemoteException {
UceRequestCoordinator requestCoordinator = null;
- List<Uri> nonCachedUris = uriList;
- if (FEATURE_SHORTCUT_QUEUE_FOR_CACHED_CAPS && !skipFromCache) {
- nonCachedUris = sendCachedCapInfoToRequester(type, uriList, callback);
- if (uriList.size() != nonCachedUris.size()) {
- logd("sendRequestInternal: shortcut queue for caps - request reduced from "
- + uriList.size() + " entries to " + nonCachedUris.size() + " entries");
- } else {
- logd("sendRequestInternal: shortcut queue for caps - no cached caps.");
- }
- if (nonCachedUris.isEmpty()) {
- logd("sendRequestInternal: shortcut complete, sending success result");
- callback.onComplete();
- return;
- }
- }
if (sUceUtilsProxy.isPresenceCapExchangeEnabled(mContext, mSubId) &&
sUceUtilsProxy.isPresenceSupported(mContext, mSubId)) {
- requestCoordinator = createSubscribeRequestCoordinator(type, nonCachedUris,
- skipFromCache, callback);
+ requestCoordinator = createSubscribeRequestCoordinator(type, uriList, skipFromCache,
+ callback);
} else if (sUceUtilsProxy.isSipOptionsSupported(mContext, mSubId)) {
- requestCoordinator = createOptionsRequestCoordinator(type, nonCachedUris, callback);
+ requestCoordinator = createOptionsRequestCoordinator(type, uriList, callback);
}
if (requestCoordinator == null) {
@@ -541,64 +459,6 @@ public class UceRequestManager {
addRequestCoordinator(requestCoordinator);
}
- /**
- * Try to get the valid capabilities associated with the URI List specified from the EAB cache.
- * If one or more of the numbers from the URI List have valid cached capabilities, return them
- * to the requester now and remove them from the returned List of URIs that will require a
- * network query.
- * @param type The type of query
- * @param uriList The List of URIs that we want to send cached capabilities for
- * @param callback The callback used to communicate with the remote requester
- * @return The List of URIs that were not found in the capability cache and will require a
- * network query.
- */
- private List<Uri> sendCachedCapInfoToRequester(int type, List<Uri> uriList,
- IRcsUceControllerCallback callback) {
- List<Uri> nonCachedUris = new ArrayList<>(uriList);
- List<RcsContactUceCapability> numbersWithCachedCaps =
- getCapabilitiesFromCache(type, nonCachedUris);
- try {
- if (!numbersWithCachedCaps.isEmpty()) {
- logd("sendCachedCapInfoToRequester: cached caps found for "
- + numbersWithCachedCaps.size() + " entries. Notifying requester.");
- // Notify caller of the numbers that have cached caps
- callback.onCapabilitiesReceived(numbersWithCachedCaps);
- }
- } catch (RemoteException e) {
- logw("sendCachedCapInfoToRequester, error sending cap info back to requester: " + e);
- }
- // remove these numbers from the numbers pending a cap query from the network.
- for (RcsContactUceCapability c : numbersWithCachedCaps) {
- nonCachedUris.removeIf(uri -> c.getContactUri().equals(uri));
- }
- return nonCachedUris;
- }
-
- /**
- * Get the capabilities for the List of given URIs
- * @param requestType The request type, used to determine if the cached info is "fresh" enough.
- * @param uriList The List of URIs that we will be requesting cached capabilities for.
- * @return A list of capabilities corresponding to the subset of numbers that still have
- * valid cache data associated with them.
- */
- private List<RcsContactUceCapability> getCapabilitiesFromCache(int requestType,
- List<Uri> uriList) {
- List<EabCapabilityResult> resultList = Collections.emptyList();
- if (requestType == UceRequest.REQUEST_TYPE_CAPABILITY) {
- resultList = mRequestMgrCallback.getCapabilitiesFromCache(uriList);
- } else if (requestType == UceRequest.REQUEST_TYPE_AVAILABILITY) {
- // Always get the first element if the request type is availability.
- resultList = Collections.singletonList(
- mRequestMgrCallback.getAvailabilityFromCache(uriList.get(0)));
- }
- // Map from EabCapabilityResult -> RcsContactUceCapability.
- // Pull out only items that have valid cache data.
- return resultList.stream().filter(Objects::nonNull)
- .filter(result -> result.getStatus() == EabCapabilityResult.EAB_QUERY_SUCCESSFUL)
- .map(EabCapabilityResult::getContactCapabilities)
- .filter(Objects::nonNull).collect(Collectors.toList());
- }
-
private UceRequestCoordinator createSubscribeRequestCoordinator(final @UceRequestType int type,
final List<Uri> uriList, boolean skipFromCache, IRcsUceControllerCallback callback) {
SubscribeRequestCoordinator.Builder builder;
@@ -609,25 +469,6 @@ public class UceRequestManager {
List<UceRequest> requestList = new ArrayList<>();
uriList.forEach(uri -> {
List<Uri> individualUri = Collections.singletonList(uri);
- // Entity-uri, which is used as a request-uri, uses only a single subscription case
- List<RcsContactUceCapability> capabilities =
- getCapabilitiesFromCache(type, individualUri);
- if (!capabilities.isEmpty()) {
- RcsContactUceCapability capability = capabilities.get(0);
- Uri entityUri = capability.getEntityUri();
- if (entityUri != null) {
- // The query uri has been replaced by the stored entity uri.
- individualUri = Collections.singletonList(entityUri);
- } else {
- if (UceUtils.isSipUriForPresenceSubscribeEnabled(mContext, mSubId)) {
- individualUri = Collections.singletonList(getSipUriFromUri(uri));
- }
- }
- } else {
- if (UceUtils.isSipUriForPresenceSubscribeEnabled(mContext, mSubId)) {
- individualUri = Collections.singletonList(getSipUriFromUri(uri));
- }
- }
UceRequest request = createSubscribeRequest(type, individualUri, skipFromCache);
requestList.add(request);
});
@@ -856,7 +697,7 @@ public class UceRequestManager {
SomeArgs args = (SomeArgs) msg.obj;
final Long coordinatorId = (Long) args.arg1;
final Long taskId = (Long) Optional.ofNullable(args.arg2).orElse(-1L);
- final Integer requestEvent = Optional.ofNullable(args.argi1).orElse(-1);
+ final Integer requestEvent = Optional.of(args.argi1).orElse(-1);
args.recycle();
requestManager.logd("handleMessage: " + EVENT_DESCRIPTION.get(msg.what)
@@ -946,33 +787,6 @@ public class UceRequestManager {
mRequestRepository.notifyRequestFinished(taskId);
}
- private Uri getSipUriFromUri(Uri uri) {
- Uri convertedUri = uri;
- String number = convertedUri.getSchemeSpecificPart();
- String[] numberParts = number.split("[@;:]");
- number = numberParts[0];
-
- TelephonyManager manager = mContext.getSystemService(TelephonyManager.class);
- if (manager.getIsimDomain() == null) {
- return convertedUri;
- }
- String simCountryIso = manager.getSimCountryIso();
- if (TextUtils.isEmpty(simCountryIso)) {
- return convertedUri;
- }
- simCountryIso = simCountryIso.toUpperCase();
- PhoneNumberUtil util = PhoneNumberUtil.getInstance();
- try {
- Phonenumber.PhoneNumber phoneNumber = util.parse(number, simCountryIso);
- number = util.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
- String sipUri = "sip:" + number + "@" + manager.getIsimDomain();
- convertedUri = Uri.parse(sipUri);
- } catch (NumberParseException e) {
- Log.w(LOG_TAG, "formatNumber: could not format " + number + ", error: " + e);
- }
- return convertedUri;
- }
-
@VisibleForTesting
public UceRequestHandler getUceRequestHandler() {
return mHandler;
diff --git a/src/java/com/android/ims/rcs/uce/util/FeatureTags.java b/src/java/com/android/ims/rcs/uce/util/FeatureTags.java
index 8dbceda6..bba51fb0 100644
--- a/src/java/com/android/ims/rcs/uce/util/FeatureTags.java
+++ b/src/java/com/android/ims/rcs/uce/util/FeatureTags.java
@@ -74,9 +74,6 @@ public class FeatureTags {
"+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.chatbot.sa\"";
public static final String FEATURE_TAG_CHATBOT_VERSION_SUPPORTED =
- "+g.gsma.rcs.botversion=\"#=1\"";
-
- public static final String FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED =
"+g.gsma.rcs.botversion=\"#=1,#=2\"";
public static final String FEATURE_TAG_CHATBOT_ROLE = "+g.gsma.rcs.isbot";
diff --git a/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java b/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java
index 30099f3b..a1e35d76 100644
--- a/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java
+++ b/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java
@@ -32,7 +32,6 @@ public class NetworkSipCode {
public static final int SIP_CODE_NOT_FOUND = 404;
public static final int SIP_CODE_METHOD_NOT_ALLOWED = 405;
public static final int SIP_CODE_REQUEST_TIMEOUT = 408;
- public static final int SIP_CODE_REQUEST_ENTITY_TOO_LARGE = 413;
public static final int SIP_CODE_INTERVAL_TOO_BRIEF = 423;
public static final int SIP_CODE_TEMPORARILY_UNAVAILABLE = 480;
public static final int SIP_CODE_BAD_EVENT = 489;
@@ -64,7 +63,6 @@ public class NetworkSipCode {
int uceError;
switch (sipCode) {
case NetworkSipCode.SIP_CODE_FORBIDDEN: // 403
- case NetworkSipCode.SIP_CODE_SERVER_TIMEOUT: // 504
if(requestType == UceController.REQUEST_TYPE_PUBLISH) {
// Not provisioned for PUBLISH request.
uceError = RcsUceAdapter.ERROR_NOT_AUTHORIZED;
diff --git a/src/java/com/android/ims/rcs/uce/util/UceUtils.java b/src/java/com/android/ims/rcs/uce/util/UceUtils.java
index c5f2b122..c88de0b3 100644
--- a/src/java/com/android/ims/rcs/uce/util/UceUtils.java
+++ b/src/java/com/android/ims/rcs/uce/util/UceUtils.java
@@ -24,9 +24,7 @@ import android.preference.PreferenceManager;
import android.provider.BlockedNumberContract;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
-import android.telephony.ims.ImsRcsManager;
import android.telephony.ims.ProvisioningManager;
-import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.text.TextUtils;
import android.util.Log;
@@ -55,9 +53,6 @@ public class UceUtils {
private static final long DEFAULT_CAP_REQUEST_TIMEOUT_AFTER_MS = TimeUnit.MINUTES.toMillis(3);
private static Optional<Long> OVERRIDE_CAP_REQUEST_TIMEOUT_AFTER_MS = Optional.empty();
- // The default value of the availability cache expiration.
- private static final long DEFAULT_AVAILABILITY_CACHE_EXPIRATION_SEC = 60L; // 60 seconds
-
// The task ID of the UCE request
private static long TASK_ID = 0L;
@@ -102,9 +97,9 @@ public class UceUtils {
}
try {
ProvisioningManager manager = ProvisioningManager.createForSubscriptionId(subId);
- isProvisioned = manager.getRcsProvisioningStatusForCapability(
- ImsRcsManager.CAPABILITY_TYPE_PRESENCE_UCE,
- ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
+ isProvisioned = manager.getProvisioningIntValue(
+ ProvisioningManager.KEY_EAB_PROVISIONING_STATUS)
+ == ProvisioningManager.PROVISIONING_VALUE_ENABLED;
} catch (Exception e) {
Log.w(LOG_TAG, "isEabProvisioned: exception=" + e.getMessage());
}
@@ -194,38 +189,6 @@ public class UceUtils {
}
/**
- * Check whether sip uri should be used for presence subscribe
- */
- public static boolean isSipUriForPresenceSubscribeEnabled(Context context, int subId) {
- CarrierConfigManager configManager = context.getSystemService(CarrierConfigManager.class);
- if (configManager == null) {
- return false;
- }
- PersistableBundle config = configManager.getConfigForSubId(subId);
- if (config == null) {
- return false;
- }
- return config.getBoolean(
- CarrierConfigManager.Ims.KEY_USE_SIP_URI_FOR_PRESENCE_SUBSCRIBE_BOOL);
- }
-
- /**
- * Check whether tel uri should be used for pidf xml
- */
- public static boolean isTelUriForPidfXmlEnabled(Context context, int subId) {
- CarrierConfigManager configManager = context.getSystemService(CarrierConfigManager.class);
- if (configManager == null) {
- return false;
- }
- PersistableBundle config = configManager.getConfigForSubId(subId);
- if (config == null) {
- return false;
- }
- return config.getBoolean(
- CarrierConfigManager.Ims.KEY_USE_TEL_URI_FOR_PIDF_XML_BOOL);
- }
-
- /**
* Get the minimum time that allow two PUBLISH requests can be executed continuously.
*
* @param subId The subscribe ID
@@ -437,26 +400,4 @@ public class UceUtils {
}
return numberParts[0];
}
-
- /**
- * Get the availability expiration from provisioning manager.
- * @param subId The subscription ID
- * @return the number of seconds for the availability cache expiration.
- */
- public static long getAvailabilityCacheExpiration(int subId) {
- long value = -1;
- try {
- ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(subId);
- value = pm.getProvisioningIntValue(
- ProvisioningManager.KEY_RCS_AVAILABILITY_CACHE_EXPIRATION_SEC);
- } catch (Exception e) {
- Log.w(LOG_TAG, "Exception in getAvailabilityCacheExpiration: " + e);
- }
-
- if (value <= 0) {
- Log.w(LOG_TAG, "The availability expiration cannot be less than 0.");
- value = DEFAULT_AVAILABILITY_CACHE_EXPIRATION_SEC;
- }
- return value;
- }
}
diff --git a/tests/src/com/android/ims/FeatureConnectionTest.java b/tests/src/com/android/ims/FeatureConnectionTest.java
index 532c07b9..d7a9134c 100644
--- a/tests/src/com/android/ims/FeatureConnectionTest.java
+++ b/tests/src/com/android/ims/FeatureConnectionTest.java
@@ -53,8 +53,8 @@ public class FeatureConnectionTest extends ImsTestBase {
public int mNewStatus = ImsFeature.STATE_UNAVAILABLE;
public long mCapabilities;
- TestFeatureConnection(Context context, int slotId, int subId) {
- super(context, slotId, subId, mConfigBinder, mRegistrationBinder, mSipTransportBinder);
+ TestFeatureConnection(Context context, int slotId) {
+ super(context, slotId, mConfigBinder, mRegistrationBinder, mSipTransportBinder);
if (!ImsManager.isImsSupportedOnDevice(context)) {
sImsSupportedOnDevice = false;
}
@@ -87,7 +87,6 @@ public class FeatureConnectionTest extends ImsTestBase {
@Mock ISipTransport mSipTransportBinder;
public static final int PHONE_ID = 1;
- public static final int SUB_ID = 2;
@Before
public void setUp() throws Exception {
@@ -96,7 +95,7 @@ public class FeatureConnectionTest extends ImsTestBase {
doReturn(null).when(mContext).getMainLooper();
mContextFixture.addSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS);
- mTestFeatureConnection = new TestFeatureConnection(mContext, PHONE_ID, SUB_ID);
+ mTestFeatureConnection = new TestFeatureConnection(mContext, PHONE_ID);
mTestFeatureConnection.setBinder(mBinder);
}
diff --git a/tests/src/com/android/ims/FeatureConnectorTest.java b/tests/src/com/android/ims/FeatureConnectorTest.java
index c2b0a10d..e560ae66 100644
--- a/tests/src/com/android/ims/FeatureConnectorTest.java
+++ b/tests/src/com/android/ims/FeatureConnectorTest.java
@@ -24,7 +24,6 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -58,9 +57,9 @@ public class FeatureConnectorTest extends ImsTestBase {
private static class TestFeatureConnection extends FeatureConnection {
- public TestFeatureConnection(Context context, int slotId, int subId, IImsConfig c,
+ public TestFeatureConnection(Context context, int slotId, IImsConfig c,
IImsRegistration r, ISipTransport s) {
- super(context, slotId, subId, c, r, s);
+ super(context, slotId, c, r, s);
}
@Override
@@ -97,8 +96,8 @@ public class FeatureConnectorTest extends ImsTestBase {
}
@Override
- public void associate(ImsFeatureContainer c, int subId) {
- connection = new TestFeatureConnection(mContext, mPhoneId, subId, c.imsConfig,
+ public void associate(ImsFeatureContainer c) {
+ connection = new TestFeatureConnection(mContext, mPhoneId, c.imsConfig,
c.imsRegistration, c.sipTransport);
connection.setBinder(c.imsFeature);
}
@@ -129,7 +128,6 @@ public class FeatureConnectorTest extends ImsTestBase {
@Mock private ISipTransport transport;
private static final int PHONE_ID = 1;
- private static final int SUB_ID = 2;
private static final long TEST_CAPS = ImsService.CAPABILITY_EMERGENCY_OVER_MMTEL;
@Before
@@ -153,15 +151,15 @@ public class FeatureConnectorTest extends ImsTestBase {
assertNotNull("connect should trigger the callback registration", mTestManager.callback);
// simulate callback from ImsResolver
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
assertNotNull(mTestManager.connection);
assertEquals(TEST_CAPS, mTestManager.connection.getFeatureCapabilties());
- verify(mListener, never()).connectionReady(any(), eq(SUB_ID));
+ verify(mListener, never()).connectionReady(any());
verify(mListener, never()).connectionUnavailable(anyInt());
// simulate callback from ImsResolver
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener, never()).connectionUnavailable(anyInt());
}
@@ -186,16 +184,16 @@ public class FeatureConnectorTest extends ImsTestBase {
mFeatureConnector.connect();
assertNotNull("connect should trigger the callback registration", mTestManager.callback);
// simulate callback from ImsResolver
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener, never()).connectionUnavailable(anyInt());
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE, SUB_ID);
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE);
assertNotNull("When not ready, the callback should still be registered",
mTestManager.callback);
assertNotNull("Do not invalidate the connection if not ready", mTestManager.connection);
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_NOT_READY);
}
@@ -209,23 +207,23 @@ public class FeatureConnectorTest extends ImsTestBase {
mFeatureConnector.connect();
assertNotNull("connect should trigger the callback registration", mTestManager.callback);
// simulate callback from ImsResolver
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
- verify(mListener, never()).connectionReady(mTestManager, SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
+ verify(mListener, never()).connectionReady(mTestManager);
verify(mListener, never()).connectionUnavailable(anyInt());
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_INITIALIZING, SUB_ID);
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_INITIALIZING);
assertNotNull("When not ready, the callback should still be registered",
mTestManager.callback);
assertNotNull("Do not invalidate the connection if not ready", mTestManager.connection);
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener, never()).connectionUnavailable(anyInt());
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
assertNotNull("When not ready, the callback should still be registered",
mTestManager.callback);
assertNotNull("Do not invalidate the connection if not ready", mTestManager.connection);
// Should not notify ready multiple times
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener, never()).connectionUnavailable(anyInt());
}
@@ -240,28 +238,28 @@ public class FeatureConnectorTest extends ImsTestBase {
mFeatureConnector.connect();
assertNotNull("connect should trigger the callback registration", mTestManager.callback);
// simulate callback from ImsResolver
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
+ verify(mListener).connectionReady(mTestManager);
verify(mListener, never()).connectionUnavailable(anyInt());
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE, SUB_ID);
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE);
assertNotNull("When not ready, the callback should still be registered",
mTestManager.callback);
assertNotNull("Do not invalidate the connection if not ready", mTestManager.connection);
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener, never()).connectionUnavailable(anyInt());
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_INITIALIZING, SUB_ID);
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_INITIALIZING);
assertNotNull("When not ready, the callback should still be registered",
mTestManager.callback);
assertNotNull("Do not invalidate the connection if not ready", mTestManager.connection);
// Should not notify ready multiple times
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener, never()).connectionUnavailable(anyInt());
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
// Should not notify ready multiple times
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener, never()).connectionUnavailable(anyInt());
}
@@ -300,20 +298,20 @@ public class FeatureConnectorTest extends ImsTestBase {
mFeatureConnector.connect();
assertNotNull("connect should trigger the callback registration", mTestManager.callback);
// simulate callback from ImsResolver
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener, never()).connectionUnavailable(anyInt());
mTestManager.callback.imsFeatureRemoved(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
assertNotNull("When not ready, the callback should still be registered",
mTestManager.callback);
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
- verify(mListener, times(2)).connectionReady(mTestManager, SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
+ verify(mListener, times(2)).connectionReady(mTestManager);
verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
}
@@ -324,23 +322,23 @@ public class FeatureConnectorTest extends ImsTestBase {
mFeatureConnector.connect();
assertNotNull("connect should trigger the callback registration", mTestManager.callback);
// simulate callback from ImsResolver
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
IImsServiceFeatureCallback oldCb = mTestManager.callback;
TestFeatureConnection testFc = mTestManager.connection;
mFeatureConnector.disconnect();
assertNull(mTestManager.callback);
assertNull(mTestManager.connection);
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
// make sure status/caps updates do not trigger more events after disconnect
- oldCb.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
- oldCb.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE, SUB_ID);
+ oldCb.imsStatusChanged(ImsFeature.STATE_READY);
+ oldCb.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE);
oldCb.updateCapabilities(0);
assertEquals(TEST_CAPS, testFc.getFeatureCapabilties());
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
}
@@ -351,22 +349,22 @@ public class FeatureConnectorTest extends ImsTestBase {
mFeatureConnector.connect();
assertNotNull("connect should trigger the callback registration", mTestManager.callback);
// simulate callback from ImsResolver
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
mFeatureConnector.disconnect();
assertNull(mTestManager.callback);
assertNull(mTestManager.connection);
- verify(mListener).connectionReady(mTestManager, SUB_ID);
+ verify(mListener).connectionReady(mTestManager);
verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
mFeatureConnector.connect();
assertNotNull(mTestManager.callback);
// simulate callback from ImsResolver
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
assertNotNull(mTestManager.connection);
- verify(mListener, times(2)).connectionReady(mTestManager, SUB_ID);
+ verify(mListener, times(2)).connectionReady(mTestManager);
verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
}
@@ -377,8 +375,8 @@ public class FeatureConnectorTest extends ImsTestBase {
mFeatureConnector.connect();
assertNotNull("connect should trigger the callback registration", mTestManager.callback);
// simulate callback from ImsResolver
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
assertEquals(TEST_CAPS, mTestManager.connection.getFeatureCapabilties());
mTestManager.callback.updateCapabilities(0);
assertEquals(0, mTestManager.connection.getFeatureCapabilties());
@@ -391,8 +389,8 @@ public class FeatureConnectorTest extends ImsTestBase {
mFeatureConnector.connect();
assertNotNull("connect should trigger the callback registration", mTestManager.callback);
// simulate callback from ImsResolver
- mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
- mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+ mTestManager.callback.imsFeatureCreated(createContainer());
+ mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
assertEquals(ImsFeature.STATE_READY, mTestManager.connection.getFeatureState());
}
diff --git a/tests/src/com/android/ims/ImsFeatureBinderRepositoryTest.java b/tests/src/com/android/ims/ImsFeatureBinderRepositoryTest.java
index 6f35e384..273d1dc8 100644
--- a/tests/src/com/android/ims/ImsFeatureBinderRepositoryTest.java
+++ b/tests/src/com/android/ims/ImsFeatureBinderRepositoryTest.java
@@ -21,7 +21,6 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -51,7 +50,6 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
private static final int TEST_PHONE_ID_1 = 1;
private static final int TEST_PHONE_ID_2 = 2;
- private static final int TEST_SUB_ID_3 = 3;
private static final long TEST_SERVICE_CAPS = ImsService.CAPABILITY_EMERGENCY_OVER_MMTEL;
@Mock IBinder mMockMmTelFeatureA;
@@ -88,7 +86,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
public void testGetInterfaceExists() throws Exception {
ImsFeatureContainer fc =
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fc);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fc);
ImsFeatureContainer resultFc =
mRepository.getIfExists(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL).orElse(null);
assertNotNull("returned connection should not be null!", resultFc);
@@ -110,8 +108,8 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
public void testGetInterfaceRemoveDoesntExist() throws Exception {
ImsFeatureContainer fc =
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fc);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, null);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fc);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, null);
ImsFeatureContainer resultFc =
mRepository.getIfExists(TEST_PHONE_ID_1,
ImsFeature.FEATURE_MMTEL).orElse(null);
@@ -125,8 +123,8 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
ImsFeatureContainer fcB =
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcB);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcB);
ImsFeatureContainer resultFc =
mRepository.getIfExists(TEST_PHONE_ID_1,
ImsFeature.FEATURE_MMTEL).orElse(null);
@@ -142,8 +140,8 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
ImsFeatureContainer fcB =
getFeatureContainer(mMockRcsFeatureA, TEST_SERVICE_CAPS);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_RCS, fcB);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_RCS, fcB);
ImsFeatureContainer resultFcA =
mRepository.getIfExists(TEST_PHONE_ID_1,
ImsFeature.FEATURE_MMTEL).orElse(null);
@@ -166,7 +164,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
}
@@ -178,7 +176,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
@@ -186,8 +184,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
// Listener is "dead", so we should not get this update
mRepository.notifyFeatureStateChanged(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
ImsFeature.STATE_READY);
- verify(mConnectionCallback, never()).imsStatusChanged(ImsFeature.STATE_READY,
- TEST_SUB_ID_3);
+ verify(mConnectionCallback, never()).imsStatusChanged(ImsFeature.STATE_READY);
}
@Test
@@ -197,18 +194,18 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
ImsFeatureContainer resultFc =
mRepository.getIfExists(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL).orElse(null);
assertNotNull(resultFc);
assertEquals(ImsFeature.STATE_UNAVAILABLE, resultFc.getState());
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
- verify(mConnectionCallback, never()).imsStatusChanged(anyInt(), eq(TEST_SUB_ID_3));
+ verify(mConnectionCallback, never()).imsStatusChanged(anyInt());
mRepository.notifyFeatureStateChanged(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
ImsFeature.STATE_READY);
- verify(mConnectionCallback).imsStatusChanged(ImsFeature.STATE_READY, TEST_SUB_ID_3);
+ verify(mConnectionCallback).imsStatusChanged(ImsFeature.STATE_READY);
assertEquals(ImsFeature.STATE_READY, resultFc.getState());
}
@@ -220,10 +217,9 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
ImsFeatureContainer resultFc =
- mRepository.getIfExists(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL).
- orElse(null);
+ mRepository.getIfExists(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL).orElse(null);
assertNotNull(resultFc);
assertEquals(TEST_SERVICE_CAPS, resultFc.getCapabilities());
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
@@ -243,10 +239,10 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
getFeatureContainer(mMockMmTelFeatureB, TEST_SERVICE_CAPS);
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
mRepository.unregisterForConnectionUpdates(mConnectionCallback);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcB);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcB);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
verifyFeatureCreatedCalled(0 /*times*/, mConnectionCallback, fcB);
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
@@ -261,7 +257,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
mConnectionCallback, Runnable::run);
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
}
@@ -271,7 +267,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
public void testListenAfterUpdate() throws Exception {
ImsFeatureContainer fcA =
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
@@ -283,7 +279,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
public void testListenNoUpdate() throws Exception {
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
- verify(mConnectionCallback, never()).imsFeatureCreated(any(), anyInt());
+ verify(mConnectionCallback, never()).imsFeatureCreated(any());
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
}
@@ -292,7 +288,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
public void testListenNull() throws Exception {
ImsFeatureContainer fcA =
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
mRepository.removeConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL);
@@ -308,7 +304,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
ImsFeatureContainer fcB =
getFeatureContainer(mMockRcsFeatureA, TEST_SERVICE_CAPS);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
@@ -318,10 +314,10 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
mConnectionCallback2, Runnable::run);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
- verify(mConnectionCallback2, never()).imsFeatureCreated(any(), eq(TEST_SUB_ID_3));
+ verify(mConnectionCallback2, never()).imsFeatureCreated(any());
verify(mConnectionCallback2, never()).imsFeatureRemoved(anyInt());
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_RCS, fcB);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_RCS, fcB);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback2, fcB);
@@ -335,7 +331,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
ImsFeatureContainer fcB =
getFeatureContainer(mMockRcsFeatureA, TEST_SERVICE_CAPS);
- mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+ mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
mConnectionCallback, Runnable::run);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
@@ -345,10 +341,10 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
mConnectionCallback2, Runnable::run);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
- verify(mConnectionCallback2, never()).imsFeatureCreated(any(), anyInt());
+ verify(mConnectionCallback2, never()).imsFeatureCreated(any());
verify(mConnectionCallback2, never()).imsFeatureRemoved(anyInt());
- mRepository.addConnection(TEST_PHONE_ID_2, TEST_SUB_ID_3, ImsFeature.FEATURE_RCS, fcB);
+ mRepository.addConnection(TEST_PHONE_ID_2, ImsFeature.FEATURE_RCS, fcB);
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback2, fcB);
@@ -357,7 +353,7 @@ public class ImsFeatureBinderRepositoryTest extends ImsTestBase {
private void verifyFeatureCreatedCalled(int timesCalled, IImsServiceFeatureCallback cb,
ImsFeatureContainer fc) throws Exception {
- verify(cb, times(timesCalled)).imsFeatureCreated(fc, TEST_SUB_ID_3);
+ verify(cb, times(timesCalled)).imsFeatureCreated(fc);
}
private ImsFeatureContainer getFeatureContainer(IBinder feature, long caps) {
diff --git a/tests/src/com/android/ims/ImsManagerTest.java b/tests/src/com/android/ims/ImsManagerTest.java
index 0653908d..3db80259 100644
--- a/tests/src/com/android/ims/ImsManagerTest.java
+++ b/tests/src/com/android/ims/ImsManagerTest.java
@@ -16,17 +16,11 @@
package com.android.ims;
-import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO;
-import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE;
-import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
-import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_LTE;
-
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -37,27 +31,21 @@ import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.IBinder;
import android.os.PersistableBundle;
-import android.os.RemoteException;
-import android.telephony.BinderCacheManager;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.ims.ImsMmTelManager;
-import android.telephony.ims.ImsRcsManager;
import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.ISipTransport;
import android.telephony.ims.feature.MmTelFeature;
-import android.telephony.ims.feature.RcsFeature;
import android.telephony.ims.stub.ImsConfigImplBase;
import android.telephony.ims.stub.ImsRegistrationImplBase;
-import androidx.test.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import com.android.internal.os.SomeArgs;
-import com.android.internal.telephony.ITelephony;
import org.junit.After;
import org.junit.Before;
@@ -66,7 +54,6 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import java.util.Hashtable;
-import java.util.concurrent.Executor;
@RunWith(AndroidJUnit4.class)
public class ImsManagerTest extends ImsTestBase {
@@ -97,15 +84,10 @@ public class ImsManagerTest extends ImsTestBase {
@Mock ISipTransport mSipTransport;
@Mock ImsManager.SubscriptionManagerProxy mSubscriptionManagerProxy;
@Mock ImsManager.SettingsProxy mSettingsProxy;
- @Mock BinderCacheManager mBinderCacheManager;
- @Mock ITelephony mITelephony;
private final int[] mSubId = {0};
private final int mPhoneId = 1;
- private boolean mMmTelProvisioningRequired = false;
- private boolean mRcsProvisioningRequired = false;
-
@Before
public void setUp() throws Exception {
super.setUp();
@@ -114,32 +96,22 @@ public class ImsManagerTest extends ImsTestBase {
doReturn(null).when(mContext).getMainLooper();
doReturn(true).when(mMmTelFeatureConnection).isBinderAlive();
- doReturn(mSubId[0]).when(mMmTelFeatureConnection).getSubId();
mContextFixture.addSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS);
doReturn(true).when(mSubscriptionManagerProxy).isValidSubscriptionId(anyInt());
+ doReturn(mSubId).when(mSubscriptionManagerProxy).getSubscriptionIds(eq(mPhoneId));
doReturn(mSubId).when(mSubscriptionManagerProxy).getActiveSubscriptionIdList();
- doReturn(mSubId).when(mSubscriptionManagerProxy).getSubscriptionIds(anyInt());
doReturn(mPhoneId).when(mSubscriptionManagerProxy).getDefaultVoicePhoneId();
doReturn(-1).when(mSubscriptionManagerProxy).getIntegerSubscriptionProperty(anyInt(),
anyString(), anyInt());
setDefaultValues();
-
- // allow READ_PRIVILEGED_PHONE_STATE permission
- InstrumentationRegistry.getInstrumentation().getUiAutomation()
- .adoptShellPermissionIdentity(
- "android.permission.READ_PRIVILEGED_PHONE_STATE");
}
@After
public void tearDown() throws Exception {
super.tearDown();
-
- // release permission
- InstrumentationRegistry.getInstrumentation().getUiAutomation()
- .dropShellPermissionIdentity();
}
private void setDefaultValues() {
@@ -236,39 +208,6 @@ public class ImsManagerTest extends ImsTestBase {
args.recycle();
}
- @SmallTest
- @Test
- public void testTtyStats() {
- setWfcEnabledByUser(true);
- SomeArgs args = SomeArgs.obtain();
- ImsManager.setImsStatsCallback(mPhoneId, new ImsManager.ImsStatsCallback() {
- @Override
- public void onEnabledMmTelCapabilitiesChanged(int capability, int regTech,
- boolean isEnabled) {
- if ((capability == MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE)
- && (regTech == ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN)) {
- args.arg1 = isEnabled;
- }
- }
- });
- //TTY over VoWIFI is not allowed
- mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOWIFI_TTY_SUPPORTED_BOOL, false);
- ImsManager imsManager = getImsManagerAndInitProvisionedValues();
- // Assert that the IMS stats callback is called properly when a tty setup changes.
- try {
- imsManager.setTtyMode(1);
- } catch (ImsException e) {}
- assertEquals(args.arg1, false);
-
- //TTY over VoWIFI is allowed
- mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOWIFI_TTY_SUPPORTED_BOOL, true);
- try {
- imsManager.setTtyMode(1);
- } catch (ImsException e) {}
- assertEquals(args.arg1, true);
- args.recycle();
-}
-
@Test @SmallTest
public void testSetValues() {
setWfcEnabledByUser(true);
@@ -307,116 +246,48 @@ public class ImsManagerTest extends ImsTestBase {
eq(SubscriptionManager.WFC_IMS_ENABLED),
eq("1"));
}
-
@Test
- public void testGetProvisionedValuesForWfc() throws Exception {
+ public void testGetProvisionedValues() throws Exception {
ImsManager imsManager = getImsManagerAndInitProvisionedValues();
- mMmTelProvisioningRequired = true;
assertEquals(true, imsManager.isWfcProvisionedOnDevice());
- verify(mITelephony, times(1)).
- isProvisioningRequiredForCapability(anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
- verify(mITelephony, times(1)).getImsProvisioningStatusForCapability(
- anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
- clearInvocations(mITelephony);
-
- mMmTelProvisioningRequired = false;
- assertEquals(true, imsManager.isWfcProvisionedOnDevice());
- verify(mITelephony, times(1)).
- isProvisioningRequiredForCapability(anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
- clearInvocations(mITelephony);
- }
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED));
- @Test
- public void testGetProvisionedValuesForVt() throws Exception {
- ImsManager imsManager = getImsManagerAndInitProvisionedValues();
-
- mMmTelProvisioningRequired = true;
assertEquals(true, imsManager.isVtProvisionedOnDevice());
- verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- verify(mITelephony, times(1)).getImsProvisioningStatusForCapability(
- anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- clearInvocations(mITelephony);
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.LVC_SETTING_ENABLED));
- mMmTelProvisioningRequired = false;
- assertEquals(true, imsManager.isVtProvisionedOnDevice());
- verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- clearInvocations(mITelephony);
- }
-
- @Test
- public void testGetProvisionedValuesForVolte() throws Exception {
- ImsManager imsManager = getImsManagerAndInitProvisionedValues();
-
- mMmTelProvisioningRequired = true;
assertEquals(true, imsManager.isVolteProvisionedOnDevice());
- verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- verify(mITelephony, times(1)).getImsProvisioningStatusForCapability(
- anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- clearInvocations(mITelephony);
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.VLT_SETTING_ENABLED));
- mMmTelProvisioningRequired = false;
- assertEquals(true, imsManager.isVolteProvisionedOnDevice());
- verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- clearInvocations(mITelephony);
- }
+ // If we call get again, times should still be one because the value should be fetched
+ // from cache.
+ assertEquals(true, imsManager.isWfcProvisionedOnDevice());
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED));
- @Test
- public void testGetProvisionedValuesForEab() throws Exception {
- ImsManager imsManager = getImsManagerAndInitProvisionedValues();
+ assertEquals(true, imsManager.isVtProvisionedOnDevice());
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.LVC_SETTING_ENABLED));
- mRcsProvisioningRequired = true;
- assertEquals(true, imsManager.isEabProvisionedOnDevice());
- verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(),
- eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- verify(mITelephony, times(1)).getRcsProvisioningStatusForCapability(
- anyInt(),
- eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- clearInvocations(mITelephony);
+ assertEquals(true, imsManager.isVolteProvisionedOnDevice());
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.VLT_SETTING_ENABLED));
- mRcsProvisioningRequired = false;
assertEquals(true, imsManager.isEabProvisionedOnDevice());
- verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(),
- eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- clearInvocations(mITelephony);
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.EAB_SETTING_ENABLED));
}
@Test
public void testSetProvisionedValues() throws Exception {
ImsManager imsManager = getImsManagerAndInitProvisionedValues();
- mMmTelProvisioningRequired = true;
assertEquals(true, imsManager.isWfcProvisionedOnDevice());
- verify(mITelephony, times(1)).
- isProvisioningRequiredForCapability(anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
- verify(mITelephony, times(1)).getImsProvisioningStatusForCapability(
- anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
- clearInvocations(mITelephony);
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED));
imsManager.getConfigInterface().setProvisionedValue(
ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED,
@@ -430,28 +301,17 @@ public class ImsManagerTest extends ImsTestBase {
verify(mImsConfigImplBaseMock, times(1)).setConfig(
eq(ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED),
eq(0));
-
- verify(mITelephony, times(1)).getImsProvisioningStatusForCapability(
- anyInt(),
- eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED));
}
@Test
public void testEabSetProvisionedValues() throws Exception {
ImsManager imsManager = getImsManagerAndInitProvisionedValues();
- mRcsProvisioningRequired = true;
assertEquals(true, imsManager.isEabProvisionedOnDevice());
-
- verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(),
- eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- verify(mITelephony, times(1)).getRcsProvisioningStatusForCapability(
- anyInt(),
- eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
- clearInvocations(mITelephony);
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.EAB_SETTING_ENABLED));
imsManager.getConfigInterface().setProvisionedValue(
ImsConfig.ConfigConstants.EAB_SETTING_ENABLED,
@@ -465,11 +325,8 @@ public class ImsManagerTest extends ImsTestBase {
verify(mImsConfigImplBaseMock, times(1)).setConfig(
eq(ImsConfig.ConfigConstants.EAB_SETTING_ENABLED),
eq(0));
-
- verify(mITelephony, times(1)).getRcsProvisioningStatusForCapability(
- anyInt(),
- eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
+ verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+ eq(ImsConfig.ConfigConstants.EAB_SETTING_ENABLED));
}
/**
@@ -969,21 +826,6 @@ public class ImsManagerTest extends ImsTestBase {
anyInt());
}
- @Test @SmallTest
- public void testShouldProcessCall_ThrowsExceptionIfServiceIsStillInitializing() {
- ImsManager imsManager = getImsManagerAndInitProvisionedValues();
- doReturn(-1).when(mMmTelFeatureConnection).getSubId();
- assertThrows(ImsException.class, () -> imsManager.shouldProcessCall(true, new String[1]));
- }
-
- @Test @SmallTest
- public void testShouldProcessCall_DoesNotThrowExceptionWhenServiceInitialized()
- throws Exception {
- ImsManager imsManager = getImsManagerAndInitProvisionedValues();
- int ret = imsManager.shouldProcessCall(true, new String[1]);
- assertEquals(MmTelFeature.PROCESS_CALL_IMS, ret);
- }
-
/**
* Tests the operation of setWfcRoamingSetting and ensures that the user setting for WFC roaming
* and the ImsConfig setting are both called properly.
@@ -1027,51 +869,15 @@ public class ImsManagerTest extends ImsTestBase {
// Configure ImsConfigStub
- mImsConfigStub = new ImsConfigImplBase.ImsConfigStub(mImsConfigImplBaseMock, Runnable::run);
+ mImsConfigStub = new ImsConfigImplBase.ImsConfigStub(mImsConfigImplBaseMock);
doReturn(mImsConfigStub).when(mMmTelFeatureConnection).getConfig();
- when(mBinderCacheManager.getBinder())
- .thenReturn(mITelephony);
-
- try {
- when(mITelephony.getImsProvisioningInt(anyInt(), anyInt()))
- .thenAnswer(invocation -> {
- return getProvisionedInt((Integer) (invocation.getArguments()[1]));
- });
- when(mITelephony.setImsProvisioningInt(anyInt(), anyInt(), anyInt()))
- .thenAnswer(invocation -> {
- mProvisionedIntVals.put((Integer) (invocation.getArguments()[1]),
- (Integer) (invocation.getArguments()[2]));
- return ImsConfig.OperationStatusConstants.SUCCESS;
- });
- when(mITelephony.isProvisioningRequiredForCapability(anyInt(), anyInt(), anyInt()))
- .thenAnswer(invocation -> {
- return mMmTelProvisioningRequired;
- });
- when(mITelephony.isRcsProvisioningRequiredForCapability(anyInt(), anyInt(), anyInt()))
- .thenAnswer(invocation -> {
- return mRcsProvisioningRequired;
- });
- when(mITelephony.getImsProvisioningStatusForCapability(anyInt(), anyInt(), anyInt()))
- .thenAnswer(invocation -> {
- return getImsProvisioningStatusForCapability(
- (Integer) (invocation.getArguments()[1]),
- (Integer) (invocation.getArguments()[2]));
- });
- when(mITelephony.getRcsProvisioningStatusForCapability(anyInt(),
- eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
- eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)))
- .thenAnswer(invocation -> {
- return getEabProvisioningStatusForCapability();
- });
- } catch (RemoteException e) {}
-
ImsManager mgr = new ImsManager(mContext, mPhoneId,
- (context, phoneId, subId, feature, c, r, s) -> mMmTelFeatureConnection,
- mSubscriptionManagerProxy, mSettingsProxy, mBinderCacheManager);
+ (context, phoneId, feature, c, r, s) -> mMmTelFeatureConnection,
+ mSubscriptionManagerProxy, mSettingsProxy);
ImsFeatureContainer c = new ImsFeatureContainer(mMmTelFeature, mImsConfig, mImsReg,
mSipTransport, 0 /*caps*/);
- mgr.associate(c, mSubId[0]);
+ mgr.associate(c);
// Enabled WFC by default
setWfcEnabledByPlatform(true);
return mgr;
@@ -1098,30 +904,4 @@ public class ImsManagerTest extends ImsTestBase {
return ImsConfig.FeatureValueConstants.ON;
}
}
-
- private boolean getImsProvisioningStatusForCapability(int capability, int tech) {
- int key = getKeyFromCapability(capability, tech);
- int provisioned = getProvisionedInt(key);
-
- return (provisioned == ImsConfig.FeatureValueConstants.ON);
- }
-
- private boolean getEabProvisioningStatusForCapability() {
- int provisioned = getProvisionedInt(ProvisioningManager.KEY_EAB_PROVISIONING_STATUS);
-
- return (provisioned == ImsConfig.FeatureValueConstants.ON);
- }
-
- private int getKeyFromCapability(int capability, int tech) {
- int key = -1; // INVALID_VALUE
- if (capability == CAPABILITY_TYPE_VOICE && tech == REGISTRATION_TECH_IWLAN) {
- key = ProvisioningManager.KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE;
- } else if (capability == CAPABILITY_TYPE_VOICE && tech == REGISTRATION_TECH_LTE) {
- key = ProvisioningManager.KEY_VOLTE_PROVISIONING_STATUS;
- } else if (capability == CAPABILITY_TYPE_VIDEO && tech == REGISTRATION_TECH_LTE) {
- key = ProvisioningManager.KEY_VT_PROVISIONING_STATUS;
- }
-
- return key;
- }
}
diff --git a/tests/src/com/android/ims/ImsUtTest.java b/tests/src/com/android/ims/ImsUtTest.java
index 71722ced..634b4d91 100644
--- a/tests/src/com/android/ims/ImsUtTest.java
+++ b/tests/src/com/android/ims/ImsUtTest.java
@@ -97,7 +97,7 @@ public class ImsUtTest extends ImsTestBase {
public void testClirConversionCompat() throws Exception {
ArgumentCaptor<ImsUt.IImsUtListenerProxy> captor =
ArgumentCaptor.forClass(ImsUt.IImsUtListenerProxy.class);
- ImsUt mImsUt = new ImsUt(mImsUtBinder, Runnable::run);
+ ImsUt mImsUt = new ImsUt(mImsUtBinder);
verify(mImsUtBinder).setListener(captor.capture());
ImsUt.IImsUtListenerProxy proxy = captor.getValue();
assertNotNull(proxy);
@@ -125,7 +125,7 @@ public class ImsUtTest extends ImsTestBase {
public void testClipConversionCompat() throws Exception {
ArgumentCaptor<ImsUt.IImsUtListenerProxy> captor =
ArgumentCaptor.forClass(ImsUt.IImsUtListenerProxy.class);
- ImsUt mImsUt = new ImsUt(mImsUtBinder, Runnable::run);
+ ImsUt mImsUt = new ImsUt(mImsUtBinder);
verify(mImsUtBinder).setListener(captor.capture());
ImsUt.IImsUtListenerProxy proxy = captor.getValue();
assertNotNull(proxy);
diff --git a/tests/src/com/android/ims/MmTelFeatureConnectionTest.java b/tests/src/com/android/ims/MmTelFeatureConnectionTest.java
index f1148384..620fa23b 100644
--- a/tests/src/com/android/ims/MmTelFeatureConnectionTest.java
+++ b/tests/src/com/android/ims/MmTelFeatureConnectionTest.java
@@ -18,13 +18,19 @@ package com.android.ims;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.when;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import android.content.Context;
import android.os.Binder;
import android.os.IBinder;
import android.os.IInterface;
-import android.telephony.ims.feature.ImsFeature;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -33,7 +39,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
import java.util.ArrayList;
import java.util.List;
@@ -53,56 +58,33 @@ public class MmTelFeatureConnectionTest extends ImsTestBase {
ImsCallbackAdapterManager<TestCallback> {
List<TestCallback> mCallbacks = new ArrayList<>();
- FeatureConnection mFeatureConnection;
- CallbackManagerTest(Context context, Object lock, FeatureConnection featureConnection) {
- super(context, lock, SLOT_ID, SUB_ID);
- mFeatureConnection = featureConnection;
+ CallbackManagerTest(Context context, Object lock) {
+ super(context, lock, 0 /*slotId*/);
}
// A callback has been registered. Register that callback with the MmTelFeature.
@Override
public void registerCallback(TestCallback localCallback) {
- if (!isBinderReady()) {
- return;
- }
mCallbacks.add(localCallback);
}
// A callback has been removed, unregister that callback with the MmTelFeature.
@Override
public void unregisterCallback(TestCallback localCallback) {
- if (!mFeatureConnection.isBinderAlive()) {
- return;
- }
mCallbacks.remove(localCallback);
}
public boolean doesCallbackExist(TestCallback callback) {
return mCallbacks.contains(callback);
}
-
- public boolean isBinderReady() {
- return mFeatureConnection.isBinderAlive()
- && mFeatureConnection.getFeatureState() == ImsFeature.STATE_READY;
- }
}
-
private CallbackManagerTest mCallbackManagerUT;
- @Mock
- FeatureConnection mFeatureConnection;
-
- public static final int SUB_ID = 1;
- public static final int SLOT_ID = 0;
-
@Before
public void setUp() throws Exception {
super.setUp();
-
- when(mFeatureConnection.isBinderAlive()).thenReturn(true);
- when(mFeatureConnection.getFeatureState()).thenReturn(ImsFeature.STATE_READY);
- mCallbackManagerUT = new CallbackManagerTest(mContext, this, mFeatureConnection);
+ mCallbackManagerUT = new CallbackManagerTest(mContext, this);
}
@After
@@ -121,119 +103,191 @@ public class MmTelFeatureConnectionTest extends ImsTestBase {
TestCallback testCallback = new TestCallback();
mCallbackManagerUT.addCallback(testCallback);
assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback));
+ // The subscriptions changed listener should only be added for callbacks that are being
+ // linked to a subscription.
+ verify(mSubscriptionManager, never()).addOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
mCallbackManagerUT.removeCallback(testCallback);
assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback));
+ // The subscriptions changed listener should only be removed for callbacks that are
+ // linked to a subscription.
+ verify(mSubscriptionManager, never()).removeOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
}
/**
* Ensure that adding the callback and linking subId triggers the appropriate registerCallback
- * and unregisterCallback calls.
+ * and unregisterCallback calls as well as the subscriptionChanged listener.
*/
@Test
@SmallTest
- public void testCallbackAdapter_addCallbackForSubAndRemove() throws Exception {
+ public void testCallbackAdapter_addAndRemoveCallbackForSub() throws Exception {
TestCallback testCallback = new TestCallback();
int testSub = 1;
mCallbackManagerUT.addCallbackForSubscription(testCallback, testSub);
assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback));
+ verify(mSubscriptionManager, times(1)).addOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
- mCallbackManagerUT.removeCallback(testCallback);
+ mCallbackManagerUT.removeCallbackForSubscription(testCallback, testSub);
assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback));
+ verify(mSubscriptionManager, times(1)).removeOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
}
/**
- * The close() method has been called, so all callbacks should be cleaned up and notified
- * that they have been removed.
+ * Ensure that adding the callback and linking multiple subIds trigger the appropriate
+ * registerCallback and unregisterCallback calls as well as the subscriptionChanged listener.
+ * When removing the callbacks, the subscriptionChanged listener shoud only be removed when all
+ * callbacks have been removed.
*/
@Test
@SmallTest
- public void testCallbackAdapter_closeSub() throws Exception {
+ public void testCallbackAdapter_addAndRemoveCallbackForMultipleSubs() throws Exception {
TestCallback testCallback1 = new TestCallback();
+ TestCallback testCallback2 = new TestCallback();
int testSub1 = 1;
-
+ int testSub2 = 2;
mCallbackManagerUT.addCallbackForSubscription(testCallback1, testSub1);
assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
+ mCallbackManagerUT.addCallbackForSubscription(testCallback2, testSub2);
+ assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback2));
+ // This should only happen once.
+ verify(mSubscriptionManager, times(1)).addOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
- // Close the manager, ensure subscription callback are removed
- mCallbackManagerUT.close();
+ mCallbackManagerUT.removeCallbackForSubscription(testCallback1, testSub1);
assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+ // removing the listener should not happen until the second callback is removed.
+ verify(mSubscriptionManager, never()).removeOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
+
+ mCallbackManagerUT.removeCallbackForSubscription(testCallback2, testSub2);
+ assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback2));
+ verify(mSubscriptionManager, times(1)).removeOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
}
/**
- * The close() method has been called, so all callbacks should be cleaned up.
+ * The subscriptions have changed, ensure that the callbacks registered to the original
+ * subscription testSub1 are removed, while keeping the callbacks for testSub2, since it was not
+ * removed.
*/
@Test
@SmallTest
- public void testCallbackAdapter_closeSlotBasedCallbacks() throws Exception {
+ public void testCallbackAdapter_onSubscriptionsChangedMultipleSubs() throws Exception {
TestCallback testCallback1 = new TestCallback();
TestCallback testCallback2 = new TestCallback();
- mCallbackManagerUT.addCallback(testCallback1);
+ int testSub1 = 1;
+ int testSub2 = 2;
+ int testSub3 = 3;
+ mCallbackManagerUT.addCallbackForSubscription(testCallback1, testSub1);
assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
- mCallbackManagerUT.addCallback(testCallback2);
+ mCallbackManagerUT.addCallbackForSubscription(testCallback2, testSub2);
assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback2));
+ verify(mSubscriptionManager, times(1)).addOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
- // Close the manager, ensure all subscription callbacks are removed
- mCallbackManagerUT.close();
+ // Simulate subscriptions changed, where testSub1 is no longer active
+ doReturn(createSubscriptionInfoList(new int[] {testSub2, testSub3}))
+ .when(mSubscriptionManager).getActiveSubscriptionInfoList(anyBoolean());
+ mCallbackManagerUT.mSubChangedListener.onSubscriptionsChanged();
assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
- assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback2));
+ // verify that the subscription changed listener is not removed, since we still have a
+ // callback on testSub2
+ verify(mSubscriptionManager, never()).removeOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
}
-
/**
- * UnregisterCallback is success After ImsFeatureState changed to STATE_UNAVAILABLE.
+ * The active subscription has changed, ensure that the callback registered to the original
+ * subscription testSub1 are removed as well as the subscription changed listener, since
+ * there are mo more active callbacks.
*/
@Test
@SmallTest
- public void testCallbackAdapter_removeCallbackSuccessAfterImsFeatureStateChangeToUnavailable()
- throws Exception {
+ public void testCallbackAdapter_onSubscriptionsChangedOneSub() throws Exception {
TestCallback testCallback1 = new TestCallback();
- mCallbackManagerUT.addCallback(testCallback1);
+ int testSub1 = 1;
+ int testSub2 = 2;
+ mCallbackManagerUT.addCallbackForSubscription(testCallback1, testSub1);
assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
- mCallbackManagerUT.removeCallback(testCallback1);
- assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+ verify(mSubscriptionManager, times(1)).addOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
- TestCallback testCallback2 = new TestCallback();
- mCallbackManagerUT.addCallback(testCallback2);
- assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback2));
- assertTrue(mCallbackManagerUT.isBinderReady());
- when(mFeatureConnection.getFeatureState()).thenReturn(ImsFeature.STATE_UNAVAILABLE);
- assertFalse(mCallbackManagerUT.isBinderReady());
- mCallbackManagerUT.removeCallback(testCallback2);
- assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback2));
+ // Simulate subscriptions changed, where testSub1 is no longer active
+ doReturn(createSubscriptionInfoList(new int[] {testSub2}))
+ .when(mSubscriptionManager).getActiveSubscriptionInfoList(anyBoolean());
+ mCallbackManagerUT.mSubChangedListener.onSubscriptionsChanged();
+ assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+ // verify that the subscription listener is removed, since the only active callback has been
+ // removed.
+ verify(mSubscriptionManager, times(1)).removeOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
}
/**
- * UnregisterCallback is failed After binder isn't alive.
+ * The close() method has been called, so al callbacks should be cleaned up and notified
+ * that they have been removed. The subscriptions changed listener should also be removed.
*/
@Test
@SmallTest
- public void testCallbackAdapter_removeCallbackFailedAfterBinderIsNotAlive() throws Exception {
+ public void testCallbackAdapter_closeMultipleSubs() throws Exception {
TestCallback testCallback1 = new TestCallback();
- mCallbackManagerUT.addCallback(testCallback1);
+ TestCallback testCallback2 = new TestCallback();
+ int testSub1 = 1;
+ int testSub2 = 2;
+ mCallbackManagerUT.addCallbackForSubscription(testCallback1, testSub1);
assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
+ mCallbackManagerUT.addCallbackForSubscription(testCallback2, testSub2);
+ assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback2));
+ verify(mSubscriptionManager, times(1)).addOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
- when(mFeatureConnection.isBinderAlive()).thenReturn(false);
- mCallbackManagerUT.removeCallback(testCallback1);
- assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
+ // Close the manager, ensure all subscription callbacks are removed
+ mCallbackManagerUT.close();
+ assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+ assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback2));
+ // verify that the subscription changed listener is removed.
+ verify(mSubscriptionManager, times(1)).removeOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
}
/**
- * RegisterCallback is failed After binder isn't ready.
+ * The close() method has been called, so all callbacks should be cleaned up. Since they are
+ * not associated with any subscriptions, no subscription based logic should be called.
*/
@Test
@SmallTest
- public void testCallbackAdapter_addCallbackFailedAfterBinderIsNotReady() throws Exception {
- when(mFeatureConnection.isBinderAlive()).thenReturn(false);
- assertFalse(mCallbackManagerUT.isBinderReady());
+ public void testCallbackAdapter_closeSlotBasedCallbacks() throws Exception {
TestCallback testCallback1 = new TestCallback();
+ TestCallback testCallback2 = new TestCallback();
mCallbackManagerUT.addCallback(testCallback1);
- assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+ assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
+ mCallbackManagerUT.addCallback(testCallback2);
+ assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback2));
+ // verify that the subscription changed listener is never called for these callbacks
+ // because they are not associated with any subscriptions.
+ verify(mSubscriptionManager, never()).addOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
- when(mFeatureConnection.isBinderAlive()).thenReturn(true);
- when(mFeatureConnection.getFeatureState()).thenReturn(ImsFeature.STATE_UNAVAILABLE);
- assertFalse(mCallbackManagerUT.isBinderReady());
- mCallbackManagerUT.addCallback(testCallback1);
+ // Close the manager, ensure all subscription callbacks are removed
+ mCallbackManagerUT.close();
assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+ assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback2));
+ // verify that the subscription changed removed method is never called
+ verify(mSubscriptionManager, never()).removeOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class));
+ }
+
+ private List<SubscriptionInfo> createSubscriptionInfoList(int[] subIds) {
+ List<SubscriptionInfo> infos = new ArrayList<>();
+ for (int i = 0; i < subIds.length; i++) {
+ SubscriptionInfo info = new SubscriptionInfo(subIds[i], null, -1, null, null, -1, -1,
+ null, -1, null, null, null, null, false, null, null);
+ infos.add(info);
+ }
+ return infos;
}
}
diff --git a/tests/src/com/android/ims/rcs/uce/UceControllerTest.java b/tests/src/com/android/ims/rcs/uce/UceControllerTest.java
index 021a7c10..69d52811 100644
--- a/tests/src/com/android/ims/rcs/uce/UceControllerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/UceControllerTest.java
@@ -19,7 +19,6 @@ package com.android.ims.rcs.uce;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
@@ -174,9 +173,6 @@ public class UceControllerTest extends ImsTestBase {
UceController uceController = createUceController();
uceController.onRcsConnected(mFeatureManager);
doReturn(false).when(mDeviceStateResult).isRequestForbidden();
- // This API should only be applied to PUBLISH.
- // Even if the return value is true, the capabilities request must be processed.
- doReturn(true).when(mDeviceStateResult).isPublishRequestBlocked();
List<Uri> uriList = new ArrayList<>();
uriList.add(Uri.fromParts("sip", "test", null));
@@ -253,9 +249,9 @@ public class UceControllerTest extends ImsTestBase {
public void testRegisterPublishStateCallback() {
UceController uceController = createUceController();
- uceController.registerPublishStateCallback(any(), anyBoolean());
+ uceController.registerPublishStateCallback(any());
- verify(mPublishController).registerPublishStateCallback(any(), anyBoolean());
+ verify(mPublishController).registerPublishStateCallback(any());
}
@Test
@@ -273,9 +269,9 @@ public class UceControllerTest extends ImsTestBase {
public void testGetUcePublishState() {
UceController uceController = createUceController();
- uceController.getUcePublishState(anyBoolean());
+ uceController.getUcePublishState();
- verify(mPublishController).getUcePublishState(anyBoolean());
+ verify(mPublishController).getUcePublishState();
}
private UceController createUceController() {
diff --git a/tests/src/com/android/ims/rcs/uce/UceStatsWriterTest.java b/tests/src/com/android/ims/rcs/uce/UceStatsWriterTest.java
deleted file mode 100644
index 49edf198..00000000
--- a/tests/src/com/android/ims/rcs/uce/UceStatsWriterTest.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import android.telephony.ims.RcsContactPresenceTuple;
-import android.telephony.ims.RcsContactUceCapability;
-
-import com.android.ims.rcs.uce.UceStatsWriter;
-import com.android.ims.rcs.uce.UceStatsWriter.UceStatsCallback;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class UceStatsWriterTest {
- private int mSubId = 3;
- private long mTaskId = 5;
- private int mRegistrationTech = 3;
- private int mType = 2;
- private boolean mSuccessful = true;
- private int mCommandCode = 4;
- private int mNetworkResponse = 200;
- private String mReason = "noresource";
-
- private Callback mCallback;
- private TestableUceStatsWriter mWrite;
-
- class Callback implements UceStatsCallback {
- int subId;
- List<String> featureTagList;
- List<String> serviceIdList;
- List<String> versions;
- int registrationTech;
- int type;
- boolean successful;
- int commandCode;
- int networkResponse;
- long taskId;
- List<RcsContactUceCapability> updatedCapList;
- String reason;
-
- Callback() {
- }
-
- public void onImsRegistrationFeatureTagStats(int subId, List<String> featureTagList,
- int registrationTech) {
- this.subId = subId;
- this.featureTagList = featureTagList;
- this.registrationTech = registrationTech;
- }
-
- public void onStoreCompleteImsRegistrationFeatureTagStats(int subId) {}
-
- public void onImsRegistrationServiceDescStats(int subId, List<String> serviceIdList,
- List<String> serviceIdVersionList, int registrationTech) {
- this.subId = subId;
- this.serviceIdList = serviceIdList;
- this.versions = serviceIdVersionList;
- this.registrationTech = registrationTech;
- }
-
- public void onSubscribeResponse(int subId, long taskId, int networkResponse) {
- this.subId = subId;
- this.taskId = taskId;
- this.successful = true;
- this.commandCode = 0;
- this.networkResponse = networkResponse;
- }
-
- public void onUceEvent(int subId, int type, boolean successful, int commandCode,
- int networkResponse) {
- this.subId = subId;
- this.type = type;
- this.successful = successful;
- this.commandCode = commandCode;
- this.networkResponse = networkResponse;
- }
-
- public void onSubscribeTerminated(int subId, long taskId, String reason) {
- this.subId = subId;
- this.taskId = taskId;
- this.reason = reason;
- }
-
- public void onPresenceNotifyEvent(int subId, long taskId,
- List<RcsContactUceCapability> updatedCapList) {
- this.subId = subId;
- this.taskId = taskId;
- this.updatedCapList = updatedCapList;
- }
-
- public void onStoreCompleteImsRegistrationServiceDescStats(int subId) {
- this.subId = subId;
- }
- }
-
- private class TestableUceStatsWriter extends UceStatsWriter {
- public TestableUceStatsWriter(UceStatsCallback callback) {
- super(callback);
- }
- }
-
- @Before
- public void setUp() throws Exception {
- MockitoAnnotations.initMocks(this);
- mCallback = new Callback();
- mWrite = new TestableUceStatsWriter(mCallback);
- }
-
- @After
- public void tearDown() throws Exception {
- }
-
- @Test
- @SmallTest
- public void setImsRegistrationFeatureTagStats() throws Exception {
- List<String> featureTags = new ArrayList<>();
- featureTags.add("+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.im\"");
- featureTags.add("+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.session\"");
- featureTags.add("+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.ftsms\"");
- mWrite.setImsRegistrationFeatureTagStats(mSubId, featureTags, mRegistrationTech);
- assertEquals(mSubId, mCallback.subId);
- for (int index = 0; index < featureTags.size(); index++) {
- assertEquals(featureTags.get(index), mCallback.featureTagList.get(index));
- }
- assertEquals(mRegistrationTech, mCallback.registrationTech);
- }
-
- @Test
- @SmallTest
- public void setImsRegistrationServiceDescStats() throws Exception {
- List<RcsContactPresenceTuple> tupleList = new ArrayList<>();
- tupleList.add(getContactChatTuple());
- tupleList.add(getContactFtTuple());
- tupleList.add(getContactUnknown1Tuple());
- tupleList.add(getContactUnknown2Tuple());
- mWrite.setImsRegistrationServiceDescStats(mSubId, tupleList, mRegistrationTech);
- assertEquals(mSubId, mCallback.subId);
- for (int index = 0; index < tupleList.size(); index++) {
- assertEquals(tupleList.get(index).getServiceId(), mCallback.serviceIdList.get(index));
- assertEquals(tupleList.get(index).getServiceVersion(), mCallback.versions.get(index));
- }
- assertEquals(mRegistrationTech, mCallback.registrationTech);
- }
-
- @Test
- @SmallTest
- public void setSubscribeEvent() throws Exception {
- mWrite.setSubscribeResponse(mSubId, mTaskId, mNetworkResponse);
- assertEquals(mSubId, mCallback.subId);
- assertEquals(mTaskId, mCallback.taskId);
- assertTrue(mCallback.successful);
- assertEquals(0, mCallback.commandCode);
- assertEquals(mNetworkResponse, mCallback.networkResponse);
- }
-
- @Test
- @SmallTest
- public void setSubscribeTerminated() throws Exception {
- mWrite.setSubscribeResponse(mSubId, mTaskId, mNetworkResponse);
- mWrite.setSubscribeTerminated(mSubId, mTaskId, mReason);
- assertEquals(mSubId, mCallback.subId);
- assertEquals(mTaskId, mCallback.taskId);
- assertEquals(mReason, mCallback.reason);
- }
-
- @Test
- @SmallTest
- public void setUceEvent() throws Exception {
- mWrite.setUceEvent(mSubId, mType, mSuccessful, mCommandCode, mNetworkResponse);
- assertEquals(mSubId, mCallback.subId);
- assertEquals(mType, mCallback.type);
- assertEquals(mSuccessful, mCallback.successful);
- assertEquals(mCommandCode, mCallback.commandCode);
- assertEquals(mNetworkResponse, mCallback.networkResponse);
- }
-
- @Test
- @SmallTest
- public void setPresenceNotifyEvent() throws Exception {
- List<RcsContactUceCapability> updatedCapList = new ArrayList<>();
- RcsContactUceCapability.PresenceBuilder builder =
- new RcsContactUceCapability.PresenceBuilder(null, 0, 2);
- builder.addCapabilityTuple(getContactChatTuple());
- builder.addCapabilityTuple(getContactCallComposer2Tuple());
- builder.addCapabilityTuple(getContactUnknown1Tuple());
- updatedCapList.add(builder.build());
-
- mWrite.setPresenceNotifyEvent(mSubId, mTaskId, updatedCapList);
- assertEquals(mSubId, mCallback.subId);
- assertEquals(mTaskId, mCallback.taskId);
- assertEquals(updatedCapList.size(), mCallback.updatedCapList.size());
- for (int index = 0; index < updatedCapList.size(); index++) {
- RcsContactUceCapability input = updatedCapList.get(index);
- RcsContactUceCapability output = mCallback.updatedCapList.get(index);
- assertEquals(input.getCapabilityTuples().size(), output.getCapabilityTuples().size());
- }
- }
-
- @Test
- @SmallTest
- public void setPresenceNotifyEvent_withCallComposer2Caps() throws Exception {
- RcsContactPresenceTuple tuple = getContactCallComposer2Tuple();
- List<RcsContactUceCapability> updatedCapList = new ArrayList<>();
- RcsContactUceCapability.PresenceBuilder builder =
- new RcsContactUceCapability.PresenceBuilder(null, 0, 2);
- builder.addCapabilityTuple(getContactCallComposer2Tuple());
- updatedCapList.add(builder.build());
-
- mWrite.setPresenceNotifyEvent(mSubId, mTaskId, updatedCapList);
- assertEquals(mSubId, mCallback.subId);
- assertEquals(mTaskId, mCallback.taskId);
- assertEquals(updatedCapList.size(), mCallback.updatedCapList.size());
- }
-
- @Test
- @SmallTest
- public void setUnPublish() throws Exception {
- mWrite.setUnPublish(mSubId);
- assertEquals(mSubId, mCallback.subId);
- }
-
- private RcsContactPresenceTuple getContactChatTuple() {
- RcsContactPresenceTuple.Builder builder =
- new RcsContactPresenceTuple.Builder("open", RcsContactPresenceTuple.SERVICE_ID_CHAT_V1,
- "1.0");
- return builder.build();
- }
-
- private RcsContactPresenceTuple getContactMmtelTuple() {
- RcsContactPresenceTuple.Builder builder =
- new RcsContactPresenceTuple.Builder("open", RcsContactPresenceTuple.SERVICE_ID_MMTEL,
- "1.0");
- return builder.build();
- }
-
- private RcsContactPresenceTuple getContactFtTuple() {
- RcsContactPresenceTuple.Builder builder =
- new RcsContactPresenceTuple.Builder("open", RcsContactPresenceTuple.SERVICE_ID_FT,
- "1.0");
- return builder.build();
- }
-
- private RcsContactPresenceTuple getContactCallComposer2Tuple() {
- RcsContactPresenceTuple.Builder builder =
- new RcsContactPresenceTuple.Builder("open",
- RcsContactPresenceTuple.SERVICE_ID_CALL_COMPOSER,
- "2.0");
- return builder.build();
- }
-
- private RcsContactPresenceTuple getContactUnknown1Tuple() {
- RcsContactPresenceTuple.Builder builder =
- new RcsContactPresenceTuple.Builder("open", "Unknown1",
- "8.0");
- return builder.build();
- }
-
- private RcsContactPresenceTuple getContactUnknown2Tuple() {
- RcsContactPresenceTuple.Builder builder =
- new RcsContactPresenceTuple.Builder("open", "Unknown2",
- "9.0");
- return builder.build();
- }
-}
diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdaterTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdaterTest.java
index 5c2a04be..61b04313 100644
--- a/tests/src/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdaterTest.java
+++ b/tests/src/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdaterTest.java
@@ -173,35 +173,6 @@ public class EabBulkCapabilityUpdaterTest extends ImsTestBase {
any(IRcsUceControllerCallback.class));
}
- @Test
- public void testCarrierConfigEnabled() throws Exception {
- // mock user settings
- mockUceUserSettings(true);
- mockBulkCapabilityCarrierConfig(false);
- // mock expired contact list
- List<Uri> expiredContactList = new ArrayList<>();
- expiredContactList.add(Uri.parse("test"));
- doReturn(expiredContactList)
- .when(mEabContactSyncController)
- .syncContactToEabProvider(any());
-
- EabBulkCapabilityUpdater mEabBulkCapabilityUpdater = new EabBulkCapabilityUpdater(
- mContext,
- mSubId,
- mMockEabControllerImpl,
- mEabContactSyncController,
- mMockUceControllerCallback,
- mHandler);
-
- mockBulkCapabilityCarrierConfig(true);
- mEabBulkCapabilityUpdater.onCarrierConfigChanged();
- waitHandlerThreadFinish();
-
- verify(mMockUceControllerCallback).refreshCapabilities(
- anyList(),
- any(IRcsUceControllerCallback.class));
- }
-
private void mockBulkCapabilityCarrierConfig(boolean isEnabled) {
PersistableBundle persistableBundle = new PersistableBundle();
persistableBundle.putBoolean(
diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
index 0040dc9e..96147b43 100644
--- a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
@@ -35,6 +35,7 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Looper;
import android.os.PersistableBundle;
+import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.RcsContactPresenceTuple;
import android.telephony.ims.RcsContactUceCapability;
import android.test.mock.MockContentResolver;
@@ -125,8 +126,6 @@ public class EabControllerTest extends ImsTestBase {
Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL, result.getStatus());
Assert.assertEquals(TEST_CONTACT_URI,
result.getContactCapabilities().getContactUri());
- Assert.assertEquals(TEST_CONTACT_URI,
- result.getContactCapabilities().getEntityUri());
}
@Test
@@ -143,8 +142,6 @@ public class EabControllerTest extends ImsTestBase {
mEabControllerSub1.getCapabilities(contactUriList).size());
Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
- Assert.assertEquals(TEST_CONTACT_URI, mEabControllerSub1.getCapabilities(contactUriList).
- get(0).getContactCapabilities().getEntityUri());
}
@Test
@@ -210,34 +207,6 @@ public class EabControllerTest extends ImsTestBase {
@Test
@SmallTest
- public void testSaveCapabilityAndCleanupInvalidDataInCommonTable() throws InterruptedException {
- // Insert invalid data in common table
- ContentValues data = new ContentValues();
- data.put(EabProvider.EabCommonColumns.EAB_CONTACT_ID, -1);
- data.put(EabProvider.EabCommonColumns.MECHANISM, CAPABILITY_MECHANISM_PRESENCE);
- data.put(EabProvider.EabCommonColumns.REQUEST_RESULT, REQUEST_RESULT_FOUND);
- data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, -1);
- mContext.getContentResolver().insert(COMMON_URI, data);
-
- List<RcsContactUceCapability> contactList = new ArrayList<>();
- contactList.add(createPresenceCapability());
- mEabControllerSub1.saveCapabilities(contactList);
-
- mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
-
- // Verify the entry that cannot map to presence/option table has been removed
- Cursor cursor = mContext.getContentResolver().query(COMMON_URI, null, null, null, null);
- while(cursor.moveToNext()) {
- int contactId = cursor.getInt(
- cursor.getColumnIndex(EabProvider.EabCommonColumns.EAB_CONTACT_ID));
- if (contactId == -1) {
- fail("Invalid data didn't been cleared");
- }
- }
- }
-
- @Test
- @SmallTest
public void testCleanupInvalidDataInCommonTable() throws InterruptedException {
// Insert invalid data in common table
ContentValues data = new ContentValues();
@@ -247,7 +216,6 @@ public class EabControllerTest extends ImsTestBase {
data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, -1);
mContext.getContentResolver().insert(COMMON_URI, data);
- mEabControllerSub1.cleanupOrphanedRows();
mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
@@ -281,7 +249,6 @@ public class EabControllerTest extends ImsTestBase {
expiredDate.getTime().getTime() / 1000);
mContext.getContentResolver().insert(PRESENCE_URI, data);
- mEabControllerSub1.cleanupOrphanedRows();
mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
@@ -315,7 +282,6 @@ public class EabControllerTest extends ImsTestBase {
expiredDate.getTime().getTime() / 1000);
mContext.getContentResolver().insert(OPTIONS_URI, data);
- mEabControllerSub1.cleanupOrphanedRows();
mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
@@ -347,59 +313,6 @@ public class EabControllerTest extends ImsTestBase {
mEabControllerSub2.getCapabilities(contactUriList).size());
}
- @Test
- @SmallTest
- public void testSaveCapabilityWithEmptyTuple() {
- List<RcsContactUceCapability> contactList = new ArrayList<>();
- contactList.add(createEmptyTuplePresenceCapability());
-
- mEabControllerSub1.saveCapabilities(contactList);
-
- List<Uri> contactUriList = new ArrayList<>();
- contactUriList.add(TEST_CONTACT_URI);
- List<EabCapabilityResult> capabilityResults =
- mEabControllerSub1.getCapabilities(contactUriList);
- Assert.assertEquals(1, capabilityResults.size());
- Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
- capabilityResults.get(0).getStatus());
- Assert.assertEquals(0,
- capabilityResults.get(0).getContactCapabilities().getCapabilityTuples().size());
- }
-
- @Test
- @SmallTest
- public void testGetCapabilityWithEmptyTuple() {
- List<RcsContactUceCapability> contactList = new ArrayList<>();
- contactList.add(createEmptyTuplePresenceCapability());
-
- mEabControllerSub1.saveCapabilities(contactList);
-
- List<Uri> contactUriList = new ArrayList<>();
- contactUriList.add(TEST_CONTACT_URI);
- Assert.assertEquals(1,
- mEabControllerSub1.getCapabilities(contactUriList).size());
- Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
- mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
- }
-
- @Test
- @SmallTest
- public void testGetExpiredCapabilityWithEmptyTuple() {
- List<RcsContactUceCapability> contactList = new ArrayList<>();
- doReturn(0L).when(mExpirationTimeFactory).getExpirationTime();
-
- contactList.add(createEmptyTuplePresenceCapability());
-
- mEabControllerSub1.saveCapabilities(contactList);
-
- List<Uri> contactUriList = new ArrayList<>();
- contactUriList.add(TEST_CONTACT_URI);
- Assert.assertEquals(1,
- mEabControllerSub1.getCapabilities(contactUriList).size());
- Assert.assertEquals(EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE,
- mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
- }
-
private RcsContactUceCapability createPresenceCapability() {
RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder =
new RcsContactPresenceTuple.ServiceCapabilities.Builder(TEST_AUDIO_CAPABLE,
@@ -424,7 +337,6 @@ public class EabControllerTest extends ImsTestBase {
TEST_CONTACT_URI, SOURCE_TYPE_NETWORK, REQUEST_RESULT_FOUND);
builder.addCapabilityTuple(tupleWithServiceCapabilities);
builder.addCapabilityTuple(tupleWithEmptyServiceCapabilities);
- builder.setEntityUri(TEST_CONTACT_URI);
return builder.build();
}
@@ -446,13 +358,6 @@ public class EabControllerTest extends ImsTestBase {
return builder.build();
}
- private RcsContactUceCapability createEmptyTuplePresenceCapability() {
- RcsContactUceCapability.PresenceBuilder builder =
- new RcsContactUceCapability.PresenceBuilder(
- TEST_CONTACT_URI, SOURCE_TYPE_NETWORK, REQUEST_RESULT_FOUND);
- return builder.build();
- }
-
private void insertContactInfoToDB() {
ContentValues data = new ContentValues();
data.put(EabProvider.ContactColumns.PHONE_NUMBER, TEST_PHONE_NUMBER);
diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java
index 46171d0c..6d09ebf8 100644
--- a/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java
+++ b/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java
@@ -272,7 +272,6 @@ public class EabProviderTest extends ImsTestBase {
data.put(EabProvider.EabCommonColumns.MECHANISM, CAPABILITY_MECHANISM_PRESENCE);
data.put(EabProvider.EabCommonColumns.REQUEST_RESULT, REQUEST_RESULT_FOUND);
data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, subid);
- data.put(EabProvider.EabCommonColumns.ENTITY_URI, "sip:456789@test.com");
mContext.getContentResolver().insert(COMMON_URI, data);
data = new ContentValues();
@@ -312,8 +311,6 @@ public class EabProviderTest extends ImsTestBase {
cursor.moveToFirst();
assertEquals(1, cursor.getInt(cursor.getColumnIndex(
EabProvider.PresenceTupleColumns.VIDEO_CAPABLE)));
- assertEquals("sip:456789@test.com", cursor.getString(cursor.getColumnIndex(
- EabProvider.EabCommonColumns.ENTITY_URI)));
}
@Test
diff --git a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java
index fd29d5b3..be92ce36 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java
@@ -93,13 +93,9 @@ public class PidfParserTest extends ImsTestBase {
isVideoSupported);
// Convert to the class RcsContactUceCapability
- RcsContactUceCapabilityWrapper capabilitiesWrapper =
- PidfParser.getRcsContactUceCapabilityWrapper(pidfData);
- assertNotNull(capabilitiesWrapper);
- RcsContactUceCapability capabilities = capabilitiesWrapper.toRcsContactUceCapability();
+ RcsContactUceCapability capabilities = PidfParser.getRcsContactUceCapability(pidfData);
assertNotNull(capabilities);
assertEquals(Uri.parse(contact), capabilities.getContactUri());
- assertEquals(Uri.parse(contact), capabilities.getEntityUri());
assertEquals(RcsContactUceCapability.SOURCE_TYPE_NETWORK, capabilities.getSourceType());
assertEquals(RcsContactUceCapability.CAPABILITY_MECHANISM_PRESENCE,
capabilities.getCapabilityMechanism());
@@ -171,14 +167,10 @@ public class PidfParserTest extends ImsTestBase {
String pidfData = getPidfDataWithNewlineAndWhitespaceCharacters();
// Convert to the class RcsContactUceCapability
- RcsContactUceCapabilityWrapper capabilitiesWrapper =
- PidfParser.getRcsContactUceCapabilityWrapper(pidfData);
- assertNotNull(capabilitiesWrapper);
- RcsContactUceCapability capabilities = capabilitiesWrapper.toRcsContactUceCapability();
+ RcsContactUceCapability capabilities = PidfParser.getRcsContactUceCapability(pidfData);
assertNotNull(capabilities);
assertEquals(Uri.parse(contact), capabilities.getContactUri());
- assertEquals(Uri.parse(contact), capabilities.getEntityUri());
assertEquals(RcsContactUceCapability.SOURCE_TYPE_NETWORK, capabilities.getSourceType());
assertEquals(RcsContactUceCapability.CAPABILITY_MECHANISM_PRESENCE,
capabilities.getCapabilityMechanism());
@@ -241,10 +233,7 @@ public class PidfParserTest extends ImsTestBase {
serviceId2, serviceDescription2, isAudioSupported, isVideoSupported);
// Convert to the class RcsContactUceCapability
- RcsContactUceCapabilityWrapper capabilitiesWrapper =
- PidfParser.getRcsContactUceCapabilityWrapper(pidfData);
- assertNotNull(capabilitiesWrapper);
- RcsContactUceCapability capabilities = capabilitiesWrapper.toRcsContactUceCapability();
+ RcsContactUceCapability capabilities = PidfParser.getRcsContactUceCapability(pidfData);
assertNotNull(capabilities);
assertEquals(Uri.parse(contact), capabilities.getContactUri());
@@ -286,11 +275,8 @@ public class PidfParserTest extends ImsTestBase {
final String pidf = PidfParser.convertToPidf(capability);
// Restore to the RcsContactUceCapability from the pidf
- RcsContactUceCapabilityWrapper capabilitiesWrapper =
- PidfParser.getRcsContactUceCapabilityWrapper(pidf);
- assertNotNull(capabilitiesWrapper);
final RcsContactUceCapability restoredCapability =
- capabilitiesWrapper.toRcsContactUceCapability();
+ PidfParser.getRcsContactUceCapability(pidf);
assertEquals(capability.getContactUri(), restoredCapability.getContactUri());
assertEquals(capability.getCapabilityMechanism(),
diff --git a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapperTest.java b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapperTest.java
deleted file mode 100644
index 9497e198..00000000
--- a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapperTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce.presence.pidfparser;
-
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.net.Uri;
-import android.telephony.ims.RcsContactPresenceTuple;
-import android.telephony.ims.RcsContactUceCapability;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.ims.ImsTestBase;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class RcsContactUceCapabilityWrapperTest extends ImsTestBase {
-
-
- @Before
- public void setUp() throws Exception {
- super.setUp();
- }
-
- @After
- public void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- @SmallTest
- public void testMalformedStatus() throws Exception {
- RcsContactUceCapabilityWrapper capabilityWrapper = getRcsContactUceCapabilityWrapper();
- capabilityWrapper.setMalformedContents();
-
- assertTrue(capabilityWrapper.isMalformed());
-
- RcsContactPresenceTuple.Builder tupleBuilder = new RcsContactPresenceTuple.Builder(
- "open", "test", "1.0");
-
- capabilityWrapper.addCapabilityTuple(tupleBuilder.build());
- assertFalse(capabilityWrapper.isMalformed());
- }
-
- private RcsContactUceCapabilityWrapper getRcsContactUceCapabilityWrapper() {
- final Uri contact = Uri.fromParts("sip", "test", null);
- RcsContactUceCapabilityWrapper wrapper = new RcsContactUceCapabilityWrapper(contact,
- RcsContactUceCapability.SOURCE_TYPE_NETWORK,
- RcsContactUceCapability.REQUEST_RESULT_FOUND);
-
- return wrapper;
- }
-}
diff --git a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/PresenceTest.java b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/PresenceTest.java
index 3a4c9f93..99606f90 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/PresenceTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/PresenceTest.java
@@ -49,6 +49,7 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
+
@RunWith(AndroidJUnit4.class)
public class PresenceTest extends ImsTestBase {
@@ -170,95 +171,6 @@ public class PresenceTest extends ImsTestBase {
assertEquals(contact, PidfParserUtils.getTupleContact(tuple));
}
- @Test
- @SmallTest
- public void testMalformedParsing() throws Exception {
- final String contact = Uri.fromParts("sip", "test", null).toString();
- final String serviceId = "service_id_01";
- final String version = "1.0";
- final String description = "description_test";
- final String serviceId2 = "service_id_02";
- final String version2 = "2.0";
- final String description2 = "description_test2";
- final String serviceId3 = "service_id_03";
- final String version3 = "3.0";
- final String description3 = "description_test3";
-
- StringBuilder presenceExample = new StringBuilder();
- presenceExample.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>")
- .append("<presence entity=\"").append(contact).append("\"")
- .append(" xmlns=\"urn:ietf:params:xml:ns:pidf\"")
- .append(" xmlns:op=\"urn:oma:xml:prs:pidf:oma-pres\"")
- .append(" xmlns:caps=\"urn:ietf:params:xml:ns:pidf:caps\">")
- .append("<tuple id=\"tid0\"><status><basic>open</basic></status>")
- .append("<op:service-description>")
- .append("<op:service-id>").append(serviceId).append("</op:service-id>")
- .append("<op:version>").append(version).append("</op:version>")
- .append("<op:description>").append(description).append("</op:description>")
- .append("</op:service-description>")
- .append("<contact>sip:test</contact></tuple>")
- .append("<tuple id=\"tid1\"><status><basic>open</basic></status>")
- .append("<op:service-ddescription>")
- .append("<op:service-id>").append(serviceId2).append("</op:service-id>")
- .append("<op:version>").append(version2).append("</op:version>")
- .append("<op:description>").append(description2).append("</op:description>")
- .append("</op:service-description>")
- .append("<contact>sip:test</contact></tuple>")
- .append("<tuple id=\"tid3\"><status><basic>open</basic></status>")
- .append("<op:service-description>")
- .append("<op:service-id>").append(serviceId3).append("</op:service-id>")
- .append("<op:version>").append(version3).append("</op:version>")
- .append("<op:description>").append(description3).append("</op:description>")
- .append("</op:service-description>")
- .append("<contact>sip:test</contact></tuple></presence>");
-
- XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- Reader reader = new StringReader(presenceExample.toString());
- parser.setInput(reader);
-
- Presence presence = null;
- int nextType = parser.next();
-
- // Find the start tag
- do {
- if (nextType == XmlPullParser.START_TAG
- && Presence.ELEMENT_NAME.equals(parser.getName())) {
- presence = new Presence();
- presence.parse(parser);
- break;
- }
- nextType = parser.next();
- } while(nextType != XmlPullParser.END_DOCUMENT);
-
- reader.close();
-
- assertNotNull(presence);
- assertEquals(contact, presence.getEntity());
-
- List<Tuple> tupleList = presence.getTupleList();
- assertNotNull(tupleList);
- assertEquals(3, tupleList.size());
- assertNotNull(tupleList.get(0)); // tuple of tid0
- assertNotNull(tupleList.get(1)); // tuple of tid1. tid1 is a tuple that failed to parse.
- assertNotNull(tupleList.get(2)); // tuple of tid2.
-
- Tuple tuple = tupleList.get(0);
- assertEquals(contact, PidfParserUtils.getTupleContact(tuple));
-
- assertEquals(serviceId, PidfParserUtils.getTupleServiceId(tuple));
- assertEquals(version, PidfParserUtils.getTupleServiceVersion(tuple));
- assertEquals(description, PidfParserUtils.getTupleServiceDescription(tuple));
-
- Tuple tuple1 = tupleList.get(1);
- assertTrue(PidfParserUtils.getTupleMalformedStatus(tuple1));
-
- Tuple tuple3 = tupleList.get(2);
- assertEquals(serviceId3, PidfParserUtils.getTupleServiceId(tuple3));
- assertEquals(version3, PidfParserUtils.getTupleServiceVersion(tuple3));
- assertEquals(description3, PidfParserUtils.getTupleServiceDescription(tuple3));
- }
-
private Tuple getTuple(String statusValue, String serviceIdValue, String descValue,
String contactValue) {
Basic basic = new Basic(statusValue);
diff --git a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/TupleTest.java b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/TupleTest.java
index dc5edaa8..3c44bd2b 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/TupleTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/TupleTest.java
@@ -218,10 +218,7 @@ public class TupleTest extends ImsTestBase {
String resultNote = null;
List<Note> noteList = tuple.getNoteList();
if (noteList != null && !noteList.isEmpty()) {
- Note eachNote = noteList.get(0);
- if (eachNote != null) {
- resultNote = eachNote.getNote();
- }
+ resultNote = noteList.get(0).getNote();
}
assertTrue(note.equals(resultNote));
diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfoTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfoTest.java
deleted file mode 100644
index c977a080..00000000
--- a/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfoTest.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce.presence.publish;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import android.net.Uri;
-import android.telecom.PhoneAccount;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.ims.ImsTestBase;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-
-@RunWith(AndroidJUnit4.class)
-public class DeviceCapabilityInfoTest extends ImsTestBase {
-
- int mSubId = 1;
-
- String sipNumber = "123456789";
- String telNumber = "987654321";
-
- @Before
- public void setUp() throws Exception {
- super.setUp();
- }
-
- @After
- public void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- @SmallTest
- public void testGetImsAssociatedUriWithoutPreferTelUri() throws Exception {
- DeviceCapabilityInfo deviceCapInfo = createDeviceCapabilityInfo();
-
- Uri[] uris = new Uri[2];
- uris[0] = Uri.fromParts(PhoneAccount.SCHEME_SIP, sipNumber, null);
- uris[1] = Uri.fromParts(PhoneAccount.SCHEME_TEL, telNumber, null);
-
- // When stored in the order of SIP, TEL URI, check whether the SIP URI saved at
- // the beginning is retrieved.
- deviceCapInfo.updateRcsAssociatedUri(uris);
- Uri outUri = deviceCapInfo.getImsAssociatedUri(false);
-
- String numbers = outUri.getSchemeSpecificPart();
- String[] numberParts = numbers.split("[@;:]");
- String number = numberParts[0];
-
- assertEquals(number, sipNumber);
-
- // When stored in the order of TEL, SIP URI, check whether the TEL URI saved at
- // the beginning is retrieved.
- deviceCapInfo = createDeviceCapabilityInfo();
-
- uris[0] = Uri.fromParts(PhoneAccount.SCHEME_TEL, telNumber, null);
- uris[1] = Uri.fromParts(PhoneAccount.SCHEME_SIP, sipNumber, null);
-
- deviceCapInfo.updateRcsAssociatedUri(uris);
- outUri = deviceCapInfo.getImsAssociatedUri(false);
-
- numbers = outUri.getSchemeSpecificPart();
- numberParts = numbers.split("[@;:]");
- number = numberParts[0];
-
- assertEquals(number, telNumber);
- }
-
- @Test
- @SmallTest
- public void testGetImsAssociatedUriWithPreferTelUri() throws Exception {
- DeviceCapabilityInfo deviceCapInfo = createDeviceCapabilityInfo();
-
- Uri[] uris = new Uri[2];
- uris[0] = Uri.fromParts(PhoneAccount.SCHEME_SIP, sipNumber, null);
- uris[1] = Uri.fromParts(PhoneAccount.SCHEME_TEL, telNumber, null);
-
- // Check whether TEL URI is returned when preferTelUri is true even if SIP and TEL URI
- // are in the order.
- deviceCapInfo.updateRcsAssociatedUri(uris);
- Uri outUri = deviceCapInfo.getImsAssociatedUri(true);
-
- String numbers = outUri.getSchemeSpecificPart();
- String[] numberParts = numbers.split("[@;:]");
- String number = numberParts[0];
-
- assertEquals(number, telNumber);
-
- // If preferTelUri is true, check if a TEL URI is returned.
- deviceCapInfo = createDeviceCapabilityInfo();
-
- uris[0] = Uri.fromParts(PhoneAccount.SCHEME_TEL, telNumber, null);
- uris[1] = Uri.fromParts(PhoneAccount.SCHEME_SIP, sipNumber, null);
-
- deviceCapInfo.updateRcsAssociatedUri(uris);
- outUri = deviceCapInfo.getImsAssociatedUri(true);
-
- numbers = outUri.getSchemeSpecificPart();
- numberParts = numbers.split("[@;:]");
- number = numberParts[0];
-
- assertEquals(number, telNumber);
-
- // If there is only SIP URI, this method will still return a SIP URI, since there are no TEL
- // URIs found in the list.
- deviceCapInfo = createDeviceCapabilityInfo();
-
- uris[0] = Uri.fromParts(PhoneAccount.SCHEME_SIP, telNumber, null);
- uris[1] = Uri.fromParts(PhoneAccount.SCHEME_SIP, sipNumber, null);
-
- deviceCapInfo.updateRcsAssociatedUri(uris);
- outUri = deviceCapInfo.getImsAssociatedUri(true);
-
- numbers = outUri.getSchemeSpecificPart();
- numberParts = numbers.split("[@;:]");
- number = numberParts[0];
-
- assertEquals(number, telNumber);
-
- }
-
- private DeviceCapabilityInfo createDeviceCapabilityInfo() {
- DeviceCapabilityInfo deviceCapInfo = new DeviceCapabilityInfo(mSubId, null);
- return deviceCapInfo;
- }
-
-} \ No newline at end of file
diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java
index 2d170ab6..bf33103f 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java
@@ -19,12 +19,7 @@ package com.android.ims.rcs.uce.presence.publish;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyList;
-import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.refEq;
import static org.mockito.Mockito.verify;
import android.content.BroadcastReceiver;
@@ -44,18 +39,12 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import com.android.ims.ImsTestBase;
-import com.android.ims.rcs.uce.UceStatsWriter;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.Mockito;
@RunWith(AndroidJUnit4.class)
public class DeviceCapabilityListenerTest extends ImsTestBase {
@@ -71,7 +60,6 @@ public class DeviceCapabilityListenerTest extends ImsTestBase {
@Mock DeviceCapabilityListener.ImsMmTelManagerFactory mImsMmTelMgrFactory;
@Mock DeviceCapabilityListener.ImsRcsManagerFactory mImsRcsMgrFactory;
@Mock DeviceCapabilityListener.ProvisioningManagerFactory mProvisioningMgrFactory;
- @Mock UceStatsWriter mUceStatsWriter;
int mSubId = 1;
@@ -89,10 +77,6 @@ public class DeviceCapabilityListenerTest extends ImsTestBase {
doReturn(true).when(mDeviceCapability).updateVtSetting(anyBoolean());
doReturn(true).when(mDeviceCapability).updateVtSetting(anyBoolean());
doReturn(true).when(mDeviceCapability).updateMmtelCapabilitiesChanged(any());
-
- doNothing().when(mUceStatsWriter).setImsRegistrationFeatureTagStats(
- anyInt(), anyList(), anyInt());
- doNothing().when(mUceStatsWriter).setStoreCompleteImsRegistrationFeatureTagStats(anyInt());
}
@After
@@ -177,22 +161,30 @@ public class DeviceCapabilityListenerTest extends ImsTestBase {
@Test
@SmallTest
- public void testRcsRegistration() throws Exception {
+ public void testMmTelUnregistration() throws Exception {
DeviceCapabilityListener deviceCapListener = createDeviceCapabilityListener();
deviceCapListener.setImsCallbackRegistered(true);
- RegistrationCallback registrationCallback = deviceCapListener.mRcsRegistrationCallback;
+ RegistrationCallback registrationCallback = deviceCapListener.mMmtelRegistrationCallback;
- List<String> list = new ArrayList<>();
- list.add("+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.im\"");
- list.add("+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.session\"");
- list.add("+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.ftsms\"");
- Set<String> featureTags = new HashSet<String>(list);
+ ImsReasonInfo info = new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, -1, "");
+ registrationCallback.onUnregistered(info);
- ImsRegistrationAttributes attr = new ImsRegistrationAttributes.Builder(
- ImsRegistrationImplBase.REGISTRATION_TECH_LTE)
- .setFeatureTags(featureTags)
- .build();
+ Handler handler = deviceCapListener.getHandler();
+ waitForHandlerActionDelayed(handler, HANDLER_WAIT_TIMEOUT_MS, HANDLER_SENT_DELAY_MS);
+
+ verify(mDeviceCapability).updateImsMmtelUnregistered();
+ verify(mCallback).requestPublishFromInternal(
+ PublishController.PUBLISH_TRIGGER_MMTEL_UNREGISTERED);
+ }
+ @Test
+ @SmallTest
+ public void testRcsRegistration() throws Exception {
+ DeviceCapabilityListener deviceCapListener = createDeviceCapabilityListener();
+ deviceCapListener.setImsCallbackRegistered(true);
+ RegistrationCallback registrationCallback = deviceCapListener.mRcsRegistrationCallback;
+ ImsRegistrationAttributes attr = new ImsRegistrationAttributes.Builder(
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE).build();
// Notify DeviceCapabilityListener that registered has caused a change and requires publish
doReturn(true).when(mDeviceCapability).updateImsRcsRegistered(attr);
@@ -203,72 +195,49 @@ public class DeviceCapabilityListenerTest extends ImsTestBase {
verify(mDeviceCapability).updateImsRcsRegistered(attr);
verify(mCallback).requestPublishFromInternal(
PublishController.PUBLISH_TRIGGER_RCS_REGISTERED);
- verify(mUceStatsWriter).setImsRegistrationFeatureTagStats(anyInt(),
- refEq(list), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
}
@Test
@SmallTest
- public void testMmtelCapabilityChange() throws Exception {
+ public void testRcsUnregistration() throws Exception {
DeviceCapabilityListener deviceCapListener = createDeviceCapabilityListener();
- ImsMmTelManager.CapabilityCallback callback = deviceCapListener.mMmtelCapabilityCallback;
+ deviceCapListener.setImsCallbackRegistered(true);
+ RegistrationCallback registrationCallback = deviceCapListener.mRcsRegistrationCallback;
+ // Notify DeviceCapabilityListener that unregistered has caused a change and requires
+ // publish.
+ doReturn(true).when(mDeviceCapability).updateImsRcsUnregistered();
- MmTelFeature.MmTelCapabilities capabilities = new MmTelFeature.MmTelCapabilities();
- callback.onCapabilitiesStatusChanged(capabilities);
+ ImsReasonInfo info = new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, -1, "");
+ registrationCallback.onUnregistered(info);
Handler handler = deviceCapListener.getHandler();
waitForHandlerActionDelayed(handler, HANDLER_WAIT_TIMEOUT_MS, HANDLER_SENT_DELAY_MS);
- verify(mDeviceCapability).updateMmtelCapabilitiesChanged(capabilities);
+ verify(mDeviceCapability).updateImsRcsUnregistered();
verify(mCallback).requestPublishFromInternal(
- PublishController.PUBLISH_TRIGGER_MMTEL_CAPABILITY_CHANGE);
+ PublishController.PUBLISH_TRIGGER_RCS_UNREGISTERED);
}
@Test
@SmallTest
- public void testImsUnregistration() throws Exception {
+ public void testMmtelCapabilityChange() throws Exception {
DeviceCapabilityListener deviceCapListener = createDeviceCapabilityListener();
- deviceCapListener.setImsCallbackRegistered(true);
-
- // set the Ims is registered
- doReturn(true).when(mDeviceCapability).isImsRegistered();
- // MMTEL unregistered
- RegistrationCallback mmtelRegiCallback = deviceCapListener.mMmtelRegistrationCallback;
+ ImsMmTelManager.CapabilityCallback callback = deviceCapListener.mMmtelCapabilityCallback;
- ImsReasonInfo info = new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, -1, "");
- mmtelRegiCallback.onUnregistered(info);
+ MmTelFeature.MmTelCapabilities capabilities = new MmTelFeature.MmTelCapabilities();
+ callback.onCapabilitiesStatusChanged(capabilities);
Handler handler = deviceCapListener.getHandler();
waitForHandlerActionDelayed(handler, HANDLER_WAIT_TIMEOUT_MS, HANDLER_SENT_DELAY_MS);
- verify(mDeviceCapability).updateImsMmtelUnregistered();
-
- // Do not send internal publish trigger
- verify(mCallback, never()).requestPublishFromInternal(anyInt());
- // Only MMTEL unregistered. Verify do not send ImsUnregistered.
- verify(mCallback, never()).updateImsUnregistered();
-
- // set the Ims Unregistered
- doReturn(false).when(mDeviceCapability).isImsRegistered();
- // RCS unregistered
- RegistrationCallback rcsRegiCallback = deviceCapListener.mRcsRegistrationCallback;
- doReturn(true).when(mDeviceCapability).updateImsRcsUnregistered();
-
- rcsRegiCallback.onUnregistered(info);
-
- waitForHandlerActionDelayed(handler, HANDLER_WAIT_TIMEOUT_MS, HANDLER_SENT_DELAY_MS);
-
- verify(mDeviceCapability).updateImsRcsUnregistered();
- // Do not send internal publish trigger
- verify(mCallback, never()).requestPublishFromInternal(anyInt());
- verify(mUceStatsWriter).setStoreCompleteImsRegistrationFeatureTagStats(anyInt());
-
- verify(mCallback).updateImsUnregistered();
+ verify(mDeviceCapability).updateMmtelCapabilitiesChanged(capabilities);
+ verify(mCallback).requestPublishFromInternal(
+ PublishController.PUBLISH_TRIGGER_MMTEL_CAPABILITY_CHANGE);
}
private DeviceCapabilityListener createDeviceCapabilityListener() {
DeviceCapabilityListener deviceCapListener = new DeviceCapabilityListener(mContext,
- mSubId, mDeviceCapability, mCallback, mUceStatsWriter);
+ mSubId, mDeviceCapability, mCallback);
deviceCapListener.setImsMmTelManagerFactory(mImsMmTelMgrFactory);
deviceCapListener.setImsRcsManagerFactory(mImsRcsMgrFactory);
deviceCapListener.setProvisioningMgrFactory(mProvisioningMgrFactory);
diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishControllerImplTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishControllerImplTest.java
index a7e0bbbe..b4c9b873 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishControllerImplTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishControllerImplTest.java
@@ -23,7 +23,6 @@ import static junit.framework.Assert.assertFalse;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
@@ -44,7 +43,6 @@ import androidx.test.filters.SmallTest;
import com.android.ims.RcsFeatureManager;
import com.android.ims.rcs.uce.UceController;
import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
-import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
import com.android.ims.rcs.uce.presence.publish.PublishControllerImpl.DeviceCapListenerFactory;
import com.android.ims.rcs.uce.presence.publish.PublishControllerImpl.PublishProcessorFactory;
@@ -57,8 +55,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
import org.mockito.Mock;
@RunWith(AndroidJUnit4.class)
@@ -72,8 +68,6 @@ public class PublishControllerImplTest extends ImsTestBase {
@Mock UceController.UceControllerCallback mUceCtrlCallback;
@Mock RemoteCallbackList<IRcsUcePublishStateCallback> mPublishStateCallbacks;
@Mock DeviceStateResult mDeviceStateResult;
- @Mock IRcsUcePublishStateCallback mIRcsUcePublishStateCallback;
- @Mock UceStatsWriter mUceStatsWriter;
private int mSubId = 1;
@@ -83,10 +77,9 @@ public class PublishControllerImplTest extends ImsTestBase {
doReturn(mPublishProcessor).when(mPublishProcessorFactory).createPublishProcessor(any(),
eq(mSubId), any(), any());
doReturn(mDeviceCapListener).when(mDeviceCapListenerFactory).createDeviceCapListener(any(),
- eq(mSubId), any(), any(), any());
+ eq(mSubId), any(), any());
doReturn(mDeviceStateResult).when(mUceCtrlCallback).getDeviceState();
doReturn(false).when(mDeviceStateResult).isRequestForbidden();
- doReturn(false).when(mDeviceStateResult).isPublishRequestBlocked();
}
@After
@@ -130,10 +123,10 @@ public class PublishControllerImplTest extends ImsTestBase {
@Test
@SmallTest
- public void testGetPublishStateWithNotSupportPublishingState() throws Exception {
+ public void testGetPublishState() throws Exception {
PublishControllerImpl publishController = createPublishController();
- int initState = publishController.getUcePublishState(false);
+ int initState = publishController.getUcePublishState();
assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, initState);
publishController.getPublishControllerCallback().updatePublishRequestResult(
@@ -141,43 +134,26 @@ public class PublishControllerImplTest extends ImsTestBase {
Handler handler = publishController.getPublishHandler();
waitForHandlerAction(handler, 1000);
- int latestState = publishController.getUcePublishState(false);
+ int latestState = publishController.getUcePublishState();
assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, latestState);
}
@Test
@SmallTest
- public void testGetPublishStateWithSupportPublishingState() throws Exception {
- PublishControllerImpl publishController = createPublishController();
-
- int initState = publishController.getUcePublishState(true);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, initState);
-
- publishController.getPublishControllerCallback().updatePublishRequestResult(
- RcsUceAdapter.PUBLISH_STATE_PUBLISHING, Instant.now(), null);
- Handler handler = publishController.getPublishHandler();
- waitForHandlerAction(handler, 1000);
-
- int latestState = publishController.getUcePublishState(true);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_PUBLISHING, latestState);
- }
-
- @Test
- @SmallTest
public void testRegisterPublishStateCallback() throws Exception {
PublishControllerImpl publishController = createPublishController();
- publishController.registerPublishStateCallback(mIRcsUcePublishStateCallback, true);
+ publishController.registerPublishStateCallback(any());
- verify(mPublishStateCallbacks).register(any(), any());
+ verify(mPublishStateCallbacks).register(any());
}
@Test
@SmallTest
- public void testUnregisterPublishStateCallback() throws Exception {
+ public void unregisterPublishStateCallback() throws Exception {
PublishControllerImpl publishController = createPublishController();
- publishController.unregisterPublishStateCallback(mIRcsUcePublishStateCallback);
+ publishController.unregisterPublishStateCallback(any());
verify(mPublishStateCallbacks).unregister(any());
}
@@ -186,152 +162,13 @@ public class PublishControllerImplTest extends ImsTestBase {
@SmallTest
public void testUnpublish() throws Exception {
PublishControllerImpl publishController = createPublishController();
- //To initialize the public state to publish_ok.
- publishController.setCapabilityType(RcsImsCapabilities.CAPABILITY_TYPE_OPTIONS_UCE);
publishController.onUnpublish();
Handler handler = publishController.getPublishHandler();
waitForHandlerAction(handler, 1000);
- int publishState = publishController.getUcePublishState(false);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, publishState);
- verify(mPublishProcessor).resetState();
- verify(mUceStatsWriter).setUnPublish(eq(mSubId));
- }
-
- @Test
- @SmallTest
- public void testImsUnregistered() throws Exception {
- PublishControllerImpl publishController = createPublishController();
- //To initialize the public state to publish_ok.
- publishController.setCapabilityType(RcsImsCapabilities.CAPABILITY_TYPE_OPTIONS_UCE);
-
- // Trigger a ims unregistered
- PublishControllerCallback callback = publishController.getPublishControllerCallback();
- callback.updateImsUnregistered();
-
- Handler handler = publishController.getPublishHandler();
- waitForHandlerAction(handler, 1000);
- int publishState = publishController.getUcePublishState(false);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, publishState);
- verify(mPublishProcessor).resetState();
- verify(mUceStatsWriter).setUnPublish(eq(mSubId));
- }
-
- @Test
- @SmallTest
- public void testPublishUpdated() throws Exception {
- PublishControllerImpl publishController = createPublishController();
- int responseCode = 200;
-
- publishController.onPublishUpdated(responseCode, "", 0, "");
-
- Handler handler = publishController.getPublishHandler();
- waitForHandlerAction(handler, 1000);
-
- ArgumentCaptor<PublishRequestResponse> captor =
- ArgumentCaptor.forClass(PublishRequestResponse.class);
-
- verify(mPublishProcessor).publishUpdated(captor.capture());
- PublishRequestResponse response = captor.getValue();
- int expectedCode = response.getNetworkRespSipCode().orElse(-1);
- assertEquals(responseCode, expectedCode);
- }
-
- @Test
- @SmallTest
- public void testPublishingStateTargetingEnable() throws Exception {
- doReturn(1).when(mPublishStateCallbacks).getRegisteredCallbackCount();
- Boolean boolObj = new Boolean(true);
- Object uid1 = (Object)boolObj;
- doReturn(uid1).when(mPublishStateCallbacks).getRegisteredCallbackCookie(anyInt());
-
- PublishControllerImpl publishController = createPublishController();
-
- //To initialize the public state to publish_ok.
- publishController.mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
-
- // send publish request.
- PublishControllerCallback callback = publishController.getPublishControllerCallback();
- callback.notifyPendingPublishRequest();
-
- Handler handler = publishController.getPublishHandler();
- waitForHandlerAction(handler, 1000);
- int publishState = publishController.mCurrentPublishState;
- int publishStateFromGetUcePublishState = publishController.getUcePublishState(true);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_PUBLISHING, publishState);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_PUBLISHING, publishStateFromGetUcePublishState);
-
- // Set the state to OK as if got a 200 OK response to publish request
- publishController.mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
-
- publishStateFromGetUcePublishState = publishController.getUcePublishState(true);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishStateFromGetUcePublishState);
-
- // send publish request again.
- callback.notifyPendingPublishRequest();
- handler = publishController.getPublishHandler();
- waitForHandlerAction(handler, 1000);
- publishState = publishController.mCurrentPublishState;
- publishStateFromGetUcePublishState = publishController.getUcePublishState(true);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_PUBLISHING, publishState);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_PUBLISHING, publishStateFromGetUcePublishState);
- }
-
- @Test
- @SmallTest
- public void testPublishingStateTargetingDisable() throws Exception {
- doReturn(1).when(mPublishStateCallbacks).getRegisteredCallbackCount();
- Boolean boolObj = new Boolean(false);
- Object uid1 = (Object)boolObj;
- doReturn(uid1).when(mPublishStateCallbacks).getRegisteredCallbackCookie(anyInt());
-
- PublishControllerImpl publishController = createPublishController();
- //To initialize the public state to publish_ok.
- publishController.mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
- publishController.mLastPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
-
- // send publish request
- PublishControllerCallback callback = publishController.getPublishControllerCallback();
- callback.notifyPendingPublishRequest();
-
- //current state is pubilsh_ok. so the state didn`t chaged.
- Handler handler = publishController.getPublishHandler();
- waitForHandlerAction(handler, 1000);
- int publishState = publishController.mLastPublishState;
- int publishStateFromGetUcePublishState = publishController.getUcePublishState(false);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishState);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishStateFromGetUcePublishState);
-
- // set the state to error.
- publishController.mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_OTHER_ERROR;
- // send publish request again.
- callback.notifyPendingPublishRequest();
- handler = publishController.getPublishHandler();
- waitForHandlerAction(handler, 1000);
-
- // the state must be changed to not published.
- publishState = publishController.mLastPublishState;
- publishStateFromGetUcePublishState = publishController.getUcePublishState(false);
+ int publishState = publishController.getUcePublishState();
assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, publishState);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, publishStateFromGetUcePublishState);
-
- // Set the state to OK as if got a 200 OK response to publish request
- publishController.mLastPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
- publishController.mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
-
- publishStateFromGetUcePublishState = publishController.getUcePublishState(false);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishStateFromGetUcePublishState);
-
- // send publish request again.
- callback.notifyPendingPublishRequest();
- handler = publishController.getPublishHandler();
- waitForHandlerAction(handler, 1000);
- // current state is ok so the state didn`t changed.
- publishState = publishController.mLastPublishState;
- publishStateFromGetUcePublishState = publishController.getUcePublishState(false);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishState);
- assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishStateFromGetUcePublishState);
}
@Test
@@ -375,32 +212,6 @@ public class PublishControllerImplTest extends ImsTestBase {
@Test
@SmallTest
- public void testRequestPublishFromServiceWhenDeviceNoRetry() throws Exception {
- doReturn(true).when(mDeviceStateResult).isPublishRequestBlocked();
-
- PublishControllerImpl publishController = createPublishController();
- doReturn(Optional.of(0L)).when(mPublishProcessor).getPublishingDelayTime();
-
- // Set the PRESENCE is capable
- IImsCapabilityCallback RcsCapCallback = publishController.getRcsCapabilitiesCallback();
- RcsCapCallback.onCapabilitiesStatusChanged(RcsUceAdapter.CAPABILITY_TYPE_PRESENCE_UCE);
-
- // Trigger the PUBLISH request from the service.
- publishController.requestPublishCapabilitiesFromService(
- RcsUceAdapter.CAPABILITY_UPDATE_TRIGGER_MOVE_TO_IWLAN);
-
- Handler handler = publishController.getPublishHandler();
- waitForHandlerAction(handler, 1000);
-
- // Reset device state because isPublishRequestBlocked() is true when Ims Service
- // requests PUBLISH.
- verify(mUceCtrlCallback).resetDeviceState();
- // The PUBLISH request must be pending because the current device state is no_retry.
- verify(mPublishProcessor).setPendingRequest(anyInt());
- }
-
- @Test
- @SmallTest
public void testFirstRequestPublishIsTriggeredFromService() throws Exception {
PublishControllerImpl publishController = createPublishController();
doReturn(Optional.of(0L)).when(mPublishProcessor).getPublishingDelayTime();
@@ -538,7 +349,7 @@ public class PublishControllerImplTest extends ImsTestBase {
private PublishControllerImpl createPublishController() {
PublishControllerImpl publishController = new PublishControllerImpl(mContext, mSubId,
mUceCtrlCallback, Looper.getMainLooper(), mDeviceCapListenerFactory,
- mPublishProcessorFactory, mUceStatsWriter);
+ mPublishProcessorFactory);
publishController.setPublishStateCallback(mPublishStateCallbacks);
publishController.setCapabilityType(RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE);
return publishController;
diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishProcessorTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishProcessorTest.java
index 4e8cdfdc..d83158f5 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishProcessorTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishProcessorTest.java
@@ -17,7 +17,6 @@
package com.android.ims.rcs.uce.presence.publish;
import static android.telephony.ims.RcsContactPresenceTuple.TUPLE_BASIC_STATUS_OPEN;
-
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
@@ -26,7 +25,6 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
-import android.content.Context;
import android.net.Uri;
import android.telephony.ims.RcsContactPresenceTuple;
import android.telephony.ims.RcsContactUceCapability;
@@ -36,7 +34,6 @@ import androidx.test.filters.SmallTest;
import com.android.ims.ImsTestBase;
import com.android.ims.RcsFeatureManager;
-import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
import org.junit.After;
@@ -45,8 +42,6 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import java.time.Instant;
-import java.util.Optional;
@RunWith(AndroidJUnit4.class)
public class PublishProcessorTest extends ImsTestBase {
@@ -55,25 +50,10 @@ public class PublishProcessorTest extends ImsTestBase {
@Mock PublishControllerCallback mPublishCtrlCallback;
@Mock PublishProcessorState mProcessorState;
@Mock PublishRequestResponse mResponseCallback;
- @Mock UceStatsWriter mUceStatsWriter;
private int mSub = 1;
private long mTaskId = 1L;
- public static class TestPublishProcessor extends PublishProcessor {
- public TestPublishProcessor(Context context, int subId,
- DeviceCapabilityInfo capabilityInfo,
- PublishControllerCallback publishCtrlCallback,
- UceStatsWriter instance) {
- super(context, subId, capabilityInfo, publishCtrlCallback, instance);
- }
-
- @Override
- protected boolean isEabProvisioned() {
- return true;
- }
- }
-
@Before
public void setUp() throws Exception {
super.setUp();
@@ -103,7 +83,6 @@ public class PublishProcessorTest extends ImsTestBase {
verify(mProcessorState).setPublishingFlag(true);
verify(mRcsFeatureManager).requestPublication(any(), any());
verify(mPublishCtrlCallback).setupRequestCanceledTimer(anyLong(), anyLong());
- verify(mPublishCtrlCallback).notifyPendingPublishRequest();
}
@Test
@@ -165,8 +144,6 @@ public class PublishProcessorTest extends ImsTestBase {
doReturn(mTaskId).when(mProcessorState).getCurrentTaskId();
doReturn(mTaskId).when(mResponseCallback).getTaskId();
doReturn(true).when(mResponseCallback).needRetry();
- doReturn(Optional.of(10)).when(mResponseCallback).getCmdErrorCode();
-
PublishProcessor publishProcessor = getPublishProcessor();
publishProcessor.onCommandError(mResponseCallback);
@@ -177,8 +154,6 @@ public class PublishProcessorTest extends ImsTestBase {
verify(mResponseCallback).onDestroy();
verify(mProcessorState).setPublishingFlag(false);
verify(mPublishCtrlCallback).clearRequestCanceledTimer();
- verify(mUceStatsWriter).setUceEvent(eq(mSub), eq(UceStatsWriter.PUBLISH_EVENT), eq(true),
- eq(10), eq(0));
}
@Test
@@ -225,7 +200,6 @@ public class PublishProcessorTest extends ImsTestBase {
doReturn(mTaskId).when(mResponseCallback).getTaskId();
doReturn(false).when(mResponseCallback).needRetry();
doReturn(true).when(mResponseCallback).isRequestSuccess();
- doReturn(Optional.of(200)).when(mResponseCallback).getNetworkRespSipCode();
PublishProcessor publishProcessor = getPublishProcessor();
publishProcessor.onNetworkResponse(mResponseCallback);
@@ -234,9 +208,6 @@ public class PublishProcessorTest extends ImsTestBase {
verify(mResponseCallback).onDestroy();
verify(mProcessorState).setPublishingFlag(false);
verify(mPublishCtrlCallback).clearRequestCanceledTimer();
-
- verify(mUceStatsWriter).setUceEvent(eq(mSub), eq(UceStatsWriter.PUBLISH_EVENT), eq(true),
- eq(0), eq(200));
}
@Test
@@ -250,28 +221,9 @@ public class PublishProcessorTest extends ImsTestBase {
verify(mPublishCtrlCallback).clearRequestCanceledTimer();
}
- @Test
- @SmallTest
- public void testPublishUpdated() throws Exception {
- Instant responseTime = Instant.now();
- doReturn(responseTime).when(mResponseCallback).getResponseTimestamp();
- doReturn(true).when(mResponseCallback).isRequestSuccess();
-
- doReturn(0).when(mResponseCallback).getPublishState();
- doReturn("").when(mResponseCallback).getPidfXml();
-
- PublishProcessor publishProcessor = getPublishProcessor();
-
- publishProcessor.publishUpdated(mResponseCallback);
-
- verify(mProcessorState).setLastPublishedTime(any());
- verify(mProcessorState).resetRetryCount();
- verify(mPublishCtrlCallback).updatePublishRequestResult(anyInt(), any(), any());
- }
-
private PublishProcessor getPublishProcessor() {
- PublishProcessor publishProcessor = new TestPublishProcessor(mContext, mSub,
- mDeviceCapabilities, mPublishCtrlCallback, mUceStatsWriter);
+ PublishProcessor publishProcessor = new PublishProcessor(mContext, mSub,
+ mDeviceCapabilities, mPublishCtrlCallback);
publishProcessor.setProcessorState(mProcessorState);
publishProcessor.onRcsConnected(mRcsFeatureManager);
return publishProcessor;
diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTrackerTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTrackerTest.java
index 55006299..6d15946c 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTrackerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTrackerTest.java
@@ -20,7 +20,6 @@ import static org.junit.Assert.assertEquals;
import android.telephony.ims.RcsContactPresenceTuple;
import android.util.ArraySet;
-import android.util.Log;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -32,7 +31,6 @@ import org.junit.runner.RunWith;
import java.util.Arrays;
import java.util.Collections;
-import java.util.Map;
import java.util.Set;
@RunWith(AndroidJUnit4.class)
@@ -67,11 +65,8 @@ public class PublishServiceDescTrackerTest {
public static final String TEST_FEATURE_TAG_CHATBOT_FORMAT =
" +g.3gpp.iari-ref= \" Urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.chatbot \"";
- public static final String TEST_FEATURE_TAG_BOTVERSION_V2_FORMAT =
- "+g.gsma.rcs.botVersion =\" #=1 , #=2 \" ";
-
public static final String TEST_FEATURE_TAG_BOTVERSION_FORMAT =
- "+g.gsma.rcs.botVersion =\" #=1 \" ";
+ "+g.gsma.rcs.botVersion =\" #=1 , #=2 \" ";
public static final String TEST_FEATURE_TAG_MMTEL_FORMAT =
" +g.3gpp.icsi-ref = \"urn%3Aurn-7%3A3gpp-servIce.ims.icsi.mmtel \" ";
@@ -107,22 +102,13 @@ public class PublishServiceDescTrackerTest {
t1.updateImsRegistration(imsReg);
assertEquals(expectedSet, t1.copyRegistrationCapabilities());
-
- expectedSet = Collections.singleton(
- ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION);
- imsReg = createImsRegistration(
- FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_SESSION,
- FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED);
- t1.updateImsRegistration(imsReg);
- assertEquals(expectedSet, t1.copyRegistrationCapabilities());
-
// Should see chatbot v1 and v2 pop up in this case (same FTs)
expectedSet = new ArraySet<>(Arrays.asList(
- ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V1,
+ ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION,
ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V2));
imsReg = createImsRegistration(
FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_SESSION,
- FeatureTags.FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED);
+ FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED);
t1.updateImsRegistration(imsReg);
assertEquals(expectedSet, t1.copyRegistrationCapabilities());
@@ -199,24 +185,13 @@ public class PublishServiceDescTrackerTest {
t1.updateImsRegistration(imsReg);
assertEquals(expectedSet, t1.copyRegistrationCapabilities());
- // The registered tag is botVersion=#1,
- // so check if the service description of chatbot version 1.0 should be set.
- expectedSet = Collections.singleton(
- ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION);
- imsReg = createImsRegistration(
- TEST_FEATURE_TAG_CHATBOT_FORMAT,
- TEST_FEATURE_TAG_BOTVERSION_FORMAT);
- t1.updateImsRegistration(imsReg);
- assertEquals(expectedSet, t1.copyRegistrationCapabilities());
-
- // The registered tag is botVersion=#1,#2,
- // so check if the service description of chatbot version 1.0 and 2.0 should be set.
+ // Should see chatbot v1 and v2 pop up in this case (same FTs)
expectedSet = new ArraySet<>(Arrays.asList(
- ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V1,
+ ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION,
ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V2));
imsReg = createImsRegistration(
TEST_FEATURE_TAG_CHATBOT_FORMAT,
- TEST_FEATURE_TAG_BOTVERSION_V2_FORMAT);
+ TEST_FEATURE_TAG_BOTVERSION_FORMAT);
t1.updateImsRegistration(imsReg);
assertEquals(expectedSet, t1.copyRegistrationCapabilities());
diff --git a/tests/src/com/android/ims/rcs/uce/request/CapabilityRequestTest.java b/tests/src/com/android/ims/rcs/uce/request/CapabilityRequestTest.java
index bfeb55ac..4aef42e6 100644
--- a/tests/src/com/android/ims/rcs/uce/request/CapabilityRequestTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/CapabilityRequestTest.java
@@ -95,8 +95,7 @@ public class CapabilityRequestTest extends ImsTestBase {
eabResultList.add(eabResult2);
doReturn(false).when(mDeviceStateResult).isRequestForbidden();
- doReturn(eabResultList).when(mReqMgrCallback)
- .getCapabilitiesFromCacheIncludingExpired(any());
+ doReturn(eabResultList).when(mReqMgrCallback).getCapabilitiesFromCache(any());
// Execute the request.
request.executeRequest();
@@ -162,11 +161,7 @@ public class CapabilityRequestTest extends ImsTestBase {
eabResultList.add(eabResult);
doReturn(false).when(mDeviceStateResult).isRequestForbidden();
- doReturn(eabResultList).when(mReqMgrCallback)
- .getCapabilitiesFromCacheIncludingExpired(any());
- // This API should only be applied to PUBLISH.
- // Even if the return value is true, the capabilities request must be processed.
- doReturn(true).when(mDeviceStateResult).isPublishRequestBlocked();
+ doReturn(eabResultList).when(mReqMgrCallback).getCapabilitiesFromCache(any());
// Execute the request.
request.executeRequest();
diff --git a/tests/src/com/android/ims/rcs/uce/request/OptionsCoordinatorTest.java b/tests/src/com/android/ims/rcs/uce/request/OptionsCoordinatorTest.java
index 1759de5d..9c270fbf 100644
--- a/tests/src/com/android/ims/rcs/uce/request/OptionsCoordinatorTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/OptionsCoordinatorTest.java
@@ -38,13 +38,11 @@ import androidx.test.filters.SmallTest;
import com.android.ims.ImsTestBase;
import com.android.ims.rcs.uce.request.UceRequestCoordinator.RequestResult;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
-import com.android.ims.rcs.uce.UceStatsWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import java.util.Optional;
import org.junit.After;
import org.junit.Before;
@@ -59,7 +57,6 @@ public class OptionsCoordinatorTest extends ImsTestBase {
@Mock CapabilityRequestResponse mResponse;
@Mock RequestManagerCallback mRequestMgrCallback;
@Mock IRcsUceControllerCallback mUceCallback;
- @Mock UceStatsWriter mUceStatsWriter;
private int mSubId = 1;
private long mTaskId = 1L;
@@ -96,14 +93,11 @@ public class OptionsCoordinatorTest extends ImsTestBase {
@Test
@SmallTest
public void testRequestCommandError() throws Exception {
- doReturn(Optional.of(3)).when(mResponse).getCommandError();
OptionsRequestCoordinator coordinator = getOptionsCoordinator();
coordinator.onRequestUpdated(mTaskId, REQUEST_UPDATE_COMMAND_ERROR);
verify(mRequest).onFinish();
- verify(mUceStatsWriter).setUceEvent(eq(mSubId), eq(UceStatsWriter.OUTGOING_OPTION_EVENT),
- eq(false), eq(3), eq(0));
Collection<UceRequest> requestList = coordinator.getActivatedRequest();
Collection<RequestResult> resultList = coordinator.getFinishedRequest();
@@ -117,7 +111,6 @@ public class OptionsCoordinatorTest extends ImsTestBase {
public void testRequestNetworkResponse() throws Exception {
OptionsRequestCoordinator coordinator = getOptionsCoordinator();
doReturn(true).when(mResponse).isNetworkResponseOK();
- doReturn(Optional.of(200)).when(mResponse).getNetworkRespSipCode();
final List<RcsContactUceCapability> updatedCapList = new ArrayList<>();
RcsContactUceCapability updatedCapability = getContactUceCapability();
@@ -131,8 +124,6 @@ public class OptionsCoordinatorTest extends ImsTestBase {
verify(mResponse).removeUpdatedCapabilities(updatedCapList);
verify(mRequest).onFinish();
- verify(mUceStatsWriter).setUceEvent(eq(mSubId), eq(UceStatsWriter.OUTGOING_OPTION_EVENT),
- eq(true), eq(0), eq(200));
Collection<UceRequest> requestList = coordinator.getActivatedRequest();
Collection<RequestResult> resultList = coordinator.getFinishedRequest();
@@ -143,10 +134,9 @@ public class OptionsCoordinatorTest extends ImsTestBase {
private OptionsRequestCoordinator getOptionsCoordinator() {
OptionsRequestCoordinator.Builder builder = new OptionsRequestCoordinator.Builder(
- mSubId, Collections.singletonList(mRequest), mRequestMgrCallback, mUceStatsWriter);
+ mSubId, Collections.singletonList(mRequest), mRequestMgrCallback);
builder.setCapabilitiesCallback(mUceCallback);
- OptionsRequestCoordinator coordinator = builder.build();
- return coordinator;
+ return builder.build();
}
private RcsContactUceCapability getContactUceCapability() {
diff --git a/tests/src/com/android/ims/rcs/uce/request/RemoteOptionsCoordinatorTest.java b/tests/src/com/android/ims/rcs/uce/request/RemoteOptionsCoordinatorTest.java
index 80077114..1a6ed4a4 100644
--- a/tests/src/com/android/ims/rcs/uce/request/RemoteOptionsCoordinatorTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/RemoteOptionsCoordinatorTest.java
@@ -37,7 +37,6 @@ import com.android.ims.ImsTestBase;
import com.android.ims.rcs.uce.request.RemoteOptionsRequest.RemoteOptResponse;
import com.android.ims.rcs.uce.request.UceRequestCoordinator.RequestResult;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
-import com.android.ims.rcs.uce.UceStatsWriter;
import java.util.Collection;
import java.util.Collections;
@@ -55,7 +54,6 @@ public class RemoteOptionsCoordinatorTest extends ImsTestBase {
@Mock RemoteOptResponse mResponse;
@Mock RequestManagerCallback mRequestMgrCallback;
@Mock IOptionsRequestCallback mOptRequestCallback;
- @Mock UceStatsWriter mUceStatsWriter;
private int mSubId = 1;
private long mTaskId = 1L;
@@ -86,8 +84,6 @@ public class RemoteOptionsCoordinatorTest extends ImsTestBase {
verify(mOptRequestCallback).respondToCapabilityRequest(updatedCapability, true);
verify(mRequest).onFinish();
- verify(mUceStatsWriter).setUceEvent(eq(mSubId), eq(UceStatsWriter.INCOMING_OPTION_EVENT),
- eq(true), eq(0), eq(200));
Collection<UceRequest> requestList = coordinator.getActivatedRequest();
Collection<RequestResult> resultList = coordinator.getFinishedRequest();
@@ -98,7 +94,7 @@ public class RemoteOptionsCoordinatorTest extends ImsTestBase {
private RemoteOptionsCoordinator getRemoteOptCoordinator() {
RemoteOptionsCoordinator.Builder builder = new RemoteOptionsCoordinator.Builder(
- mSubId, Collections.singletonList(mRequest), mRequestMgrCallback, mUceStatsWriter);
+ mSubId, Collections.singletonList(mRequest), mRequestMgrCallback);
builder.setOptionsRequestCallback(mOptRequestCallback);
return builder.build();
}
diff --git a/tests/src/com/android/ims/rcs/uce/request/SubscribeCoordinatorTest.java b/tests/src/com/android/ims/rcs/uce/request/SubscribeCoordinatorTest.java
index bcd3c98d..137b4ac7 100644
--- a/tests/src/com/android/ims/rcs/uce/request/SubscribeCoordinatorTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/SubscribeCoordinatorTest.java
@@ -39,7 +39,6 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import android.net.Uri;
-import android.telephony.ims.RcsContactPresenceTuple;
import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.aidl.IRcsUceControllerCallback;
@@ -48,7 +47,6 @@ import androidx.test.filters.SmallTest;
import com.android.ims.ImsTestBase;
import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
-import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.ims.rcs.uce.request.UceRequestCoordinator.RequestResult;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
@@ -72,7 +70,6 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
@Mock RequestManagerCallback mRequestMgrCallback;
@Mock IRcsUceControllerCallback mUceCallback;
@Mock DeviceStateResult mDeviceStateResult;
- @Mock UceStatsWriter mUceStatsWriter;
private int mSubId = 1;
private long mTaskId = 1L;
@@ -109,7 +106,6 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
@Test
@SmallTest
public void testRequestCommandError() throws Exception {
- doReturn(Optional.of(3)).when(mResponse).getCommandError();
SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
coordinator.onRequestUpdated(mTaskId, REQUEST_UPDATE_COMMAND_ERROR);
@@ -118,9 +114,6 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
Collection<RequestResult> resultList = coordinator.getFinishedRequest();
assertTrue(requestList.isEmpty());
assertEquals(1, resultList.size());
-
- verify(mUceStatsWriter).setUceEvent(eq(mSubId), eq(UceStatsWriter.SUBSCRIBE_EVENT),
- eq(false), eq(3), eq(0));
verify(mRequest).onFinish();
}
@@ -129,7 +122,6 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
public void testRequestNetworkRespSuccess() throws Exception {
SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
doReturn(true).when(mResponse).isNetworkResponseOK();
- doReturn(Optional.of(200)).when(mResponse).getNetworkRespSipCode();
coordinator.onRequestUpdated(mTaskId, REQUEST_UPDATE_NETWORK_RESPONSE);
@@ -137,28 +129,11 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
Collection<RequestResult> resultList = coordinator.getFinishedRequest();
assertEquals(1, requestList.size());
assertTrue(resultList.isEmpty());
-
- verify(mUceStatsWriter).setSubscribeResponse(eq(mSubId), eq(mTaskId), eq(200));
-
verify(mRequest, never()).onFinish();
}
@Test
@SmallTest
- public void testRequestNetworkRespFailure() throws Exception {
- doReturn(Optional.of(400)).when(mResponse).getNetworkRespSipCode();
-
- SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
-
- coordinator.onRequestUpdated(mTaskId, REQUEST_UPDATE_NETWORK_RESPONSE);
-
- verify(mUceStatsWriter).setSubscribeResponse(eq(mSubId), eq(mTaskId), eq(400));
-
- verify(mRequest).onFinish();
- }
-
- @Test
- @SmallTest
public void testRequestNetworkRespError() throws Exception {
SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
doReturn(false).when(mResponse).isNetworkResponseOK();
@@ -187,8 +162,7 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
final List<RcsContactUceCapability> updatedCapList = new ArrayList<>();
- RcsContactPresenceTuple tuple = getContactPresenceTuple();
- RcsContactUceCapability updatedCapability = getContactUceCapability(tuple);
+ RcsContactUceCapability updatedCapability = getContactUceCapability();
updatedCapList.add(updatedCapability);
doReturn(updatedCapList).when(mResponse).getUpdatedContactCapability();
@@ -197,8 +171,6 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
verify(mRequestMgrCallback).saveCapabilities(updatedCapList);
verify(mUceCallback).onCapabilitiesReceived(updatedCapList);
verify(mResponse).removeUpdatedCapabilities(updatedCapList);
-
- verify(mUceStatsWriter).setPresenceNotifyEvent(eq(mSubId), eq(mTaskId), any());
}
@Test
@@ -216,8 +188,6 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
verify(mRequestMgrCallback).saveCapabilities(updatedCapList);
verify(mUceCallback).onCapabilitiesReceived(updatedCapList);
verify(mResponse).removeTerminatedResources(updatedCapList);
-
- verify(mUceStatsWriter).setPresenceNotifyEvent(eq(mSubId), eq(mTaskId), any());
}
@Test
@@ -241,16 +211,12 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
public void testRequestTerminated() throws Exception {
SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
- doReturn("noresource").when(mResponse).getTerminatedReason();
-
coordinator.onRequestUpdated(mTaskId, REQUEST_UPDATE_TERMINATED);
Collection<UceRequest> requestList = coordinator.getActivatedRequest();
Collection<RequestResult> resultList = coordinator.getFinishedRequest();
assertTrue(requestList.isEmpty());
assertEquals(1, resultList.size());
-
- verify(mUceStatsWriter).setSubscribeTerminated(eq(mSubId), eq(mTaskId), eq("noresource"));
}
@Test
@@ -268,18 +234,8 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
private SubscribeRequestCoordinator getSubscribeCoordinator() {
SubscribeRequestCoordinator.Builder builder = new SubscribeRequestCoordinator.Builder(
- mSubId, Collections.singletonList(mRequest), mRequestMgrCallback, mUceStatsWriter);
+ mSubId, Collections.singletonList(mRequest), mRequestMgrCallback);
builder.setCapabilitiesCallback(mUceCallback);
- SubscribeRequestCoordinator subCoor = builder.build();
- return subCoor;
- }
-
- private RcsContactUceCapability getContactUceCapability(RcsContactPresenceTuple tuple) {
- int requestResult = RcsContactUceCapability.REQUEST_RESULT_FOUND;
- RcsContactUceCapability.PresenceBuilder builder =
- new RcsContactUceCapability.PresenceBuilder(
- mContact, RcsContactUceCapability.SOURCE_TYPE_NETWORK, requestResult);
- builder.addCapabilityTuple(tuple);
return builder.build();
}
@@ -290,12 +246,4 @@ public class SubscribeCoordinatorTest extends ImsTestBase {
mContact, RcsContactUceCapability.SOURCE_TYPE_NETWORK, requestResult);
return builder.build();
}
-
- private RcsContactPresenceTuple getContactPresenceTuple() {
- RcsContactPresenceTuple.Builder builder =
- new RcsContactPresenceTuple.Builder("open", RcsContactPresenceTuple.SERVICE_ID_CHAT_V1,
- "1.0");
- return builder.build();
-
- }
}
diff --git a/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java b/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java
index b380eac9..4a99dd19 100644
--- a/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java
@@ -17,7 +17,6 @@
package com.android.ims.rcs.uce.request;
import static android.telephony.ims.RcsContactUceCapability.CAPABILITY_MECHANISM_PRESENCE;
-import static android.telephony.ims.RcsContactUceCapability.SOURCE_TYPE_CACHED;
import static com.android.ims.rcs.uce.request.UceRequestCoordinator.REQUEST_UPDATE_CACHED_CAPABILITY_UPDATE;
import static com.android.ims.rcs.uce.request.UceRequestCoordinator.REQUEST_UPDATE_CAPABILITY_UPDATE;
@@ -50,15 +49,12 @@ import androidx.test.filters.SmallTest;
import com.android.ims.ImsTestBase;
import com.android.ims.rcs.uce.UceController;
import com.android.ims.rcs.uce.UceController.UceControllerCallback;
-import com.android.ims.rcs.uce.eab.EabCapabilityResult;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
import com.android.ims.rcs.uce.request.UceRequestManager.UceUtilsProxy;
import com.android.ims.rcs.uce.util.FeatureTags;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
-import java.util.stream.Collectors;
import org.junit.After;
import org.junit.Before;
@@ -136,116 +132,6 @@ public class UceRequestManagerTest extends ImsTestBase {
verify(mCapabilitiesCallback).onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L);
}
- /**
- * Test cache hit shortcut, where we return valid cache results when they exist before adding
- * the request to the queue.
- */
- @Test
- @SmallTest
- public void testCacheHitShortcut() throws Exception {
- UceRequestManager requestManager = getUceRequestManager();
- requestManager.setsUceUtilsProxy(getUceUtilsProxy(true, true, true, false, true, 10));
- Handler handler = requestManager.getUceRequestHandler();
-
- List<Uri> uriList = new ArrayList<>();
- uriList.add(Uri.fromParts("sip", "test", null));
-
- // Simulate a cache entry for each item in the uriList
- List<EabCapabilityResult> cachedNumbers = uriList.stream().map(uri ->
- new EabCapabilityResult(uri, EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
- new RcsContactUceCapability.PresenceBuilder(uri,
- CAPABILITY_MECHANISM_PRESENCE, SOURCE_TYPE_CACHED).build()))
- .collect(Collectors.toList());
- doReturn(cachedNumbers).when(mCallback).getCapabilitiesFromCache(uriList);
-
- requestManager.sendCapabilityRequest(uriList, false, mCapabilitiesCallback);
- waitForHandlerAction(handler, 500L);
- // Extract caps from EabCapabilityResult and ensure the Lists match.
- verify(mCapabilitiesCallback).onCapabilitiesReceived(
- cachedNumbers.stream().map(EabCapabilityResult::getContactCapabilities).collect(
- Collectors.toList()));
- verify(mCapabilitiesCallback).onComplete();
- // The cache should have been hit, so no network requests should have been generated.
- verify(mRequestRepository, never()).addRequestCoordinator(any());
- }
-
- /**
- * Test cache hit shortcut, but in this case the cache result was expired. This should generate
- * a network request.
- */
- @Test
- @SmallTest
- public void testCacheExpiredShortcut() throws Exception {
- UceRequestManager requestManager = getUceRequestManager();
- requestManager.setsUceUtilsProxy(getUceUtilsProxy(true, true, true, false, true, 10));
- Handler handler = requestManager.getUceRequestHandler();
-
- List<Uri> uriList = new ArrayList<>();
- uriList.add(Uri.fromParts("sip", "test", null));
-
- // Simulate a cache entry for each item in the uriList
- List<EabCapabilityResult> cachedNumbers = uriList.stream().map(uri ->
- new EabCapabilityResult(uri,
- EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE,
- new RcsContactUceCapability.PresenceBuilder(uri,
- CAPABILITY_MECHANISM_PRESENCE, SOURCE_TYPE_CACHED).build()))
- .collect(Collectors.toList());
- doReturn(cachedNumbers).when(mCallback).getCapabilitiesFromCache(uriList);
-
- requestManager.sendCapabilityRequest(uriList, false, mCapabilitiesCallback);
- waitForHandlerAction(handler, 500L);
- // Extract caps from EabCapabilityResult and ensure the Lists match.
- verify(mCapabilitiesCallback, never()).onCapabilitiesReceived(any());
- verify(mCapabilitiesCallback, never()).onComplete();
- // A network request should have been generated for the expired contact.
- verify(mRequestRepository).addRequestCoordinator(any());
- }
-
- /**
- * Test cache hit shortcut, where we return valid cache results when they exist before adding
- * the request to the queue. This case also tests the case where one entry of requested caps is
- * in the cache and the other isn't. We should receive a response for cached caps immediately
- * and generate a network request for the one that isnt.
- */
- @Test
- @SmallTest
- public void testCacheHitShortcutForSubsetOfCaps() throws Exception {
- UceRequestManager requestManager = getUceRequestManager();
- requestManager.setsUceUtilsProxy(getUceUtilsProxy(true, true, true, false, true, 10));
- Handler handler = requestManager.getUceRequestHandler();
-
- List<Uri> uriList = new ArrayList<>();
- Uri uri1 = Uri.fromParts("sip", "cachetest", null);
- uriList.add(uri1);
-
- // Simulate a cache entry for each item in the uriList
- List<EabCapabilityResult> cachedNumbers = new ArrayList<>();
- EabCapabilityResult cachedItem = new EabCapabilityResult(uri1,
- EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
- new RcsContactUceCapability.PresenceBuilder(uri1, CAPABILITY_MECHANISM_PRESENCE,
- SOURCE_TYPE_CACHED).build());
- cachedNumbers.add(cachedItem);
-
- // Add an entry that is not part of cache
- Uri uri2 = Uri.fromParts("sip", "nettest", null);
- uriList.add(uri2);
- cachedNumbers.add(new EabCapabilityResult(uri2,
- EabCapabilityResult.EAB_CONTACT_NOT_FOUND_FAILURE,
- new RcsContactUceCapability.PresenceBuilder(uri2, CAPABILITY_MECHANISM_PRESENCE,
- SOURCE_TYPE_CACHED).build()));
- doReturn(cachedNumbers).when(mCallback).getCapabilitiesFromCache(uriList);
-
- requestManager.sendCapabilityRequest(uriList, false, mCapabilitiesCallback);
- waitForHandlerAction(handler, 500L);
- // Extract caps from EabCapabilityResult and ensure the Lists match.
- verify(mCapabilitiesCallback).onCapabilitiesReceived(
- Collections.singletonList(cachedItem.getContactCapabilities()));
- verify(mCapabilitiesCallback, never()).onComplete();
- // The cache should have been hit, but there was also entry that was not in the cache, so
- // ensure that is requested.
- verify(mRequestRepository).addRequestCoordinator(any());
- }
-
@Test
@SmallTest
public void testRequestManagerCallback() throws Exception {