Merge "Convert dataDuringCall to autoDataSWitch"

This commit is contained in:
Ling Ma
2022-10-25 23:36:43 +00:00
committed by Android (Google) Code Review
9 changed files with 106 additions and 32 deletions

View File

@@ -6842,12 +6842,12 @@
<!-- Title of a preference for whether to allow data during calls that is shown when mobile <!-- Title of a preference for whether to allow data during calls that is shown when mobile
data is turned off. This is needed for some multi-SIM scenarios, because the SIM that is data is turned off. This is needed for some multi-SIM scenarios, because the SIM that is
default for data might not be available during a phone call. [CHAR LIMIT=60] --> default for data might not be available during a phone call. [CHAR LIMIT=60] -->
<string name="data_during_calls_title">Data during calls</string> <string name="auto_data_switch_title">Switch mobile data automatically</string>
<!-- Title of a preference for whether to allow data during calls that is shown when mobile <!-- Title of a preference for whether to allow data during calls that is shown when mobile
data is turned off. This is needed for some multi-SIM scenarios, because the SIM that is data is turned off. This is needed for some multi-SIM scenarios, because the SIM that is
default for data might not be available during a phone call. [CHAR LIMIT=NONE] --> default for data might not be available during a phone call. [CHAR LIMIT=NONE] -->
<string name="data_during_calls_summary"> <string name="auto_data_switch_summary">
Allow this SIM to be used for mobile data only during calls Temporarily use this network when it has better availability for calls and internet
</string> </string>
<!-- Work SIM title. [CHAR LIMIT=50] --> <!-- Work SIM title. [CHAR LIMIT=50] -->
@@ -11395,6 +11395,12 @@
<!-- Provider Model: <!-- Provider Model:
Summary indicating that a SIM has an active mobile data connection [CHAR LIMIT=50] --> Summary indicating that a SIM has an active mobile data connection [CHAR LIMIT=50] -->
<string name="mobile_data_connection_active">Connected</string> <string name="mobile_data_connection_active">Connected</string>
<!-- Provider Model:
Summary indicating that a SIM has an active mobile data connection [CHAR LIMIT=50] -->
<string name="mobile_data_temp_connection_active">Temporarily connected</string>
<!-- Provider Model:
Summary indicating that a SIM is temporarily connected to mobile data [CHAR LIMIT=50] -->
<string name="mobile_data_temp_using">Temporarily using <xliff:g id="subName" example="Google Fi">%1$s</xliff:g></string>
<!-- Provider Model: <!-- Provider Model:
Summary indicating that a active SIM and no network available [CHAR LIMIT=50] --> Summary indicating that a active SIM and no network available [CHAR LIMIT=50] -->
<string name="mobile_data_no_connection">No connection</string> <string name="mobile_data_no_connection">No connection</string>

View File

@@ -59,6 +59,12 @@
settings:controller="com.android.settings.network.telephony.MobileDataPreferenceController" settings:controller="com.android.settings.network.telephony.MobileDataPreferenceController"
settings:allowDividerAbove="true"/> settings:allowDividerAbove="true"/>
<SwitchPreference
android:key="auto_data_switch"
android:title="@string/auto_data_switch_title"
android:summary="@string/auto_data_switch_summary"
settings:controller="com.android.settings.network.telephony.AutoDataSwitchPreferenceController"/>
<com.android.settingslib.RestrictedSwitchPreference <com.android.settingslib.RestrictedSwitchPreference
android:key="button_roaming_key" android:key="button_roaming_key"
android:title="@string/roaming" android:title="@string/roaming"
@@ -96,12 +102,6 @@
android:summary="@string/mms_message_summary" android:summary="@string/mms_message_summary"
settings:controller="com.android.settings.network.telephony.MmsMessagePreferenceController"/> settings:controller="com.android.settings.network.telephony.MmsMessagePreferenceController"/>
<SwitchPreference
android:key="data_during_calls"
android:title="@string/data_during_calls_title"
android:summary="@string/data_during_calls_summary"
settings:controller="com.android.settings.network.telephony.DataDuringCallsPreferenceController"/>
<SwitchPreference <SwitchPreference
android:key="enhanced_4g_lte" android:key="enhanced_4g_lte"
android:title="@string/enhanced_4g_lte_mode_title" android:title="@string/enhanced_4g_lte_mode_title"

View File

