diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-05-20 13:36:18 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-05-20 13:36:18 +0000 |
commit | a6052a4648f341a5548814811211ae57b8437ffc (patch) | |
tree | 69b7396411f5e69e690910c73bf9c0d3c64c4676 | |
parent | 70b1f738f47bdd6e401b06b257ee1bee850eae20 (diff) | |
parent | 6f7c9bb60a9f80673649044c18863d8ce155ff61 (diff) | |
download | ims-a6052a4648f341a5548814811211ae57b8437ffc.tar.gz |
Snap for 8620235 from 6f7c9bb60a9f80673649044c18863d8ce155ff61 to mainline-go-media-release
Change-Id: I7718b0d3d5ff66a10e7e0cf927ba8c916f00607c
8 files changed, 308 insertions, 210 deletions
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java index e212ee0b..257aef91 100644 --- a/src/java/com/android/ims/ImsManager.java +++ b/src/java/com/android/ims/ImsManager.java @@ -849,12 +849,7 @@ public class ImsManager implements FeatureUpdates { * Indicates whether VoLTE is provisioned on this slot. */ public boolean isVolteProvisionedOnDevice() { - // check new carrier config first KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // if that returns false, check deprecated carrier config - // KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL - if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE) || - getBooleanCarrierConfig( - CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) { + if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE)) { return isVolteProvisioned(); } @@ -865,12 +860,7 @@ public class ImsManager implements FeatureUpdates { * Indicates whether EAB is provisioned on this slot. */ public boolean isEabProvisionedOnDevice() { - // check new carrier config first KEY_RCS_REQUIRES_PROVISIONING_BUNDLE - // if that returns false, check deprecated carrier config - // KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL - if (isRcsProvisioningRequired(CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE) || - getBooleanCarrierConfig( - CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL)) { + if (isRcsProvisioningRequired(CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE)) { return isEabProvisioned(); } @@ -910,12 +900,7 @@ public class ImsManager implements FeatureUpdates { } } - // check new carrier config first KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // if that returns false, check deprecated carrier config - // KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL - if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN) - || getBooleanCarrierConfig( - CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) { + if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN)) { return isWfcProvisioned(); } @@ -942,12 +927,7 @@ public class ImsManager implements FeatureUpdates { * Indicates whether VT is provisioned on slot. */ public boolean isVtProvisionedOnDevice() { - // check new carrier config first KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // if that returns false, check deprecated carrier config - // KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL - if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE) || - getBooleanCarrierConfig( - CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) { + if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE)) { return isVtProvisioned(); } @@ -1653,7 +1633,7 @@ public class ImsManager implements FeatureUpdates { } try { - return iTelephony.getImsProvisioningStatusForCapability(subId, capability, tech); + return iTelephony.getImsProvisioningStatusForCapability(subId, capability, tech); } catch (RemoteException e) { logw("getImsProvisionedBoolNoException: operation failed for capability=" + capability + ". Exception:" + e.getMessage() + ". Returning false."); @@ -1679,7 +1659,7 @@ public class ImsManager implements FeatureUpdates { } try { - return iTelephony.getRcsProvisioningStatusForCapability(subId, capability, tech); + return iTelephony.getRcsProvisioningStatusForCapability(subId, capability, tech); } catch (RemoteException e) { logw("getRcsProvisionedBoolNoException: operation failed for capability=" + capability + ". Exception:" + e.getMessage() + ". Returning false."); @@ -3175,8 +3155,8 @@ public class ImsManager implements FeatureUpdates { boolean required = false; try { - required |= iTelephony.isProvisioningRequiredForCapability(subId, capability, - tech); + required = iTelephony.isProvisioningRequiredForCapability(subId, capability, + tech); } catch (RemoteException e) { logw("isMmTelProvisioningRequired couldn't reach telephony!"); } @@ -3200,7 +3180,7 @@ public class ImsManager implements FeatureUpdates { boolean required = false; try { - required |= iTelephony.isRcsProvisioningRequiredForCapability(subId, capability, + required = iTelephony.isRcsProvisioningRequiredForCapability(subId, capability, tech); } catch (RemoteException e) { logw("isRcsProvisioningRequired couldn't reach telephony!"); 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 7fcb1ff7..dc794331 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,6 +20,7 @@ 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; @@ -273,10 +274,33 @@ public class DeviceCapabilityInfo { } /** - * 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. + * 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. */ - public synchronized Uri getImsAssociatedUri() { + 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. if (!mRcsAssociatedUris.isEmpty()) { return mRcsAssociatedUris.get(0); } else if (!mMmtelAssociatedUris.isEmpty()) { @@ -473,7 +497,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); + Uri uri = PublishUtils.getDeviceContactUri(context, mSubId, this, true); if (uri == null) { logw("getPresenceCapabilities: uri is empty"); return null; @@ -534,7 +558,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); + Uri uri = PublishUtils.getDeviceContactUri(context, mSubId, this, false); if (uri == null) { logw("getOptionsCapabilities: uri is empty"); return null; 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 d8531a70..d87eea9e 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 @@ -30,10 +30,10 @@ 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; -import com.android.ims.rcs.uce.UceStatsWriter; import com.android.ims.rcs.uce.util.UceUtils; import com.android.internal.annotations.VisibleForTesting; @@ -199,7 +199,7 @@ public class PublishProcessor { // Check if it has provisioned. When the provisioning changes, a new publish request will // be triggered. - if (!UceUtils.isEabProvisioned(mContext, mSubId)) { + if (!isEabProvisioned()) { logd("isPublishAllowed: NOT provisioned"); return false; } @@ -509,6 +509,11 @@ public class PublishProcessor { 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/PublishUtils.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishUtils.java index ea1d11b9..1a67a40a 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,6 +18,7 @@ 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; @@ -25,6 +26,9 @@ 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; @@ -39,29 +43,49 @@ 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) { - // Get the uri from the IMS associated URI which is provided by the IMS service. - Uri contactUri = deviceCap.getImsAssociatedUri(); + 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); if (contactUri != null) { - Log.d(LOG_TAG, "getDeviceContactUri: ims associated uri"); + Uri convertedUri = preferTelUri ? getConvertedTelUri(context, contactUri) : contactUri; + Log.d(LOG_TAG, "getDeviceContactUri: returning " + + (contactUri.equals(convertedUri) ? "found" : "converted") + + " 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"); - return contactUri; + if (preferTelUri) { + return getConvertedTelUri(context, contactUri); + } else { + return contactUri; + } } else { Log.d(LOG_TAG, "getDeviceContactUri: line number"); - return getContactUriFromLine1Number(telephonyManager); + if (preferTelUri) { + return getConvertedTelUri(context, getContactUriFromLine1Number(telephonyManager)); + } else { + return getContactUriFromLine1Number(telephonyManager); + } } } @@ -136,6 +160,41 @@ 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/util/UceUtils.java b/src/java/com/android/ims/rcs/uce/util/UceUtils.java index ae98393a..c5f2b122 100644 --- a/src/java/com/android/ims/rcs/uce/util/UceUtils.java +++ b/src/java/com/android/ims/rcs/uce/util/UceUtils.java @@ -24,7 +24,9 @@ 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; @@ -100,9 +102,9 @@ public class UceUtils { } try { ProvisioningManager manager = ProvisioningManager.createForSubscriptionId(subId); - isProvisioned = manager.getProvisioningIntValue( - ProvisioningManager.KEY_EAB_PROVISIONING_STATUS) - == ProvisioningManager.PROVISIONING_VALUE_ENABLED; + isProvisioned = manager.getRcsProvisioningStatusForCapability( + ImsRcsManager.CAPABILITY_TYPE_PRESENCE_UCE, + ImsRegistrationImplBase.REGISTRATION_TECH_LTE); } catch (Exception e) { Log.w(LOG_TAG, "isEabProvisioned: exception=" + e.getMessage()); } @@ -208,6 +210,22 @@ public class UceUtils { } /** + * 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 diff --git a/tests/src/com/android/ims/ImsManagerTest.java b/tests/src/com/android/ims/ImsManagerTest.java index aaa332c6..42f110dc 100644 --- a/tests/src/com/android/ims/ImsManagerTest.java +++ b/tests/src/com/android/ims/ImsManagerTest.java @@ -308,106 +308,23 @@ public class ImsManagerTest extends ImsTestBase { } @Test - public void testGetProvisionedValues() throws Exception { - ImsManager imsManager = getImsManagerAndInitProvisionedValues(); - - assertEquals(true, imsManager.isWfcProvisionedOnDevice()); - verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN)); - clearInvocations(mITelephony); - - assertEquals(true, imsManager.isVtProvisionedOnDevice()); - verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); - clearInvocations(mITelephony); - - assertEquals(true, imsManager.isVolteProvisionedOnDevice()); - verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( - 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(mITelephony, times(1)).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN)); - clearInvocations(mITelephony); - - assertEquals(true, imsManager.isVtProvisionedOnDevice()); - verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); - clearInvocations(mITelephony); - - assertEquals(true, imsManager.isVolteProvisionedOnDevice()); - verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); - clearInvocations(mITelephony); - - assertEquals(true, imsManager.isEabProvisionedOnDevice()); - verify(mITelephony, times(1)).getRcsProvisioningStatusForCapability( - anyInt(), - eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); - } - - @Test public void testGetProvisionedValuesForWfc() throws Exception { ImsManager imsManager = getImsManagerAndInitProvisionedValues(); - // defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL mMmTelProvisioningRequired = true; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, - false); assertEquals(true, imsManager.isWfcProvisionedOnDevice()); - verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN)); verify(mITelephony, times(1)). isProvisioningRequiredForCapability(anyInt(), eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN)); - clearInvocations(mITelephony); - - // defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL - mMmTelProvisioningRequired = false; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, - true); - assertEquals(true, imsManager.isWfcProvisionedOnDevice()); verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( anyInt(), eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN)); - verify(mITelephony, times(1)). - isProvisioningRequiredForCapability(anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN)); clearInvocations(mITelephony); - // defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL mMmTelProvisioningRequired = false; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, - false); assertEquals(true, imsManager.isWfcProvisionedOnDevice()); - verify(mITelephony, never()).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN)); verify(mITelephony, times(1)). isProvisioningRequiredForCapability(anyInt(), eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), @@ -419,46 +336,19 @@ public class ImsManagerTest extends ImsTestBase { public void testGetProvisionedValuesForVt() throws Exception { ImsManager imsManager = getImsManagerAndInitProvisionedValues(); - // defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL mMmTelProvisioningRequired = true; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, - false); assertEquals(true, imsManager.isVtProvisionedOnDevice()); - verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(), eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); - clearInvocations(mITelephony); - - // not defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL - mMmTelProvisioningRequired = false; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, - true); - assertEquals(true, imsManager.isVtProvisionedOnDevice()); verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( anyInt(), eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); - verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); clearInvocations(mITelephony); - // not defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL mMmTelProvisioningRequired = false; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, - false); assertEquals(true, imsManager.isVtProvisionedOnDevice()); - verify(mITelephony, never()).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(), eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); @@ -469,46 +359,19 @@ public class ImsManagerTest extends ImsTestBase { public void testGetProvisionedValuesForVolte() throws Exception { ImsManager imsManager = getImsManagerAndInitProvisionedValues(); - // defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL mMmTelProvisioningRequired = true; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, - false); assertEquals(true, imsManager.isVolteProvisionedOnDevice()); - verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(), eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); - clearInvocations(mITelephony); - - // not defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL - mMmTelProvisioningRequired = false; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, - true); - assertEquals(true, imsManager.isVolteProvisionedOnDevice()); verify(mITelephony, times(1)).getImsProvisioningStatusForCapability( anyInt(), eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); - verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); clearInvocations(mITelephony); - // not defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE - // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL mMmTelProvisioningRequired = false; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, - false); assertEquals(true, imsManager.isVolteProvisionedOnDevice()); - verify(mITelephony, never()).getImsProvisioningStatusForCapability( - anyInt(), - eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(), eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); @@ -519,43 +382,19 @@ public class ImsManagerTest extends ImsTestBase { public void testGetProvisionedValuesForEab() throws Exception { ImsManager imsManager = getImsManagerAndInitProvisionedValues(); - // defined : KEY_RCS_REQUIRES_PROVISIONING_BUNDLE - // not defined : KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL mRcsProvisioningRequired = true; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL, false); assertEquals(true, imsManager.isEabProvisionedOnDevice()); - verify(mITelephony, times(1)).getRcsProvisioningStatusForCapability( - anyInt(), - eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(), eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); - clearInvocations(mITelephony); - - // not defined : KEY_RCS_REQUIRES_PROVISIONING_BUNDLE - // defined : KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL - mRcsProvisioningRequired = false; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL, true); - assertEquals(true, imsManager.isEabProvisionedOnDevice()); verify(mITelephony, times(1)).getRcsProvisioningStatusForCapability( anyInt(), eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); - verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(), - eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); clearInvocations(mITelephony); - // not defined : KEY_RCS_REQUIRES_PROVISIONING_BUNDLE - // not defined : KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL mRcsProvisioningRequired = false; - mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL, false); assertEquals(true, imsManager.isEabProvisionedOnDevice()); - verify(mITelephony, never()).getRcsProvisioningStatusForCapability( - anyInt(), - eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE), - eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(), eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)); @@ -566,8 +405,12 @@ public class ImsManagerTest extends ImsTestBase { 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), @@ -597,8 +440,12 @@ public class ImsManagerTest extends ImsTestBase { 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), 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 new file mode 100644 index 00000000..c977a080 --- /dev/null +++ b/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfoTest.java @@ -0,0 +1,149 @@ +/* + * 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/PublishProcessorTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishProcessorTest.java index f632ca5b..4e8cdfdc 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,6 +17,7 @@ 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; @@ -25,6 +26,7 @@ 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; @@ -58,6 +60,20 @@ public class PublishProcessorTest extends ImsTestBase { 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(); @@ -254,7 +270,7 @@ public class PublishProcessorTest extends ImsTestBase { } private PublishProcessor getPublishProcessor() { - PublishProcessor publishProcessor = new PublishProcessor(mContext, mSub, + PublishProcessor publishProcessor = new TestPublishProcessor(mContext, mSub, mDeviceCapabilities, mPublishCtrlCallback, mUceStatsWriter); publishProcessor.setProcessorState(mProcessorState); publishProcessor.onRcsConnected(mRcsFeatureManager); |