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