diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-15 21:47:57 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-15 21:47:57 +0000 |
commit | abd36879c4a8da43ecfa32ab232dc30efb049941 (patch) | |
tree | c453c84db4ad6173d359006761f9beddded5d97b | |
parent | c812bd6bdf4af2ba9b88a0997810c9cf65647643 (diff) | |
parent | cbaaf03b8515fb290528f5892a78f8a8c309f34e (diff) | |
download | ims-aml_tz3_314012070.tar.gz |
Snap for 8730993 from cbaaf03b8515fb290528f5892a78f8a8c309f34e to mainline-tzdata3-releaseaml_tz3_314012070aml_tz3_314012050aml_tz3_314012010aml_tz3_313110000aml_tz3_312511020aml_tz3_312511010aml_tz3_312410020aml_tz3_312410010android12-mainline-tzdata3-releaseaml_tz3_314012010
Change-Id: Ia81c29c3b9640be99ede4b32d385d8c7fc6a7e7f
73 files changed, 957 insertions, 4176 deletions
@@ -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 { |