From 64ac0d4a74ab6a1e1da914a219b01f23e947bd4b Mon Sep 17 00:00:00 2001 From: "James.cf Lin" Date: Thu, 27 Feb 2020 15:16:08 +0800 Subject: [PATCH] [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 --- .../DataDuringCallsPreferenceController.java | 26 +++++++++++++++++-- ...taDuringCallsPreferenceControllerTest.java | 21 +++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/network/telephony/DataDuringCallsPreferenceController.java b/src/com/android/settings/network/telephony/DataDuringCallsPreferenceController.java index 6f61d915b91..1137e06f0eb 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_PAUSE; 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.Preference; 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 @@ public class DataDuringCallsPreferenceController extends TelephonyTogglePreferen 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 @@ public class DataDuringCallsPreferenceController extends TelephonyTogglePreferen @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 @@ public class DataDuringCallsPreferenceController extends TelephonyTogglePreferen @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 class DataDuringCallsPreferenceController extends TelephonyTogglePreferen 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 a42420cc895..d366dfd9d0a 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 @@ package com.android.settings.network; 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 @@ public class DataDuringCallsPreferenceControllerTest { 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); + } }