@@ -192,11 +192,22 @@ public class InternetPreferenceController extends AbstractPreferenceController i
if (subscriptionManager == null) { if (subscriptionManager == null) {
return; return;
} }
SubscriptionInfo subInfo = subscriptionManager.getDefaultDataSubscriptionInfo(); SubscriptionInfo subInfo = subscriptionManager.getActiveSubscriptionInfo(
SubscriptionManager.getActiveDataSubscriptionId());
SubscriptionInfo defaultSubInfo = subscriptionManager.getDefaultDataSubscriptionInfo();
subInfo = subscriptionManager.isSubscriptionVisible(subInfo) ? subInfo : defaultSubInfo;
if (subInfo == null) { if (subInfo == null) {
return; return;
} }
mPreference.setSummary(SubscriptionUtil.getUniqueSubscriptionDisplayName( CharSequence summary;
subInfo, mContext)); if (subInfo.equals(defaultSubInfo)) {
// DDS is active
summary = SubscriptionUtil.getUniqueSubscriptionDisplayName(subInfo, mContext);
} else {
summary = mContext.getString(
R.string.mobile_data_temp_using,
SubscriptionUtil.getUniqueSubscriptionDisplayName(subInfo, mContext));
}
mPreference.setSummary(summary);
} }
} }

View File

