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