[Settings] "Data during calls" in DDS SUB is still in advanced option.

The DataDuringCallsPreferenceController didn't listen the mobile data changed and update the preference.

Bug: 149344454
Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataDuringCallsPreferenceControllerTest

Change-Id: I0121f06efb5257dccc05ad06b93a9db263f012b5
diff --git a/src/com/android/settings/network/telephony/DataDuringCallsPreferenceController.java b/src/com/android/settings/network/telephony/DataDuringCallsPreferenceController.java
index 6f61d91..1137e06 100644
--- a/src/com/android/settings/network/telephony/DataDuringCallsPreferenceController.java
+++ b/src/com/android/settings/network/telephony/DataDuringCallsPreferenceController.java
@@ -20,6 +20,8 @@
 import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
 
 import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 
@@ -30,6 +32,8 @@
 import androidx.preference.PreferenceScreen;
 import androidx.preference.SwitchPreference;
 
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.network.MobileDataContentObserver;
 import com.android.settings.network.SubscriptionsChangeListener;
 
 public class DataDuringCallsPreferenceController extends TelephonyTogglePreferenceController
@@ -39,11 +43,16 @@
     private SwitchPreference mPreference;
     private SubscriptionsChangeListener mChangeListener;
     private TelephonyManager mManager;
+    private MobileDataContentObserver mMobileDataContentObserver;
+    private PreferenceScreen mScreen;
 
     public DataDuringCallsPreferenceController(Context context,
             String preferenceKey) {
         super(context, preferenceKey);
         mChangeListener = new SubscriptionsChangeListener(mContext, this);
+        mMobileDataContentObserver = new MobileDataContentObserver(
+                new Handler(Looper.getMainLooper()));
+        mMobileDataContentObserver.setOnMobileDataChangedListener(()->refreshPreference());
     }
 
     public void init(Lifecycle lifecycle, int subId) {
@@ -55,17 +64,20 @@
     @OnLifecycleEvent(ON_RESUME)
     public void onResume() {
         mChangeListener.start();
+        mMobileDataContentObserver.register(mContext, mSubId);
     }
 
     @OnLifecycleEvent(ON_PAUSE)
     public void onPause() {
         mChangeListener.stop();
+        mMobileDataContentObserver.unRegister(mContext);
     }
 
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         mPreference = screen.findPreference(getPreferenceKey());
+        mScreen = screen;
     }
 
     @Override
@@ -81,8 +93,8 @@
 
     @Override
     public int getAvailabilityStatus(int subId) {
-        if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID ||
-                SubscriptionManager.getDefaultDataSubscriptionId() == mSubId) {
+        if (!SubscriptionManager.isValidSubscriptionId(subId)
+                || SubscriptionManager.getDefaultDataSubscriptionId() == subId) {
             return CONDITIONALLY_UNAVAILABLE;
         }
         return AVAILABLE;
@@ -101,4 +113,14 @@
     public void onSubscriptionsChanged() {
         updateState(mPreference);
     }
+
+    /**
+     * Trigger displaying preference when Mobilde data content changed.
+     */
+    @VisibleForTesting
+    public void refreshPreference() {
+        if (mScreen != null) {
+            super.displayPreference(mScreen);
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/network/DataDuringCallsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/DataDuringCallsPreferenceControllerTest.java
index a42420c..d366dfd 100644
--- a/tests/robotests/src/com/android/settings/network/DataDuringCallsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/DataDuringCallsPreferenceControllerTest.java
@@ -18,6 +18,7 @@
 
 import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
 
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
 import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -131,4 +132,24 @@
         assertThat(mController.isAvailable()).isTrue();
         assertThat(mSwitchPreference.isVisible()).isTrue();
     }
+
+    @Test
+    public void getAvailabilityStatus_mobileDataChangWithDefaultDataSubId_returnUnavailable() {
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID_1);
+
+        mController.refreshPreference();
+
+        assertThat(mController.getAvailabilityStatus(SUB_ID_1))
+                .isEqualTo(CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_mobileDataChangWithoutDefaultDataSubId_returnAvailable() {
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID_1);
+
+        mController.displayPreference(mPreferenceScreen);
+        mController.refreshPreference();
+
+        assertThat(mController.getAvailabilityStatus(SUB_ID_2)).isEqualTo(AVAILABLE);
+    }
 }