summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-01-14 18:17:12 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-01-14 18:17:12 +0000
commitc5d02e6ac9c5b794e09b558e1ac7972c5acda716 (patch)
tree975d529c77cfa5b43fadff5919f661c5989c60b9
parent194c709efaade08c32015d427002d513d77bc095 (diff)
parentef93aca0702aa953736b7e39512d5ed247cbbbc2 (diff)
downloadims-c5d02e6ac9c5b794e09b558e1ac7972c5acda716.tar.gz
Use @SystemApi methods to interact with telephony am: 489de20610 am: ef93aca070
Change-Id: Id1226a7c5de1f72b26c87453a98f76e7dbee73cb
-rw-r--r--rcs/presencepolling/Android.bp4
-rw-r--r--rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java221
-rw-r--r--rcs/presencepolling/src/com/android/service/ims/presence/EABService.java47
-rw-r--r--rcs/presencepolling/src/com/android/service/ims/presence/PresenceSetting.java243
-rw-r--r--rcs/rcsservice/Android.bp6
-rw-r--r--rcs/rcsservice/src/com/android/service/ims/RcsService.java81
-rw-r--r--rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java212
-rw-r--r--rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java4
-rw-r--r--rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java77
-rw-r--r--rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java28
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;