@@ -220,7 +220,11 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl
return; return;
} }
SubscriptionInfo subInfo = mSubscriptionManager.getDefaultDataSubscriptionInfo(); // Prefer using the currently active sub
SubscriptionInfo subInfoCandidate = mSubscriptionManager.getActiveSubscriptionInfo(
SubscriptionManager.getActiveDataSubscriptionId());
SubscriptionInfo subInfo = mSubscriptionManager.isSubscriptionVisible(subInfoCandidate)
? subInfoCandidate : mSubscriptionManager.getDefaultDataSubscriptionInfo();
if (subInfo == null) { if (subInfo == null) {
mPreferenceGroup.removeAll(); mPreferenceGroup.removeAll();
return; return;
@@ -255,9 +259,17 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl
mUpdateListener.onChildrenUpdated(); mUpdateListener.onChildrenUpdated();
} }
/**@return {@code true} if subId is the default data sub. **/
private boolean isDds(int subId) {
return mSubscriptionManager.getDefaultDataSubscriptionInfo() != null
&& mSubscriptionManager.getDefaultDataSubscriptionInfo().getSubscriptionId()
== subId;
}
private CharSequence getMobilePreferenceSummary(int subId) { private CharSequence getMobilePreferenceSummary(int subId) {
final TelephonyManager tmForSubId = mTelephonyManager.createForSubscriptionId(subId); final TelephonyManager tmForSubId = mTelephonyManager.createForSubscriptionId(subId);
if (!tmForSubId.isDataEnabled()) { boolean isDds = isDds(subId);
if (!tmForSubId.isDataEnabled() && isDds) {
return mContext.getString(R.string.mobile_data_off_summary); return mContext.getString(R.string.mobile_data_off_summary);
} }
final ServiceState serviceState = tmForSubId.getServiceState(); final ServiceState serviceState = tmForSubId.getServiceState();
@@ -275,10 +287,12 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl
mContext, mConfig, mTelephonyDisplayInfo, subId, isCarrierNetworkActive); mContext, mConfig, mTelephonyDisplayInfo, subId, isCarrierNetworkActive);
if (mSubsPrefCtrlInjector.isActiveCellularNetwork(mContext) || isCarrierNetworkActive) { if (mSubsPrefCtrlInjector.isActiveCellularNetwork(mContext) || isCarrierNetworkActive) {
if (result.isEmpty()) { if (result.isEmpty()) {
result = mContext.getString(R.string.mobile_data_connection_active); result = mContext.getString(isDds ? R.string.mobile_data_connection_active
: R.string.mobile_data_temp_connection_active);
} else { } else {
result = mContext.getString(R.string.preference_summary_default_combination, result = mContext.getString(R.string.preference_summary_default_combination,
mContext.getString(R.string.mobile_data_connection_active), result); mContext.getString(isDds ? R.string.mobile_data_connection_active
: R.string.mobile_data_temp_connection_active), result);
} }
} else if (!isDataInService) { } else if (!isDataInService) {
result = mContext.getString(R.string.mobile_data_no_connection); result = mContext.getString(R.string.mobile_data_no_connection);
@@ -316,9 +330,12 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl
final boolean isVoiceInService = (serviceState == null) final boolean isVoiceInService = (serviceState == null)
? false ? false
: (serviceState.getState() == ServiceState.STATE_IN_SERVICE); : (serviceState.getState() == ServiceState.STATE_IN_SERVICE);
final boolean isDataEnabled = tmForSubId.isDataEnabled()
// non-Dds but auto data switch feature is enabled
|| (!isDds(subId) && tmForSubId.isMobileDataPolicyEnabled(
TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH));
if (isDataInService || isVoiceInService || isCarrierNetworkActive) { if (isDataInService || isVoiceInService || isCarrierNetworkActive) {
icon = mSubsPrefCtrlInjector.getIcon(mContext, level, numLevels, icon = mSubsPrefCtrlInjector.getIcon(mContext, level, numLevels, !isDataEnabled);
!tmForSubId.isDataEnabled());
} }
final boolean isActiveCellularNetwork = final boolean isActiveCellularNetwork =

View File

@@ -11,7 +11,7 @@
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License * limitations under the License.
*/ */
package com.android.settings.network.telephony; package com.android.settings.network.telephony;
@@ -36,7 +36,17 @@ import com.android.settings.datausage.DataUsageUtils;
import com.android.settings.network.MobileDataContentObserver; import com.android.settings.network.MobileDataContentObserver;
import com.android.settings.network.SubscriptionsChangeListener; import com.android.settings.network.SubscriptionsChangeListener;
public class DataDuringCallsPreferenceController extends TelephonyTogglePreferenceController /**
* Controls whether switch mobile data to the non-default SIM if the non-default SIM has better
* availability.
*
* This is used for temporarily allowing data on the non-default data SIM when on-default SIM
* has better availability on DSDS devices, where better availability means strong
* signal/connectivity.
* If this feature is enabled, data will be temporarily enabled on the non-default data SIM,
* including during any voice calls.
*/
public class AutoDataSwitchPreferenceController extends TelephonyTogglePreferenceController
implements LifecycleObserver, implements LifecycleObserver,
SubscriptionsChangeListener.SubscriptionsChangeListenerClient { SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
@@ -46,7 +56,7 @@ public class DataDuringCallsPreferenceController extends TelephonyTogglePreferen
private MobileDataContentObserver mMobileDataContentObserver; private MobileDataContentObserver mMobileDataContentObserver;
private PreferenceScreen mScreen; private PreferenceScreen mScreen;
public DataDuringCallsPreferenceController(Context context, public AutoDataSwitchPreferenceController(Context context,
String preferenceKey) { String preferenceKey) {
super(context, preferenceKey); super(context, preferenceKey);
} }
@@ -90,13 +100,13 @@ public class DataDuringCallsPreferenceController extends TelephonyTogglePreferen
@Override @Override
public boolean isChecked() { public boolean isChecked() {
return mManager.isMobileDataPolicyEnabled( return mManager.isMobileDataPolicyEnabled(
TelephonyManager.MOBILE_DATA_POLICY_DATA_ON_NON_DEFAULT_DURING_VOICE_CALL); TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH);
} }
@Override @Override
public boolean setChecked(boolean isChecked) { public boolean setChecked(boolean isChecked) {
mManager.setMobileDataPolicyEnabled( mManager.setMobileDataPolicyEnabled(
TelephonyManager.MOBILE_DATA_POLICY_DATA_ON_NON_DEFAULT_DURING_VOICE_CALL, TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH,
isChecked); isChecked);
return true; return true;
} }

View File

@@ -184,7 +184,7 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings {
use(CarrierSettingsVersionPreferenceController.class).init(mSubId); use(CarrierSettingsVersionPreferenceController.class).init(mSubId);
use(BillingCyclePreferenceController.class).init(mSubId); use(BillingCyclePreferenceController.class).init(mSubId);
use(MmsMessagePreferenceController.class).init(mSubId); use(MmsMessagePreferenceController.class).init(mSubId);
use(DataDuringCallsPreferenceController.class).init(mSubId); use(AutoDataSwitchPreferenceController.class).init(mSubId);
use(DisabledSubscriptionController.class).init(mSubId); use(DisabledSubscriptionController.class).init(mSubId);
use(DeleteSimProfilePreferenceController.class).init(mSubId, this, use(DeleteSimProfilePreferenceController.class).init(mSubId, this,
REQUEST_CODE_DELETE_SUBSCRIPTION); REQUEST_CODE_DELETE_SUBSCRIPTION);

View File

@@ -2,7 +2,7 @@ com.android.settings.accessibility.AccessibilitySlicePreferenceController
com.android.settings.core.TogglePreferenceControllerTest$FakeToggle com.android.settings.core.TogglePreferenceControllerTest$FakeToggle
com.android.settings.biometrics.face.FaceSettingsAttentionPreferenceController com.android.settings.biometrics.face.FaceSettingsAttentionPreferenceController
com.android.settings.network.telephony.MmsMessagePreferenceController com.android.settings.network.telephony.MmsMessagePreferenceController
com.android.settings.network.telephony.DataDuringCallsPreferenceController com.android.settings.network.telephony.AutoDataSwitchPreferenceController
com.android.settings.network.telephony.Enhanced4gBasePreferenceController com.android.settings.network.telephony.Enhanced4gBasePreferenceController
com.android.settings.testutils.FakeToggleController com.android.settings.testutils.FakeToggleController
com.android.settings.testutils.FakeSliderController com.android.settings.testutils.FakeSliderController

View File

@@ -11,7 +11,7 @@
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License * limitations under the License.
*/ */
package com.android.settings.network.telephony; package com.android.settings.network.telephony;
@@ -47,7 +47,7 @@ import org.robolectric.shadows.ShadowSubscriptionManager;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowSubscriptionManager.class) @Config(shadows = ShadowSubscriptionManager.class)
public class DataDuringCallsPreferenceControllerTest { public class AutoDataSwitchPreferenceControllerTest {
private static final String PREF_KEY = "pref_key"; private static final String PREF_KEY = "pref_key";
private static final int SUB_ID_1 = 111; private static final int SUB_ID_1 = 111;
private static final int SUB_ID_2 = 222; private static final int SUB_ID_2 = 222;
@@ -59,7 +59,7 @@ public class DataDuringCallsPreferenceControllerTest {
private Context mContext; private Context mContext;
private SwitchPreference mSwitchPreference; private SwitchPreference mSwitchPreference;
private DataDuringCallsPreferenceController mController; private AutoDataSwitchPreferenceController mController;
@Before @Before
public void setUp() { public void setUp() {
@@ -69,9 +69,11 @@ public class DataDuringCallsPreferenceControllerTest {
when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
mSwitchPreference = new SwitchPreference(mContext); mSwitchPreference = new SwitchPreference(mContext);
when(mPreferenceScreen.findPreference(PREF_KEY)).thenReturn(mSwitchPreference); when(mPreferenceScreen.findPreference(PREF_KEY)).thenReturn(mSwitchPreference);
mController = new DataDuringCallsPreferenceController(mContext, PREF_KEY) { mController = new AutoDataSwitchPreferenceController(mContext, PREF_KEY) {
@Override @Override
protected boolean hasMobileData() { return true; } protected boolean hasMobileData() {
return true;
}
}; };
mController.init(SUB_ID_1); mController.init(SUB_ID_1);
} }
@@ -79,8 +81,8 @@ public class DataDuringCallsPreferenceControllerTest {
@Test @Test
public void getAvailabilityStatus_noInit_notAvailable() { public void getAvailabilityStatus_noInit_notAvailable() {
ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID_1); ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID_1);
DataDuringCallsPreferenceController controller = AutoDataSwitchPreferenceController controller =
new DataDuringCallsPreferenceController(mContext, PREF_KEY); new AutoDataSwitchPreferenceController(mContext, PREF_KEY);
// note that we purposely don't call init first on the controller // note that we purposely don't call init first on the controller
assertThat(controller.getAvailabilityStatus(INVALID_SUBSCRIPTION_ID)).isEqualTo( assertThat(controller.getAvailabilityStatus(INVALID_SUBSCRIPTION_ID)).isEqualTo(

View File

@@ -22,6 +22,7 @@ import static com.android.settings.network.InternetUpdater.INTERNET_WIFI;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
@@ -37,6 +38,7 @@ import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle;
@@ -46,6 +48,8 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.testutils.ResourcesUtils;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
@@ -145,7 +149,31 @@ public class InternetPreferenceControllerTest {
final SubscriptionManager subscriptionManager = mock(SubscriptionManager.class); final SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(subscriptionManager); when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(subscriptionManager);
when(subscriptionManager.getDefaultDataSubscriptionInfo()).thenReturn(null); when(subscriptionManager.getDefaultDataSubscriptionInfo()).thenReturn(null);
when(subscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(null);
mController.updateCellularSummary(); mController.updateCellularSummary();
} }
@Test
public void updateCellularSummary_getActiveSubscriptionInfo_cbrs() {
mController.displayPreference(mScreen);
final SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
final SubscriptionInfo defaultSubInfo = mock(SubscriptionInfo.class);
final SubscriptionInfo activeSubInfo = mock(SubscriptionInfo.class);
final String expectedSummary =
ResourcesUtils.getResourcesString(mContext, "mobile_data_temp_using", "");
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(subscriptionManager);
when(subscriptionManager.getDefaultDataSubscriptionInfo()).thenReturn(defaultSubInfo);
when(subscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(activeSubInfo);
when(subscriptionManager.isSubscriptionVisible(activeSubInfo)).thenReturn(false);
mController.updateCellularSummary();
assertThat(mPreference.getSummary()).isEqualTo("");
when(subscriptionManager.isSubscriptionVisible(activeSubInfo)).thenReturn(true);
mController.updateCellularSummary();
assertThat(mPreference.getSummary()).isEqualTo(expectedSummary);
}
} }