Merge "In DSDS mode, only show Mobile data enabled for default data sub."
diff --git a/src/java/com/android/internal/telephony/SubscriptionController.java b/src/java/com/android/internal/telephony/SubscriptionController.java
index bfe2f42..f89ba4d 100644
--- a/src/java/com/android/internal/telephony/SubscriptionController.java
+++ b/src/java/com/android/internal/telephony/SubscriptionController.java
@@ -2045,6 +2045,7 @@
 
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION, subId);
+        updateDataEnabledSettings();
         broadcastDefaultDataSubIdChanged(subId);
     }
 
@@ -2167,6 +2168,23 @@
         return true;
     }
 
+    /**
+     * Make sure in multi SIM scenarios, user data is enabled or disabled correctly.
+     */
+    public void updateDataEnabledSettings() {
+        Phone[] phones = PhoneFactory.getPhones();
+        if (phones == null || phones.length < 2) return;
+
+        for (Phone phone : phones) {
+            if (isActiveSubId(phone.getSubId())) {
+                // Only enable it if it was enabled and it's the default data subscription.
+                // Otherwise it should be disabled.
+                phone.getDataEnabledSettings().setUserDataEnabled(
+                        phone.isUserDataEnabled() && phone.getSubId() == getDefaultDataSubId());
+            }
+        }
+    }
+
     // FIXME: We need we should not be assuming phoneId == slotIndex as it will not be true
     // when there are multiple subscriptions per sim and probably for other reasons.
     public int getSubIdUsingPhoneId(int phoneId) {
diff --git a/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java b/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java
index b119c4c..7c29bdc 100644
--- a/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java
+++ b/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java
@@ -601,11 +601,11 @@
                                 uiccSlot.getUiccCard().getCardId()))
                         .forEach(cardId -> updateEmbeddedSubscriptions(cardId));
             }
+            // update default subId
+            SubscriptionController.getInstance().clearDefaultsForInactiveSubIds();
+            SubscriptionController.getInstance().updateDataEnabledSettings();
         }
 
-        // update default subId
-        SubscriptionController.getInstance().clearDefaultsForInactiveSubIds();
-
         SubscriptionController.getInstance().notifySubscriptionInfoChanged();
         logd("updateSubscriptionInfoByIccId:- SubscriptionInfo update complete");
     }
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java b/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java
index be6892b..00d44e6 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java
@@ -24,12 +24,14 @@
 import android.os.SystemProperties;
 import android.provider.Settings;
 import android.telephony.Rlog;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.util.LocalLog;
 import android.util.Pair;
 
 import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.SubscriptionController;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -126,13 +128,28 @@
     }
 
     public synchronized void setUserDataEnabled(boolean enabled) {
+        // Can't disable data for opportunistic subscription.
+        if (isSubOpportunistic() && !enabled) return;
+        // Can't enable data for non-default data subscription.
+        if (!isDefaultDataSub() && enabled) return;
+
         localLog("UserDataEnabled", enabled);
-        Settings.Global.putInt(mResolver, getMobileDataSettingName(), enabled ? 1 : 0);
-        mPhone.notifyUserMobileDataStateChanged(enabled);
-        updateDataEnabledAndNotify(REASON_USER_DATA_ENABLED);
+        // Make sure if value is not initialized, it gets overwritten by the target value.
+        int uninitializedValue = -1;
+        int currentValue = Settings.Global.getInt(
+                mResolver, getMobileDataSettingName(), uninitializedValue);
+        int targetValue = (enabled ? 1 : 0);
+        if (currentValue != targetValue) {
+            Settings.Global.putInt(mResolver, getMobileDataSettingName(), targetValue);
+            mPhone.notifyUserMobileDataStateChanged(enabled);
+            updateDataEnabledAndNotify(REASON_USER_DATA_ENABLED);
+        }
     }
 
     public synchronized boolean isUserDataEnabled() {
+        // User data should always be true for opportunistic subscription.
+        if (isSubOpportunistic()) return true;
+
         boolean defaultVal = "true".equalsIgnoreCase(SystemProperties.get(
                 "ro.com.android.mobiledata", "true"));
 
@@ -244,6 +261,16 @@
         mOverallDataEnabledChangedRegistrants.remove(h);
     }
 
+    private boolean isSubOpportunistic() {
+        SubscriptionInfo info = SubscriptionController.getInstance().getActiveSubscriptionInfo(
+                mPhone.getSubId(), mPhone.getContext().getOpPackageName());
+        return (info != null) && info.isOpportunistic();
+    }
+
+    private boolean isDefaultDataSub() {
+        return SubscriptionController.getInstance().getDefaultDataSubId() == mPhone.getSubId();
+    }
+
     private void log(String s) {
         Rlog.d(LOG_TAG, "[" + mPhone.getPhoneId() + "]" + s);
     }