Make sure data is enabled on the non-primary sub's voice call
Also make sure PhoneFactory is initialized before calling
getDefaultPhone
PhoneFactory.makeDefaultPhones leads to a call to
DataEnabledOverride.getCurrentConditions which in turn
calls PhoneFactory.getPhone() which in that scenario
would return null
Bug: 135271148
Test: manual verification and unittests
Change-Id: Ib5ac1be78556d079744bffca4b731df6ba108429
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataEnabledOverride.java b/src/java/com/android/internal/telephony/dataconnection/DataEnabledOverride.java
index 0cd565f..f639b36 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataEnabledOverride.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataEnabledOverride.java
@@ -18,14 +18,18 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.ApnSetting.ApnType;
import android.text.TextUtils;
import android.util.ArrayMap;
+import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.SubscriptionController;
import com.android.internal.telephony.dataconnection.DataEnabledOverride.OverrideConditions.Condition;
@@ -52,7 +56,9 @@
*/
private static final OverrideRule OVERRIDE_RULE_ALLOW_DATA_DURING_VOICE_CALL =
new OverrideRule(ApnSetting.TYPE_ALL, OverrideConditions.CONDITION_IN_VOICE_CALL
- | OverrideConditions.CONDITION_NON_DEFAULT);
+ | OverrideConditions.CONDITION_NON_DEFAULT
+ | OverrideConditions.CONDITION_DEFAULT_DATA_ENABLED
+ | OverrideConditions.CONDITION_DSDS_ENABLED);
/**
* The rule for always allowing mms. Without adding any condition to the rule, any condition can
@@ -157,6 +163,12 @@
/** Enable data only when device has ongoing voice call */
static final int CONDITION_IN_VOICE_CALL = 1 << 1;
+ /** Enable data only when default data is on */
+ static final int CONDITION_DEFAULT_DATA_ENABLED = 1 << 2;
+
+ /** Enable data only when device is in DSDS mode */
+ static final int CONDITION_DSDS_ENABLED = 1 << 3;
+
/** Enable data unconditionally in string format */
static final String CONDITION_UNCONDITIONALLY_STRING = "unconditionally";
@@ -166,10 +178,18 @@
/** Enable data only when device has ongoing voice call in string format */
static final String CONDITION_VOICE_CALL_STRING = "inVoiceCall";
+ /** Enable data only when default data is on in string format */
+ static final String CONDITION_DEFAULT_DATA_ENABLED_STRING = "DefaultDataOn";
+
+ /** Enable data only when device is in DSDS mode in string format */
+ static final String CONDITION_DSDS_ENABLED_STRING = "dsdsEnabled";
+
/** @hide */
@IntDef(flag = true, prefix = { "OVERRIDE_CONDITION_" }, value = {
CONDITION_NON_DEFAULT,
CONDITION_IN_VOICE_CALL,
+ CONDITION_DEFAULT_DATA_ENABLED,
+ CONDITION_DSDS_ENABLED
})
@Retention(RetentionPolicy.SOURCE)
public @interface Condition {}
@@ -182,6 +202,10 @@
CONDITION_NON_DEFAULT_STRING);
OVERRIDE_CONDITION_INT_MAP.put(CONDITION_IN_VOICE_CALL,
CONDITION_VOICE_CALL_STRING);
+ OVERRIDE_CONDITION_INT_MAP.put(CONDITION_DEFAULT_DATA_ENABLED,
+ CONDITION_DEFAULT_DATA_ENABLED_STRING);
+ OVERRIDE_CONDITION_INT_MAP.put(CONDITION_DSDS_ENABLED,
+ CONDITION_DSDS_ENABLED_STRING);
OVERRIDE_CONDITION_STRING_MAP.put(CONDITION_UNCONDITIONALLY_STRING,
CONDITION_UNCONDITIONALLY);
@@ -189,6 +213,10 @@
CONDITION_NON_DEFAULT);
OVERRIDE_CONDITION_STRING_MAP.put(CONDITION_VOICE_CALL_STRING,
CONDITION_IN_VOICE_CALL);
+ OVERRIDE_CONDITION_STRING_MAP.put(CONDITION_DEFAULT_DATA_ENABLED_STRING,
+ CONDITION_DEFAULT_DATA_ENABLED);
+ OVERRIDE_CONDITION_STRING_MAP.put(CONDITION_DSDS_ENABLED_STRING,
+ CONDITION_DSDS_ENABLED);
}
private final @Condition int mConditions;
@@ -353,9 +381,28 @@
conditions |= OverrideConditions.CONDITION_IN_VOICE_CALL;
}
- if (phone.getSubId() != SubscriptionController.getInstance().getDefaultDataSubId()) {
+ int defaultDataSubId = SubscriptionController.getInstance().getDefaultDataSubId();
+
+ if (phone.getSubId() != defaultDataSubId) {
conditions |= OverrideConditions.CONDITION_NON_DEFAULT;
}
+
+ if (defaultDataSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ int phoneId = SubscriptionController.getInstance().getPhoneId(defaultDataSubId);
+ try {
+ Phone defaultDataPhone = PhoneFactory.getPhone(phoneId);
+ if (defaultDataPhone != null && defaultDataPhone.isUserDataEnabled()) {
+ conditions |= OverrideConditions.CONDITION_DEFAULT_DATA_ENABLED;
+ }
+ } catch (IllegalStateException e) {
+ //ignore the exception and do not add the condition
+ Log.d("DataEnabledOverride", e.getMessage());
+ }
+ }
+
+ if (TelephonyManager.from(phone.getContext()).isMultiSimEnabled()) {
+ conditions |= OverrideConditions.CONDITION_DSDS_ENABLED;
+ }
}
return conditions;
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledOverrideTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledOverrideTest.java
index 50265b9..3d0a4e0 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledOverrideTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledOverrideTest.java
@@ -210,10 +210,9 @@
doReturn(2).when(mSubscriptionController).getDefaultSmsSubId();
doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState();
- assertTrue(deo.getRules(), deo.shouldOverrideDataEnabledSettings(mPhone,
- ApnSetting.TYPE_DEFAULT));
deo.setDataAllowedInVoiceCall(false);
- assertFalse(deo.shouldOverrideDataEnabledSettings(mPhone, ApnSetting.TYPE_DEFAULT));
+ assertFalse(deo.getRules(), deo.shouldOverrideDataEnabledSettings(
+ mPhone, ApnSetting.TYPE_DEFAULT));
assertFalse(deo.isDataAllowedInVoiceCall());
}
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledSettingsTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledSettingsTest.java
index 3bc6f47..52c9573 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledSettingsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledSettingsTest.java
@@ -91,7 +91,7 @@
ArgumentCaptor<String> stringCaptor = ArgumentCaptor.forClass(String.class);
verify(mSubscriptionController).setDataEnabledOverrideRules(anyInt(),
stringCaptor.capture());
- assertEquals("*=nonDefault&inVoiceCall", stringCaptor.getValue());
+ assertEquals("*=nonDefault&inVoiceCall&DefaultDataOn&dsdsEnabled", stringCaptor.getValue());
clearInvocations(mSubscriptionController);