diff options
author | Brad Ebinger <breadley@google.com> | 2020-01-07 16:55:15 -0800 |
---|---|---|
committer | Brad Ebinger <breadley@google.com> | 2020-01-13 13:39:14 -0800 |
commit | 489de20610d73daa45db625934148d54ae564a36 (patch) | |
tree | 975d529c77cfa5b43fadff5919f661c5989c60b9 | |
parent | b437fbd4ab51f82781e19768796215262e15f533 (diff) | |
download | ims-489de20610d73daa45db625934148d54ae564a36.tar.gz |
Use @SystemApi methods to interact with telephony
As part of the Telephony mainline effort, remove @hide dependencies
on telephony in RCS:
1) Use ImsMmTelManager/ProvisioningManager for querying configs.
2) Expose UCE APIs that are needed so far.
3) Use @SystemApi versions of SubscriptionManager/TelephonyManager APIs
4) In PresencePolling app, track default subscription as active
SIM for capability polling (since it doesnt support MSIM yet).
Bug: 147319232
Test: atest CtsTelephonyTestCases; manuallay add contacts, check publish
Merged-In: Ia9f1e8a94896a11201dbd66344fc1caf0589ffc7
Change-Id: Ia9f1e8a94896a11201dbd66344fc1caf0589ffc7
10 files changed, 496 insertions, 427 deletions
diff --git a/rcs/presencepolling/Android.bp b/rcs/presencepolling/Android.bp index 0d4607f..dfe9f68 100644 --- a/rcs/presencepolling/Android.bp +++ b/rcs/presencepolling/Android.bp @@ -27,10 +27,6 @@ java_defaults { name: "presence_polling_defaults", srcs: ["src/**/*.java"], - libs: [ - "ims-common", - "telephony-common", - ], static_libs: ["com.android.ims.rcsmanager"], platform_apis: true, certificate: "platform", diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java b/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java index 6dfa651..9317f4a 100644 --- a/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java +++ b/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java @@ -35,7 +35,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.Cursor; -import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; @@ -44,21 +43,15 @@ import android.os.SystemClock; import android.telephony.PhoneNumberUtils; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.telephony.ims.ImsException; +import android.telephony.ims.ProvisioningManager; import android.text.format.TimeMigrationUtils; import android.text.TextUtils; -import android.content.ComponentName; - -import com.android.ims.ImsConfig; -import com.android.ims.ImsException; -import com.android.ims.ImsManager; -import com.android.internal.telephony.IccCardConstants; -import com.android.internal.telephony.TelephonyIntents; import com.android.ims.RcsException; import com.android.ims.RcsManager; import com.android.ims.RcsPresence; import com.android.ims.RcsPresence.PublishState; -import com.android.ims.RcsPresenceInfo; import com.android.ims.internal.ContactNumberUtils; import com.android.ims.internal.Logger; @@ -76,11 +69,12 @@ public class CapabilityPolling { public static final int ACTION_POLLING_NORMAL = 0; public static final int ACTION_POLLING_NEW_CONTACTS = 1; + public static final int DELAY_REGISTER_CALLBACK_MS = 5000; + private long mCapabilityPollInterval = 604800000L; private long mMinCapabilityPollInterval = 60480000L; private long mCapabilityCacheExpiration = 7776000000L; private long mNextPollingTimeStamp = 0L; - private final Object mScheduleSyncObj = new Object(); private boolean mInitialized = false; private AlarmManager mAlarmManager = null; @@ -88,6 +82,7 @@ public class CapabilityPolling { private boolean mStackAvailable = false; private int mPublished = -1; private int mProvisioned = -1; + private int mDefaultSubId; private HandlerThread mDiscoveryThread; private Handler mDiscoveryHandler; @@ -110,29 +105,42 @@ public class CapabilityPolling { RcsPresence.EXTRA_PUBLISH_STATE, RcsPresence.PublishState.PUBLISH_STATE_NOT_PUBLISHED); enqueuePublishStateChanged(state); - } else if (ImsConfig.ACTION_IMS_CONFIG_CHANGED.equals(action)) { - int item = intent.getIntExtra(ImsConfig.EXTRA_CHANGED_ITEM, -1); - if ((ImsConfig.ConfigConstants.CAPABILITIES_POLL_INTERVAL == item) || - (ImsConfig.ConfigConstants.CAPABILITIES_CACHE_EXPIRATION == item)) { - enqueueSettingsChanged(); - } else if ((ImsConfig.ConfigConstants.VLT_SETTING_ENABLED == item) || - (ImsConfig.ConfigConstants.LVC_SETTING_ENABLED == item) || - (ImsConfig.ConfigConstants.EAB_SETTING_ENABLED == item)) { - enqueueProvisionStateChanged(); - } - } else if(TelephonyIntents.ACTION_SIM_STATE_CHANGED.equalsIgnoreCase(action)) { - String stateExtra = intent.getStringExtra( - IccCardConstants.INTENT_KEY_ICC_STATE); - logger.print("SIM_STATE_CHANGED: " + stateExtra); - if (IccCardConstants.INTENT_VALUE_ICC_LOADED.equalsIgnoreCase(stateExtra)) { + } else if(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED.equalsIgnoreCase(action)) { + int stateExtra = intent.getIntExtra(TelephonyManager.EXTRA_SIM_STATE, + TelephonyManager.SIM_STATE_ABSENT); + int subId = intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, + SubscriptionManager.INVALID_SUBSCRIPTION_ID); + logger.print("SIM_CARD_STATE_CHANGED: " + stateExtra); + if (SubscriptionManager.isValidSubscriptionId(subId) && + (stateExtra == TelephonyManager.SIM_STATE_PRESENT)) { enqueueSimLoaded(); } + } else if (SubscriptionManager.ACTION_DEFAULT_SUBSCRIPTION_CHANGED + .equalsIgnoreCase(action)) { + enqueueTryRegisterConfigCallback(); } else { logger.debug("No interest in this intent: " + action); } } }; + private ProvisioningManager.Callback mProvisioningManagerCallback = + new ProvisioningManager.Callback() { + @Override + public void onProvisioningIntChanged(int item, int value) { + if ((ProvisioningManager.KEY_RCS_CAPABILITIES_POLL_INTERVAL_SEC == item) || + (ProvisioningManager.KEY_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC == item)) { + enqueueSettingsChanged(); + } else if ((ProvisioningManager.KEY_VOLTE_PROVISIONING_STATUS == item) || + (ProvisioningManager.KEY_VT_PROVISIONING_STATUS == item) || + (ProvisioningManager.KEY_EAB_PROVISIONING_STATUS == item)) { + enqueueProvisionStateChanged(); + } + } + }; + + private Runnable mRegisterCallbackRunnable = this::updateProvisioningManagerRegistration; + private static CapabilityPolling sInstance = null; public static synchronized CapabilityPolling getInstance(Context context) { if ((sInstance == null) && (context != null)) { @@ -144,6 +152,7 @@ public class CapabilityPolling { private CapabilityPolling(Context context) { mContext = context; + PresenceSetting.init(mContext); ContactNumberUtils.getDefault().setContext(mContext); PresencePreferences.getInstance().setContext(mContext); @@ -171,8 +180,6 @@ public class CapabilityPolling { if (mInitialized) { return; } - - PresenceSetting.init(mContext); long capabilityPollInterval = PresenceSetting.getCapabilityPollInterval(); logger.print("getCapabilityPollInterval: " + capabilityPollInterval); if (capabilityPollInterval == -1) { @@ -226,8 +233,10 @@ public class CapabilityPolling { mDiscoveryThread = new HandlerThread("Presence-DiscoveryThread"); mDiscoveryThread.start(); mDiscoveryHandler = new Handler(mDiscoveryThread.getLooper(), mDiscoveryCallback); + mDefaultSubId = PresenceSetting.getDefaultSubscriptionId(); registerForBroadcasts(); + mRegisterCallbackRunnable.run(); if (isPollingReady()) { schedulePolling(5 * 1000, ACTION_POLLING_NORMAL); @@ -239,6 +248,12 @@ public class CapabilityPolling { clearPollingTasks(); mContext.unregisterReceiver(mReceiver); mDiscoveryThread.quit(); + + if (SubscriptionManager.isValidSubscriptionId(mDefaultSubId)) { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(mDefaultSubId); + pm.unregisterProvisioningChangedCallback(mProvisioningManagerCallback); + } + mDefaultSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; } private void registerForBroadcasts() { @@ -247,8 +262,8 @@ public class CapabilityPolling { intentFilter.addAction(RcsManager.ACTION_RCS_SERVICE_UNAVAILABLE); intentFilter.addAction(RcsManager.ACTION_RCS_SERVICE_DIED); intentFilter.addAction(RcsPresence.ACTION_PUBLISH_STATE_CHANGED); - intentFilter.addAction(ImsConfig.ACTION_IMS_CONFIG_CHANGED); - intentFilter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); + intentFilter.addAction(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED); + intentFilter.addAction(SubscriptionManager.ACTION_DEFAULT_SUBSCRIPTION_CHANGED); mContext.registerReceiver(mReceiver, intentFilter); } @@ -273,20 +288,15 @@ public class CapabilityPolling { } if (mProvisioned == -1) { - ImsManager imsManager = ImsManager.getInstance(mContext, - SubscriptionManager.getDefaultVoicePhoneId()); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - mProvisioned = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.EAB_SETTING_ENABLED); - logger.print("isPollingReady, mProvisioned: " + mProvisioned); - } - } catch (ImsException ex) { - logger.warn("ImsConfig.getEabProvisioned failed, exception: " + ex); - mProvisioned = -1; - } + try { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId( + SubscriptionManager.getDefaultVoiceSubscriptionId()); + mProvisioned = pm.getProvisioningIntValue( + ProvisioningManager.KEY_EAB_PROVISIONING_STATUS); + } catch (Exception e) { + logger.warn("isPollingReady, couldn't get ProvisioningManager, exception=" + + e.getMessage()); + mProvisioned = -1; } } logger.print("isPollingReady, mProvisioned: " + mProvisioned + @@ -332,42 +342,22 @@ public class CapabilityPolling { } private void provisionStateChanged() { - ImsManager imsManager = ImsManager.getInstance(mContext, - SubscriptionManager.getDefaultVoicePhoneId()); - if (imsManager == null) { - return; - } - - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig == null) { - return; - } - boolean volteProvision = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.VLT_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - boolean vtProvision = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.LVC_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - boolean eabProvision = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.EAB_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - logger.print("Provision state changed, VolteProvision: " - + volteProvision + ", vtProvision: " + vtProvision - + ", eabProvision: " + eabProvision); - - if ((mProvisioned == 1) && !eabProvision) { - logger.print("EAB Provision is disabled, clear all capabilities!"); - if (mEABContactManager != null) { - mEABContactManager.updateAllCapabilityToUnknown(); - } + boolean volteProvisioned = PresenceSetting.getVoLteProvisioningConfig() == + ProvisioningManager.PROVISIONING_VALUE_ENABLED; + boolean vtProvisioned = PresenceSetting.getVtProvisioningConfig() == + ProvisioningManager.PROVISIONING_VALUE_ENABLED; + boolean eabProvisioned = PresenceSetting.getEabProvisioningConfig() == + ProvisioningManager.PROVISIONING_VALUE_ENABLED; + logger.print("Provision state changed, VolteProvision: " + + volteProvisioned + ", vtProvision: " + vtProvisioned + + ", eabProvision: " + eabProvisioned); + if ((mProvisioned == 1) && !eabProvisioned) { + logger.print("EAB Provision is disabled, clear all capabilities!"); + if (mEABContactManager != null) { + mEABContactManager.updateAllCapabilityToUnknown(); } - mProvisioned = eabProvision ? 1 : 0; - } catch (ImsException ex) { - logger.warn("ImsConfig.getEabProvisioned failed, exception: " + ex); - mProvisioned = -1; - return; } + mProvisioned = eabProvisioned ? 1 : 0; if (isPollingReady()) { schedulePolling(0, ACTION_POLLING_NORMAL); @@ -718,6 +708,12 @@ public class CapabilityPolling { mDiscoveryHandler.obtainMessage(MSG_VERIFY_POLLING_RESULT, counts, -1).sendToTarget(); } + private void enqueueTryRegisterConfigCallback() { + mContext.getMainThreadHandler().removeCallbacks(mRegisterCallbackRunnable); + mContext.getMainThreadHandler().postDelayed(mRegisterCallbackRunnable, + DELAY_REGISTER_CALLBACK_MS); + } + private Handler.Callback mDiscoveryCallback = new Handler.Callback() { @Override public boolean handleMessage(Message msg) { @@ -746,7 +742,7 @@ public class CapabilityPolling { } }; - private void onSimLoaded() { + private void setDefaultSubscriberIds() { PresencePreferences pref = PresencePreferences.getInstance(); if (pref == null) { return; @@ -782,13 +778,51 @@ public class CapabilityPolling { logger.print("Remove presence cache for Sim card changed!"); pref.setLine1Number(""); pref.setSubscriberId(""); + } + + private void onSimLoaded() { + // loading a new SIM may not change defaults. Trigger possible change of default. + enqueueTryRegisterConfigCallback(); + } + // Track the default subscription (the closest we can get to MSIM). + // call from main thread only. + private void updateProvisioningManagerRegistration() { + int defaultSubId = PresenceSetting.getDefaultSubscriptionId(); + if (!SubscriptionManager.isValidSubscriptionId(defaultSubId)) { + return; + } + if (mDefaultSubId == defaultSubId) { + return; + } + // unregister old default first + if (SubscriptionManager.isValidSubscriptionId(mDefaultSubId)) { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(mDefaultSubId); + pm.unregisterProvisioningChangedCallback(mProvisioningManagerCallback); + } + // register new default + mDefaultSubId = defaultSubId; + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(mDefaultSubId); + try { + pm.registerProvisioningChangedCallback(mContext.getMainExecutor(), + mProvisioningManagerCallback); + } catch (ImsException e) { + if (e.getCode() == ImsException.CODE_ERROR_SERVICE_UNAVAILABLE) { + enqueueTryRegisterConfigCallback(); + return; + } + } + // Clear defaults and recalculate. + setDefaultSubscriberIds(); if (mEABContactManager != null) { mEABContactManager.updateAllCapabilityToUnknown(); } + mProvisioned = -1; + enqueueSettingsChanged(); + // load settings for new default. + enqueueProvisionStateChanged(); } - private static final int DEFAULT_SUBSCRIPTION = 1; private String getLine1Number() { if (mContext == null) { return null; @@ -800,16 +834,13 @@ public class CapabilityPolling { return null; } - String mdn = null; - if (TelephonyManager.getDefault().isMultiSimEnabled()) { - int subId = SubscriptionManager.getDefaultDataSubscriptionId(); - if (!SubscriptionManager.isValidSubscriptionId(subId)) { - subId = DEFAULT_SUBSCRIPTION; - } - mdn = telephony.getLine1Number(subId); - } else { - mdn = telephony.getLine1Number(); + int subId = PresenceSetting.getDefaultSubscriptionId(); + if (!SubscriptionManager.isValidSubscriptionId(subId)) { + // no valid subscriptions available. + return null; } + telephony = telephony.createForSubscriptionId(subId); + String mdn = telephony.getLine1Number(); if ((mdn == null) || (mdn.length() == 0) || mdn.startsWith("00000")) { return null; @@ -830,16 +861,12 @@ public class CapabilityPolling { return null; } - String subscriberId = null; - if (TelephonyManager.getDefault().isMultiSimEnabled()) { - int subId = SubscriptionManager.getDefaultDataSubscriptionId(); - if (!SubscriptionManager.isValidSubscriptionId(subId)) { - subId = DEFAULT_SUBSCRIPTION; - } - subscriberId = telephony.getSubscriberId(subId); - } else { - subscriberId = telephony.getSubscriberId(); + int subId = PresenceSetting.getDefaultSubscriptionId(); + if (!SubscriptionManager.isValidSubscriptionId(subId)) { + return null; } + telephony.createForSubscriptionId(subId); + String subscriberId = telephony.getSubscriberId(subId); logger.print("getSubscriberId: " + subscriberId); return subscriberId; diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/EABService.java b/rcs/presencepolling/src/com/android/service/ims/presence/EABService.java index 0f659be..65ca1d4 100644 --- a/rcs/presencepolling/src/com/android/service/ims/presence/EABService.java +++ b/rcs/presencepolling/src/com/android/service/ims/presence/EABService.java @@ -47,16 +47,10 @@ import android.os.Looper; import android.os.Message; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.telephony.PhoneNumberUtils; import android.text.TextUtils; -import android.telephony.SubscriptionManager; import com.android.ims.internal.EABContract; -import com.android.ims.ImsConfig; -import com.android.ims.ImsManager; -import com.android.ims.ImsException; - import com.android.ims.RcsManager; import com.android.ims.RcsPresence; import com.android.ims.RcsException; @@ -1096,45 +1090,4 @@ public class EABService extends Service { EABDbUtil.deleteContactsFromEabDb(mContext, contactListToDelete); } - - private boolean isRcsProvisioned(){ - boolean isVoLTEProvisioned = false; - boolean isLvcProvisioned = false; - boolean isEabProvisioned = false; - ImsManager imsManager = null; - ImsConfig imsConfig = null; - - // Get instance of imsManagr. - imsManager = ImsManager.getInstance(mContext, - SubscriptionManager.getDefaultVoiceSubscriptionId()); - try { - imsConfig = imsManager.getConfigInterface(); - logger.debug("imsConfig initialized."); - } catch (Exception e) { - logger.error("getConfigInterface() exception:", e); - imsConfig = null; - } - - if (null != imsConfig) { - try { - isVoLTEProvisioned = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.VLT_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - isLvcProvisioned = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.LVC_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - isEabProvisioned = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.EAB_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - } catch (ImsException e) { - logger.error("ImsException in isRcsProvisioned() : ", e); - } - } else { - logger.debug("isRcsProvisioned - imsConfig is null"); - } - logger.debug("isVoLTEProvisioned : " + isVoLTEProvisioned + " isLvcProvisioned : " + - isLvcProvisioned - + " isEabProvisioned : " + isEabProvisioned); - return (isVoLTEProvisioned && isLvcProvisioned && isEabProvisioned); - } } diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PresenceSetting.java b/rcs/presencepolling/src/com/android/service/ims/presence/PresenceSetting.java index 9452237..e42e966 100644 --- a/rcs/presencepolling/src/com/android/service/ims/presence/PresenceSetting.java +++ b/rcs/presencepolling/src/com/android/service/ims/presence/PresenceSetting.java @@ -29,17 +29,33 @@ package com.android.service.ims.presence; import android.content.Context; - -import com.android.ims.ImsConfig; -import com.android.ims.ImsException; -import com.android.ims.ImsManager; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.ims.ProvisioningManager; import com.android.ims.internal.Logger; +import java.util.List; + public class PresenceSetting { private static Logger logger = Logger.getLogger("PresenceSetting"); private static Context sContext = null; + // Default result for getCapabilityPollInterval in seconds, equates to 7 days. + private static final long DEFAULT_CAPABILITY_POLL_INTERVAL_SEC = 604800L; + // Default result for getCapabilityCacheExpiration in seconds, equates to 90 days. + private static final long DEFAULT_CAPABILITY_CACHE_EXPIRATION_SEC = 604800L; + // Default result for getPublishTimer in seconds, equates to 20 minutes. + private static final int DEFAULT_PUBLISH_TIMER_SEC = 1200; + // Default result for getPublishTimerExtended in seconds, equates to 1 day. + private static final int DEFAULT_PUBLISH_TIMER_EXTENDED_SEC = 86400; + // Default result for getMaxNumberOfEntriesInRequestContainedList, 100 entries. + private static final int DEFAULT_NUM_ENTRIES_IN_RCL = 100; + // Default result for getCapabilityPollListSubscriptionExpiration in seconds, equates to 30 + // seconds. + private static final int DEFAULT_CAPABILITY_POLL_LIST_SUB_EXPIRATION_SEC = 30; + + public static void init(Context context) { sContext = context; } @@ -47,21 +63,20 @@ public class PresenceSetting { public static long getCapabilityPollInterval() { long value = -1; if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.CAPABILITIES_POLL_INTERVAL); - logger.debug("Read ImsConfig_CapabilityPollInterval: " + value); - } - } catch (ImsException ex) { - } + int defaultSubId = getDefaultSubscriptionId(); + if (!SubscriptionManager.isValidSubscriptionId(defaultSubId)) { + return DEFAULT_CAPABILITY_POLL_INTERVAL_SEC; + } + try { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(defaultSubId); + value = pm.getProvisioningIntValue( + ProvisioningManager.KEY_RCS_CAPABILITIES_POLL_INTERVAL_SEC); + } catch (Exception ex) { + logger.warn("getCapabilityPollInterval, exception = " + ex.getMessage()); } } if (value <= 0) { - value = 604800L; + value = DEFAULT_CAPABILITY_POLL_INTERVAL_SEC; logger.error("Failed to get CapabilityPollInterval, the default: " + value); } return value; @@ -70,21 +85,20 @@ public class PresenceSetting { public static long getCapabilityCacheExpiration() { long value = -1; if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.CAPABILITIES_CACHE_EXPIRATION); - logger.debug("Read ImsConfig_CapabilityCacheExpiration: " + value); - } - } catch (ImsException ex) { - } + int defaultSubId = getDefaultSubscriptionId(); + if (!SubscriptionManager.isValidSubscriptionId(defaultSubId)) { + return DEFAULT_CAPABILITY_CACHE_EXPIRATION_SEC; + } + try { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(defaultSubId); + value = pm.getProvisioningIntValue( + ProvisioningManager.KEY_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC); + } catch (Exception ex) { + logger.warn("getCapabilityCacheExpiration, exception = " + ex.getMessage()); } } if (value <= 0) { - value = 7776000L; + value = DEFAULT_CAPABILITY_CACHE_EXPIRATION_SEC; logger.error("Failed to get CapabilityCacheExpiration, the default: " + value); } return value; @@ -93,21 +107,19 @@ public class PresenceSetting { public static int getPublishTimer() { int value = -1; if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.PUBLISH_TIMER); - logger.debug("Read ImsConfig_PublishTimer: " + value); - } - } catch (ImsException ex) { - } + int defaultSubId = getDefaultSubscriptionId(); + if (!SubscriptionManager.isValidSubscriptionId(defaultSubId)) { + return DEFAULT_PUBLISH_TIMER_SEC; + } + try { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(defaultSubId); + value = pm.getProvisioningIntValue(ProvisioningManager.KEY_RCS_PUBLISH_TIMER_SEC); + } catch (Exception ex) { + logger.warn("getPublishTimer, exception = " + ex.getMessage()); } } if (value <= 0) { - value = (int)1200; + value = DEFAULT_PUBLISH_TIMER_SEC; logger.error("Failed to get PublishTimer, the default: " + value); } return value; @@ -116,21 +128,20 @@ public class PresenceSetting { public static int getPublishTimerExtended() { int value = -1; if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.PUBLISH_TIMER_EXTENDED); - logger.debug("Read ImsConfig_PublishTimerExtended: " + value); - } - } catch (ImsException ex) { - } + int defaultSubId = getDefaultSubscriptionId(); + if (!SubscriptionManager.isValidSubscriptionId(defaultSubId)) { + return DEFAULT_PUBLISH_TIMER_EXTENDED_SEC; + } + try { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(defaultSubId); + value = pm.getProvisioningIntValue( + ProvisioningManager.KEY_RCS_PUBLISH_TIMER_EXTENDED_SEC); + } catch (Exception ex) { + logger.warn("getPublishTimerExtended, exception = " + ex.getMessage()); } } if (value <= 0) { - value = (int)86400; + value = DEFAULT_PUBLISH_TIMER_EXTENDED_SEC; logger.error("Failed to get PublishTimerExtended, the default: " + value); } return value; @@ -139,21 +150,21 @@ public class PresenceSetting { public static int getMaxNumberOfEntriesInRequestContainedList() { int value = -1; if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.MAX_NUMENTRIES_IN_RCL); - logger.debug("Read ImsConfig_MaxNumEntriesInRCL: " + value); - } - } catch (ImsException ex) { - } + int defaultSubId = getDefaultSubscriptionId(); + if (!SubscriptionManager.isValidSubscriptionId(defaultSubId)) { + return DEFAULT_NUM_ENTRIES_IN_RCL; + } + try { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(defaultSubId); + value = pm.getProvisioningIntValue( + ProvisioningManager.KEY_RCS_MAX_NUM_ENTRIES_IN_RCL); + } catch (Exception ex) { + logger.warn("getMaxNumberOfEntriesInRequestContainedList, exception = " + + ex.getMessage()); } } if (value <= 0) { - value = (int)100; + value = DEFAULT_NUM_ENTRIES_IN_RCL; logger.error("Failed to get MaxNumEntriesInRCL, the default: " + value); } return value; @@ -162,24 +173,104 @@ public class PresenceSetting { public static int getCapabilityPollListSubscriptionExpiration() { int value = -1; if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.CAPAB_POLL_LIST_SUB_EXP); - logger.debug("Read ImsConfig_CapabPollListSubExp: " + value); - } - } catch (ImsException ex) { - } + int defaultSubId = getDefaultSubscriptionId(); + if (!SubscriptionManager.isValidSubscriptionId(defaultSubId)) { + return DEFAULT_CAPABILITY_POLL_LIST_SUB_EXPIRATION_SEC; + } + try { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(defaultSubId); + value = pm.getProvisioningIntValue( + ProvisioningManager.KEY_RCS_CAPABILITY_POLL_LIST_SUB_EXP_SEC); + } catch (Exception ex) { + logger.warn("getMaxNumberOfEntriesInRequestContainedList, exception = " + + ex.getMessage()); } } if (value <= 0) { - value = (int)30; + value = DEFAULT_CAPABILITY_POLL_LIST_SUB_EXPIRATION_SEC; logger.error("Failed to get CapabPollListSubExp, the default: " + value); } return value; } + + /** + * Get VoLte provisioning configuration for the default voice subscription. + * @return {@link ProvisioningManager#PROVISIONING_VALUE_ENABLED} if VoLTE is provisioned, + * {@link ProvisioningManager#PROVISIONING_VALUE_DISABLED} if VoLTE is not provisioned, and + * {@link ProvisioningManager#PROVISIONING_RESULT_UNKNOWN} if there is no value set. + */ + public static int getVoLteProvisioningConfig() { + try { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId( + SubscriptionManager.getDefaultVoiceSubscriptionId()); + return pm.getProvisioningIntValue( + ProvisioningManager.KEY_VOLTE_PROVISIONING_STATUS); + } catch (Exception e) { + logger.warn("getVoLteProvisioningConfig, exception accessing ProvisioningManager, " + + "exception=" + e.getMessage()); + return ProvisioningManager.PROVISIONING_RESULT_UNKNOWN; + } + } + + /** + * Get VT provisioning configuration for the default voice subscription. + * @return {@link ProvisioningManager#PROVISIONING_VALUE_ENABLED} if VT is provisioned, + * {@link ProvisioningManager#PROVISIONING_VALUE_DISABLED} if VT is not provisioned, nd + * * {@link ProvisioningManager#PROVISIONING_RESULT_UNKNOWN} if there is no value set. + */ + public static int getVtProvisioningConfig() { + try { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId( + SubscriptionManager.getDefaultVoiceSubscriptionId()); + return pm.getProvisioningIntValue( + ProvisioningManager.KEY_VT_PROVISIONING_STATUS); + } catch (Exception e) { + logger.warn("getVtProvisioningConfig, exception accessing ProvisioningManager, " + + "exception=" + e.getMessage()); + return ProvisioningManager.PROVISIONING_RESULT_UNKNOWN; + } + } + + /** + * Get EAB provisioning configuration for the default voice subscription. + * @return {@link ProvisioningManager#PROVISIONING_VALUE_ENABLED} if EAB is provisioned, + * {@link ProvisioningManager#PROVISIONING_VALUE_DISABLED} if EAB is not provisioned, nd + * * {@link ProvisioningManager#PROVISIONING_RESULT_UNKNOWN} if there is no value set. + */ + public static int getEabProvisioningConfig() { + try { + ProvisioningManager pm = ProvisioningManager.createForSubscriptionId( + SubscriptionManager.getDefaultVoiceSubscriptionId()); + return pm.getProvisioningIntValue( + ProvisioningManager.KEY_EAB_PROVISIONING_STATUS); + } catch (Exception e) { + logger.warn("getEabProvisioningConfig, exception accessing ProvisioningManager, " + + "exception=" + e.getMessage()); + return ProvisioningManager.PROVISIONING_RESULT_UNKNOWN; + } + } + + public static int getDefaultSubscriptionId() { + SubscriptionManager sm = sContext.getSystemService(SubscriptionManager.class); + if (sm == null) return SubscriptionManager.INVALID_SUBSCRIPTION_ID; + List<SubscriptionInfo> infos = sm.getActiveSubscriptionInfoList(); + if (infos == null || infos.isEmpty()) { + // There are no active subscriptions right now. + return SubscriptionManager.INVALID_SUBSCRIPTION_ID; + } + // This code does not support MSIM unfortunately, so only provide presence on the default + // subscription that the user chose. + int defaultSub = SubscriptionManager.getDefaultSubscriptionId(); + // If the user has no default set, just pick the first as backup. + if (defaultSub == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + for (SubscriptionInfo info : infos) { + if (!info.isOpportunistic()) { + defaultSub = info.getSubscriptionId(); + break; + } + } + } + return defaultSub; + } } diff --git a/rcs/rcsservice/Android.bp b/rcs/rcsservice/Android.bp index bb23348..775275b 100644 --- a/rcs/rcsservice/Android.bp +++ b/rcs/rcsservice/Android.bp @@ -38,11 +38,7 @@ java_library { "src/com/android/service/ims/Task.java", "src/com/android/service/ims/TaskManager.java", ":rcsmanager-utils" - ], - libs: [ - "telephony-common", - "ims-common", - ], + ] } android_app { diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsService.java b/rcs/rcsservice/src/com/android/service/ims/RcsService.java index f80e2e5..4bbc316 100644 --- a/rcs/rcsservice/src/com/android/service/ims/RcsService.java +++ b/rcs/rcsservice/src/com/android/service/ims/RcsService.java @@ -39,8 +39,8 @@ import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; import android.provider.Settings; +import android.provider.Telephony; import android.telephony.AccessNetworkConstants; -import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.ims.ImsException; import android.telephony.ims.ImsMmTelManager; @@ -203,8 +203,8 @@ public class RcsService extends Service { false, mObserver); mSiminfoSettingObserver = new SimInfoContentObserver(); - getContentResolver().registerContentObserver( - SubscriptionManager.CONTENT_URI, false, mSiminfoSettingObserver); + getContentResolver().registerContentObserver(Telephony.SimInfo.CONTENT_URI, false, + mSiminfoSettingObserver); mRetryHandler = new Handler(Looper.getMainLooper()); registerSubscriptionChangedListener(); @@ -229,54 +229,39 @@ public class RcsService extends Service { logger.warn("handleSubscriptionsChanged: SubscriptionManager is null!"); return; } - List<SubscriptionInfo> infos = sm.getActiveSubscriptionInfoList(); - if (infos == null || infos.isEmpty()) { - // There are no active subscriptions right now. + int defaultVoiceSub = RcsSettingUtils.getDefaultSubscriptionId(this); + if (defaultVoiceSub == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { handleImsServiceDown(); - } else { - int defaultVoiceSub = SubscriptionManager.getDefaultVoiceSubscriptionId(); - // Get default voice id and then try to register for IMS callbacks - if (defaultVoiceSub == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - for (SubscriptionInfo info : infos) { - if (!info.isOpportunistic()) { - defaultVoiceSub = info.getSubscriptionId(); - break; - } - } - } - if (defaultVoiceSub == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - handleImsServiceDown(); + return; + } + + ImsMmTelManager mIms = ImsMmTelManager.createForSubscriptionId(defaultVoiceSub); + try { + if (defaultVoiceSub == mAssociatedSubscription) { + // Don't register duplicate callbacks for the same subscription. return; } - - ImsMmTelManager mIms = ImsMmTelManager.createForSubscriptionId(defaultVoiceSub); - try { - if (defaultVoiceSub == mAssociatedSubscription) { - // Don't register duplicate callbacks for the same subscription. - return; - } - if (mAssociatedSubscription != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - // Get rid of any existing registrations. - ImsMmTelManager mOldIms = ImsMmTelManager.createForSubscriptionId( - mAssociatedSubscription); - mOldIms.unregisterImsRegistrationCallback(mImsRegistrationCallback); - mOldIms.unregisterMmTelCapabilityCallback(mCapabilityCallback); - logger.print("callbacks unregistered for sub " + mAssociatedSubscription); - } - // move over registrations. - mIms.registerImsRegistrationCallback(getMainExecutor(), mImsRegistrationCallback); - mIms.registerMmTelCapabilityCallback(getMainExecutor(), mCapabilityCallback); - mAssociatedSubscription = defaultVoiceSub; - logger.print("callbacks registered for sub " + mAssociatedSubscription); - handleImsServiceUp(); - } catch (ImsException e) { - logger.info("Couldn't register callbacks for " + defaultVoiceSub + ": " - + e.getMessage()); - if (e.getCode() == ImsException.CODE_ERROR_SERVICE_UNAVAILABLE) { - // IMS temporarily unavailable. Retry after a few seconds. - mRetryHandler.removeCallbacks(mRegisterCallbacks); - mRetryHandler.postDelayed(mRegisterCallbacks, IMS_SERVICE_RETRY_TIMEOUT_MS); - } + if (mAssociatedSubscription != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + // Get rid of any existing registrations. + ImsMmTelManager mOldIms = ImsMmTelManager.createForSubscriptionId( + mAssociatedSubscription); + mOldIms.unregisterImsRegistrationCallback(mImsRegistrationCallback); + mOldIms.unregisterMmTelCapabilityCallback(mCapabilityCallback); + logger.print("callbacks unregistered for sub " + mAssociatedSubscription); + } + // move over registrations. + mIms.registerImsRegistrationCallback(getMainExecutor(), mImsRegistrationCallback); + mIms.registerMmTelCapabilityCallback(getMainExecutor(), mCapabilityCallback); + mAssociatedSubscription = defaultVoiceSub; + logger.print("callbacks registered for sub " + mAssociatedSubscription); + handleImsServiceUp(); + } catch (ImsException e) { + logger.info("Couldn't register callbacks for " + defaultVoiceSub + ": " + + e.getMessage()); + if (e.getCode() == ImsException.CODE_ERROR_SERVICE_UNAVAILABLE) { + // IMS temporarily unavailable. Retry after a few seconds. + mRetryHandler.removeCallbacks(mRegisterCallbacks); + mRetryHandler.postDelayed(mRegisterCallbacks, IMS_SERVICE_RETRY_TIMEOUT_MS); } } } diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java b/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java index f5f893e..9c867d9 100644 --- a/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java +++ b/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java @@ -30,9 +30,12 @@ package com.android.service.ims; import android.content.Context; import android.os.PersistableBundle; +import android.telephony.AccessNetworkConstants; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import android.telephony.ims.ImsException; +import android.telephony.ims.ImsMmTelManager; import android.telephony.ims.ProvisioningManager; import android.telephony.ims.feature.MmTelFeature; import android.telephony.ims.stub.ImsRegistrationImplBase; @@ -40,50 +43,37 @@ import android.telephony.ims.stub.ImsRegistrationImplBase; import com.android.ims.internal.Logger; import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; public class RcsSettingUtils { static private Logger logger = Logger.getLogger("RcsSettingUtils"); + private static final int TIMEOUT_GET_CONFIGURATION_MS = 5000; - // Values taken from ImsConfig - Should define in @SystemApi as well. - /** - * SIP T1 timer value in milliseconds. See RFC 3261 for definition. - * Value is in Integer format. - */ - private static final int SIP_T1_TIMER = 7; - /** - * Whether or not capability discovery is provisioned. - */ - private static final int CAPABILITY_DISCOVERY_ENABLED = 17; - /** - * period of time the availability information of a contact is cached on device. - * Value is in Integer format. - */ - private static final int AVAILABILITY_CACHE_EXPIRATION = 19; - /** - * Minimum time between two published messages from the device. - * Value is in Integer format. - */ - private static final int SOURCE_THROTTLE_PUBLISH = 21; - /** - * The Maximum number of MDNs contained in one Request Contained List. - * Value is in Integer format. - */ - private static final int MAX_NUMENTRIES_IN_RCL = 22; - /** - * Expiration timer for subscription of a Request Contained List, used in capability - * polling. - * Value is in Integer format. - */ - private static final int CAPAB_POLL_LIST_SUB_EXP = 23; - /** - * Provisioning status for Enhanced Address Book (EAB) - * Value is in Integer format. - */ - private static final int EAB_SETTING_ENABLED = 25; - /** - * Whether or not mobile data is enabled currently. - */ - private static final int MOBILE_DATA_ENABLED = 29; + // Default number of entries for getMaxNumbersInRCL + private static final int DEFAULT_NUM_ENTRIES_IN_RCL = 100; + // Default for getCapabPollListSubExp in seconds. + private static final int DEFAULT_CAPABILITY_POLL_LIST_SUB_EXPIRATION_SEC = 30; + // Default for getAvailabilityCacheExpiration in seconds. + private static final int DEFAULT_AVAILABILITY_CACHE_EXPIRATION_SEC = 30; + // Default for getPublishThrottle in milliseconds + private static final int DEFAULT_PUBLISH_THROTTLE_MS = 60000; + + public static boolean isVoLteProvisioned(Context context) { + try { + boolean isProvisioned; + ProvisioningManager manager = ProvisioningManager.createForSubscriptionId( + getDefaultSubscriptionId(context)); + isProvisioned = manager.getProvisioningStatusForCapability( + MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, + ImsRegistrationImplBase.REGISTRATION_TECH_LTE); + logger.debug("isVoLteProvisioned=" + isProvisioned); + return isProvisioned; + } catch (Exception e) { + logger.debug("isVoLteProvisioned, exception = " + e.getMessage()); + return false; + } + } public static boolean isVowifiProvisioned(Context context) { try { @@ -136,7 +126,8 @@ public class RcsSettingUtils { } try { ProvisioningManager manager = ProvisioningManager.createForSubscriptionId(subId); - isProvisioned = manager.getProvisioningIntValue(EAB_SETTING_ENABLED) + isProvisioned = manager.getProvisioningIntValue( + ProvisioningManager.KEY_EAB_PROVISIONING_STATUS) == ProvisioningManager.PROVISIONING_VALUE_ENABLED; } catch (Exception e) { logger.debug("isEabProvisioned: exception=" + e.getMessage()); @@ -150,7 +141,7 @@ public class RcsSettingUtils { try { ProvisioningManager manager = ProvisioningManager.createForSubscriptionId( getDefaultSubscriptionId(context)); - sipT1Timer = manager.getProvisioningIntValue(SIP_T1_TIMER); + sipT1Timer = manager.getProvisioningIntValue(ProvisioningManager.KEY_T1_TIMER_VALUE_MS); } catch (Exception e) { // If there is no active subscriptions, this will throw an exception. logger.debug("getSIPT1Timer: exception=" + e.getMessage()); @@ -167,8 +158,9 @@ public class RcsSettingUtils { try { ProvisioningManager manager = ProvisioningManager.createForSubscriptionId( getDefaultSubscriptionId(context)); - capabilityDiscoveryEnabled = manager.getProvisioningIntValue(CAPABILITY_DISCOVERY_ENABLED) - == ProvisioningManager.PROVISIONING_VALUE_ENABLED; + capabilityDiscoveryEnabled = manager.getProvisioningIntValue( + ProvisioningManager.KEY_RCS_CAPABILITY_DISCOVERY_ENABLED) == + ProvisioningManager.PROVISIONING_VALUE_ENABLED; } catch (Exception e) { // If there is no active subscriptions, this will throw an exception. logger.debug("capabilityDiscoveryEnabled: exception=" + e.getMessage()); @@ -181,11 +173,12 @@ public class RcsSettingUtils { * The Maximum number of MDNs contained in one Request Contained List. */ public static int getMaxNumbersInRCL(Context context) { - int maxNumbersInRCL = 100; + int maxNumbersInRCL = DEFAULT_NUM_ENTRIES_IN_RCL; try { ProvisioningManager manager = ProvisioningManager.createForSubscriptionId( getDefaultSubscriptionId(context)); - maxNumbersInRCL = manager.getProvisioningIntValue(MAX_NUMENTRIES_IN_RCL); + maxNumbersInRCL = manager.getProvisioningIntValue( + ProvisioningManager.KEY_RCS_MAX_NUM_ENTRIES_IN_RCL); } catch (Exception e) { // If there is no active subscriptions, this will throw an exception. logger.debug("getMaxNumbersInRCL: exception=" + e.getMessage()); @@ -198,11 +191,12 @@ public class RcsSettingUtils { * Expiration timer for subscription of a Request Contained List, used in capability polling. */ public static int getCapabPollListSubExp(Context context) { - int capabPollListSubExp = 30; + int capabPollListSubExp = DEFAULT_CAPABILITY_POLL_LIST_SUB_EXPIRATION_SEC; try { ProvisioningManager manager = ProvisioningManager.createForSubscriptionId( getDefaultSubscriptionId(context)); - capabPollListSubExp = manager.getProvisioningIntValue(CAPAB_POLL_LIST_SUB_EXP); + capabPollListSubExp = manager.getProvisioningIntValue( + ProvisioningManager.KEY_RCS_CAPABILITY_POLL_LIST_SUB_EXP_SEC); } catch (Exception e) { // If there is no active subscriptions, this will throw an exception. logger.debug("getCapabPollListSubExp: exception=" + e.getMessage()); @@ -215,12 +209,12 @@ public class RcsSettingUtils { * Period of time the availability information of a contact is cached on device. */ public static int getAvailabilityCacheExpiration(Context context) { - int availabilityCacheExpiration = 30; + int availabilityCacheExpiration = DEFAULT_AVAILABILITY_CACHE_EXPIRATION_SEC; try { ProvisioningManager manager = ProvisioningManager.createForSubscriptionId( getDefaultSubscriptionId(context)); availabilityCacheExpiration = manager.getProvisioningIntValue( - AVAILABILITY_CACHE_EXPIRATION); + ProvisioningManager.KEY_RCS_AVAILABILITY_CACHE_EXPIRATION_SEC); } catch (Exception e) { // If there is no active subscriptions, this will throw an exception. logger.debug("getAvailabilityCacheExpiration: exception=" + e.getMessage()); @@ -229,53 +223,119 @@ public class RcsSettingUtils { return availabilityCacheExpiration; } - public static boolean isMobileDataEnabled(Context context) { - boolean mobileDataEnabled = false; + public static int getPublishThrottle(Context context) { + // Default + int publishThrottle = DEFAULT_PUBLISH_THROTTLE_MS; try { ProvisioningManager manager = ProvisioningManager.createForSubscriptionId( getDefaultSubscriptionId(context)); - mobileDataEnabled = manager.getProvisioningIntValue(MOBILE_DATA_ENABLED) - == ProvisioningManager.PROVISIONING_VALUE_ENABLED; + publishThrottle = manager.getProvisioningIntValue( + ProvisioningManager.KEY_RCS_PUBLISH_SOURCE_THROTTLE_MS); } catch (Exception e) { // If there is no active subscriptions, this will throw an exception. - logger.debug("isMobileDataEnabled: exception=" + e.getMessage()); + logger.debug("publishThrottle: exception=" + e.getMessage()); } - logger.debug("mobileDataEnabled=" + mobileDataEnabled); - return mobileDataEnabled; + logger.debug("publishThrottle=" + publishThrottle); + return publishThrottle; } - public static void setMobileDataEnabled(Context context, boolean mobileDataEnabled) { - logger.debug("mobileDataEnabled=" + mobileDataEnabled); + public static boolean isVtEnabledByUser(Context context) { try { - ProvisioningManager manager = ProvisioningManager.createForSubscriptionId( + ImsMmTelManager mmTelManager = ImsMmTelManager.createForSubscriptionId( getDefaultSubscriptionId(context)); - manager.setProvisioningIntValue(MOBILE_DATA_ENABLED, mobileDataEnabled ? - ProvisioningManager.PROVISIONING_VALUE_ENABLED : - ProvisioningManager.PROVISIONING_VALUE_DISABLED); + return mmTelManager.isVtSettingEnabled(); } catch (Exception e) { - // If there is no active subscriptions, this will throw an exception. - logger.debug("mobileDataEnabled: exception=" + e.getMessage()); + logger.warn("isVtEnabledByUser exception = " + e.getMessage()); + return false; } } - public static int getPublishThrottle(Context context) { - // Default - int publishThrottle = 60000; + public static boolean isWfcEnabledByUser(Context context) { try { - ProvisioningManager manager = ProvisioningManager.createForSubscriptionId( + ImsMmTelManager mmTelManager = ImsMmTelManager.createForSubscriptionId( getDefaultSubscriptionId(context)); - publishThrottle = manager.getProvisioningIntValue(SOURCE_THROTTLE_PUBLISH); + return mmTelManager.isVoWiFiSettingEnabled(); } catch (Exception e) { - // If there is no active subscriptions, this will throw an exception. - logger.debug("publishThrottle: exception=" + e.getMessage()); + logger.warn("isWfcEnabledByUser exception = " + e.getMessage()); + return false; + } + } + + public static boolean isAdvancedCallingEnabledByUser(Context context) { + try { + ImsMmTelManager mmTelManager = ImsMmTelManager.createForSubscriptionId( + getDefaultSubscriptionId(context)); + return mmTelManager.isAdvancedCallingSettingEnabled(); + } catch (Exception e) { + logger.warn("isAdvancedCallingEnabledByUser exception = " + e.getMessage()); + return false; + } + } + + public static boolean isVoLteSupported(Context context) { + LinkedBlockingQueue<Boolean> resultQueue = new LinkedBlockingQueue<>(1); + try { + ImsMmTelManager mmTelManager = ImsMmTelManager.createForSubscriptionId( + getDefaultSubscriptionId(context)); + mmTelManager.isSupported(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, + AccessNetworkConstants.TRANSPORT_TYPE_WWAN, Runnable::run, resultQueue::offer); + } catch (ImsException e) { + logger.warn("isVoLteSupported: ImsException = " + e.getMessage()); + return false; + } + try { + Boolean result = resultQueue.poll(TIMEOUT_GET_CONFIGURATION_MS, TimeUnit.MILLISECONDS); + return (result != null) ? result : false; + } catch (InterruptedException e) { + logger.warn("isVoLteSupported, InterruptedException=" + e.getMessage()); + return false; + } + } + + public static boolean isVoWiFiSupported(Context context) { + LinkedBlockingQueue<Boolean> resultQueue = new LinkedBlockingQueue<>(1); + try { + ImsMmTelManager mmTelManager = ImsMmTelManager.createForSubscriptionId( + getDefaultSubscriptionId(context)); + mmTelManager.isSupported(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, + AccessNetworkConstants.TRANSPORT_TYPE_WLAN, Runnable::run, resultQueue::offer); + } catch (ImsException e) { + logger.warn("isVoWiFiSupported: ImsException = " + e.getMessage()); + return false; + } + try { + Boolean result = resultQueue.poll(TIMEOUT_GET_CONFIGURATION_MS, TimeUnit.MILLISECONDS); + return (result != null) ? result : false; + } catch (InterruptedException e) { + logger.warn("isVoWiFiSupported, InterruptedException=" + e.getMessage()); + return false; + } + } + + public static boolean isVtSupported(Context context) { + LinkedBlockingQueue<Boolean> resultQueue = new LinkedBlockingQueue<>(1); + try { + ImsMmTelManager mmTelManager = ImsMmTelManager.createForSubscriptionId( + getDefaultSubscriptionId(context)); + mmTelManager.isSupported(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO, + AccessNetworkConstants.TRANSPORT_TYPE_WWAN, Runnable::run, resultQueue::offer); + } catch (ImsException e) { + logger.warn("isVoWiFiSupported: ImsException = " + e.getMessage()); + return false; + } + try { + Boolean result = resultQueue.poll(TIMEOUT_GET_CONFIGURATION_MS, TimeUnit.MILLISECONDS); + return (result != null) ? result : false; + } catch (InterruptedException e) { + logger.warn("isVtSupported, InterruptedException=" + e.getMessage()); + return false; } - logger.debug("publishThrottle=" + publishThrottle); - return publishThrottle; } - private static int getDefaultSubscriptionId(Context context) { + public static int getDefaultSubscriptionId(Context context) { SubscriptionManager sm = context.getSystemService(SubscriptionManager.class); - List<SubscriptionInfo> infos = sm.getActiveSubscriptionInfoList(); + if (sm == null) return SubscriptionManager.INVALID_SUBSCRIPTION_ID; + List<SubscriptionInfo> infos = sm.getActiveSubscriptionInfoList(); if (infos == null || infos.isEmpty()) { // There are no active subscriptions right now. return SubscriptionManager.INVALID_SUBSCRIPTION_ID; diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java index 9ffcba1..6a82d6b 100644 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java +++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java @@ -31,10 +31,10 @@ package com.android.service.ims.presence; import android.annotation.IntDef; import android.content.Context; import android.content.Intent; +import android.telephony.ims.ImsManager; import com.android.ims.ResultCode; import com.android.ims.internal.Logger; -import com.android.internal.telephony.TelephonyIntents; import com.android.service.ims.Task; import com.android.service.ims.TaskManager; @@ -184,7 +184,7 @@ public class PresenceBase { protected void notifyDm() { logger.debug("notifyDm"); Intent intent = new Intent( - TelephonyIntents.ACTION_FORBIDDEN_NO_SERVICE_AUTHORIZATION); + ImsManager.ACTION_FORBIDDEN_NO_SERVICE_AUTHORIZATION); intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); mContext.sendBroadcast(intent); diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java index 62c5091..3d902b5 100644 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java +++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java @@ -43,17 +43,14 @@ import android.provider.Settings; import android.telecom.PhoneAccount; import android.telecom.TelecomManager; import android.telephony.AccessNetworkConstants; -import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.ims.RcsContactUceCapability; import android.telephony.ims.feature.MmTelFeature; import com.android.ims.ImsConfig; -import com.android.ims.ImsManager; import com.android.ims.ResultCode; import com.android.ims.internal.Logger; import com.android.internal.telephony.IccCardConstants; -import com.android.internal.telephony.Phone; import com.android.internal.telephony.TelephonyIntents; import com.android.service.ims.RcsSettingUtils; import com.android.service.ims.Task; @@ -95,7 +92,7 @@ public class PresencePublication extends PresenceBase { private boolean mGotTriggerFromStack = false; private boolean mDonotRetryUntilPowerCycle = false; private boolean mSimLoaded = false; - private int mPreferredTtyMode = Phone.TTY_MODE_OFF; + private int mPreferredTtyMode = TelecomManager.TTY_MODE_OFF; private boolean mImsRegistered = false; private boolean mVtEnabled = false; @@ -160,19 +157,14 @@ public class PresencePublication extends PresenceBase { mConfigVolteProvisionErrorOnPublishResponse = configVolteProvisionErrorOnPublishResponse; mConfigRcsProvisionErrorOnPublishResponse = configRcsProvisionErrorOnPublishResponse; - mVtEnabled = getImsManager().isVtEnabledByUser(); + mVtEnabled = RcsSettingUtils.isVtEnabledByUser(mContext); mDataEnabled = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.MOBILE_DATA, 1) == 1; - new Thread(() -> { - RcsSettingUtils.setMobileDataEnabled(mContext, mDataEnabled); - }).start(); logger.debug("The current mobile data is: " + (mDataEnabled ? "enabled" : "disabled")); - mPreferredTtyMode = Settings.Secure.getInt( - mContext.getContentResolver(), - Settings.Secure.PREFERRED_TTY_MODE, - Phone.TTY_MODE_OFF); + TelecomManager tm = mContext.getSystemService(TelecomManager.class); + mPreferredTtyMode = tm.getCurrentTtyMode(); logger.debug("The current TTY mode is: " + mPreferredTtyMode); mReceiver = new BroadcastReceiver() { @@ -242,7 +234,6 @@ public class PresencePublication extends PresenceBase { int newPreferredTtyMode = intent.getIntExtra( TelecomManager.EXTRA_TTY_PREFERRED_MODE, TelecomManager.TTY_MODE_OFF); - newPreferredTtyMode = telecomTtyModeToPhoneMode(newPreferredTtyMode); logger.debug("Tty mode changed from " + mPreferredTtyMode + " to " + newPreferredTtyMode); @@ -277,23 +268,22 @@ public class PresencePublication extends PresenceBase { sPresencePublication = this; } - private boolean isIPVoiceSupported(boolean volteAvailable, boolean vtAvailable, - boolean voWifiAvailable, boolean viWifiAvailable) { - ImsManager imsManager = getImsManager(); + private boolean isIPVoiceSupported(boolean volteAvailable, boolean voWifiAvailable) { // volte and vowifi can be enabled separately - if(!imsManager.isVolteEnabledByPlatform() && !imsManager.isWfcEnabledByPlatform()) { + if(!RcsSettingUtils.isVoLteSupported(mContext) && + !RcsSettingUtils.isVoWiFiSupported(mContext)) { logger.print("Disabled by platform, voiceSupported=false"); return false; } - if(!imsManager.isVolteProvisionedOnDevice() && + if(!RcsSettingUtils.isVoLteProvisioned(mContext) && !RcsSettingUtils.isVowifiProvisioned(mContext)) { logger.print("Wasn't provisioned, voiceSupported=false"); return false; } - if(!imsManager.isEnhanced4gLteModeSettingEnabledByUser() && - !imsManager.isWfcEnabledByUser()){ + if(!RcsSettingUtils.isAdvancedCallingEnabledByUser(mContext) && + !RcsSettingUtils.isWfcEnabledByUser(mContext)){ logger.print("User didn't enable volte or wfc, voiceSupported=false"); return false; } @@ -320,24 +310,21 @@ public class PresencePublication extends PresenceBase { return true; } - private boolean isIPVideoSupported(boolean volteAvailable, boolean vtAvailable, - boolean voWifiAvailable, boolean viWifiAvailable) { - ImsManager imsManager = getImsManager(); + private boolean isIPVideoSupported(boolean vtAvailable, boolean viWifiAvailable) { // if volte or vt was disabled then the viwifi will be disabled as well. - if(!imsManager.isVolteEnabledByPlatform() || - !imsManager.isVtEnabledByPlatform()) { + if(!RcsSettingUtils.isVoLteSupported(mContext) || + !RcsSettingUtils.isVtSupported(mContext)) { logger.print("Disabled by platform, videoSupported=false"); return false; } - if(!imsManager.isVolteProvisionedOnDevice() || + if(!RcsSettingUtils.isVoLteProvisioned(mContext) || !RcsSettingUtils.isLvcProvisioned(mContext)) { logger.print("Not provisioned. videoSupported=false"); return false; } - if(!imsManager.isEnhanced4gLteModeSettingEnabledByUser() || - !mVtEnabled){ + if(!RcsSettingUtils.isAdvancedCallingEnabledByUser(mContext) || !mVtEnabled){ logger.print("User disabled volte or vt, videoSupported=false"); return false; } @@ -434,7 +421,6 @@ public class PresencePublication extends PresenceBase { logger.print("onMobileDataChanged, mDataEnabled=" + mDataEnabled + " value=" + value); if(mDataEnabled != value) { mDataEnabled = value; - RcsSettingUtils.setMobileDataEnabled(mContext, mDataEnabled); requestLocalPublish(PublishType.PRES_PUBLISH_TRIGGER_DATA_CHANGED); } @@ -703,14 +689,8 @@ public class PresencePublication extends PresenceBase { } public void refreshPublishContent() { - mVolteCapable = isIPVoiceSupported(mIsVolteAvailable, - mIsVtAvailable, - mIsVoWifiAvailable, - mIsViWifiAvailable); - mVtCapable = isIPVideoSupported(mIsVolteAvailable, - mIsVtAvailable, - mIsVoWifiAvailable, - mIsViWifiAvailable); + mVolteCapable = isIPVoiceSupported(mIsVolteAvailable, mIsVoWifiAvailable); + mVtCapable = isIPVideoSupported(mIsVtAvailable, mIsViWifiAvailable); } public boolean getForceToNetwork() { @@ -889,7 +869,7 @@ public class PresencePublication extends PresenceBase { // we need send PUBLISH once even the volte is off when power on the phone. // That will tell other phone that it has no volte/vt capability. - if(!getImsManager().isEnhanced4gLteModeSettingEnabledByUser() && + if(!RcsSettingUtils.isAdvancedCallingEnabledByUser(mContext) && getPublishState() != PUBLISH_STATE_NOT_PUBLISHED) { // volte was not enabled. // or it is turnning off volte. lower layer should unpublish @@ -1055,21 +1035,7 @@ public class PresencePublication extends PresenceBase { } private static boolean isTtyEnabled(int mode) { - return Phone.TTY_MODE_OFF != mode; - } - - private static int telecomTtyModeToPhoneMode(int telecomMode) { - switch (telecomMode) { - case TelecomManager.TTY_MODE_FULL: - return Phone.TTY_MODE_FULL; - case TelecomManager.TTY_MODE_VCO: - return Phone.TTY_MODE_VCO; - case TelecomManager.TTY_MODE_HCO: - return Phone.TTY_MODE_HCO; - case TelecomManager.TTY_MODE_OFF: - default: - return Phone.TTY_MODE_OFF; - } + return TelecomManager.TTY_MODE_OFF != mode; } public void finish() { @@ -1165,9 +1131,4 @@ public class PresencePublication extends PresenceBase { // Had reported IWLAN by trigger and still have DATA. return mMovedToIWLAN && (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN); } - - - private ImsManager getImsManager() { - return ImsManager.getInstance(mContext, SubscriptionManager.getDefaultVoicePhoneId()); - } } diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java index 9a7e6f9..632e0f5 100644 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java +++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java @@ -65,20 +65,22 @@ public class PresenceSubscriber extends PresenceBase { mConfigRcsProvisionErrorOnSubscribeResponse = configRcsProvisionErrorOnSubscribeResponse; } - private String numberToUriString(String number){ - String formatedContact = number; - if(!formatedContact.startsWith("sip:") && !formatedContact.startsWith("tel:")){ - String domain = TelephonyManager.getDefault().getIsimDomain(); + private String numberToUriString(String number) { + String formattedContact = number; + TelephonyManager tm = mContext.getSystemService(TelephonyManager.class); + if (tm != null && !formattedContact.startsWith("sip:") + && !formattedContact.startsWith("tel:")){ + String domain = tm.getIsimDomain(); logger.debug("domain=" + domain); - if(domain == null || domain.length() ==0){ - formatedContact = "tel:" + formatedContact; - }else{ - formatedContact = "sip:" + formatedContact + "@" + domain; + if (domain == null || domain.length() == 0){ + formattedContact = "tel:" + formattedContact; + } else { + formattedContact = "sip:" + formattedContact + "@" + domain; } } - logger.print("numberToUriString formatedContact=" + formatedContact); - return formatedContact; + logger.print("numberToUriString formattedContact=" + formattedContact); + return formattedContact; } private String numberToTelString(String number){ @@ -183,11 +185,9 @@ public class PresenceSubscriber extends PresenceBase { } } - boolean isFtSupported = false; // hard code to not support FT at present. - boolean isChatSupported = false; // hard code to not support chat at present. // Only poll/fetch capability/availability on LTE - if(((TelephonyManager.getDefault().getNetworkType() != TelephonyManager.NETWORK_TYPE_LTE) - && !isFtSupported && !isChatSupported)){ + TelephonyManager tm = mContext.getSystemService(TelephonyManager.class); + if(tm == null || (tm.getDataNetworkType() != TelephonyManager.NETWORK_TYPE_LTE)) { logger.error("requestAvailability return ERROR_SERVICE_NOT_AVAILABLE" + " for it is not LTE network"); return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; |