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);