diff --git a/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceController.java b/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceController.java new file mode 100644 index 00000000000..e0247885908 --- /dev/null +++ b/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceController.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.network.telephony; + +import android.content.Context; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; + +import com.android.settings.core.BasePreferenceController; + +/** + * Class to show the footer that can't connect to 5G when device is in DSDS mode. + */ +public class NrDisabledInDsdsFooterPreferenceController extends BasePreferenceController { + private int mSubId; + + /** + * Constructor. + */ + public NrDisabledInDsdsFooterPreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + } + + /** + * Init and specify a subId. + */ + public void init(int subId) { + mSubId = subId; + } + + @Override + public int getAvailabilityStatus() { + if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + return CONDITIONALLY_UNAVAILABLE; + } + + final TelephonyManager teleManager = ((TelephonyManager) + mContext.getSystemService(Context.TELEPHONY_SERVICE)) + .createForSubscriptionId(mSubId); + // Show the footer only when DSDS is enabled, and mobile data is enabled on this SIM, and + // 5G is supported on this device. + if (!teleManager.isDataEnabled() || teleManager.getActiveModemCount() < 2 + || !is5GSupportedByRadio(teleManager)) { + return CONDITIONALLY_UNAVAILABLE; + } + return AVAILABLE; + } + + private boolean is5GSupportedByRadio(TelephonyManager tm) { + return (tm.getSupportedRadioAccessFamily() & TelephonyManager.NETWORK_TYPE_BITMASK_NR) > 0; + } +} diff --git a/tests/robotests/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceControllerTest.java new file mode 100644 index 00000000000..c75d874e25c --- /dev/null +++ b/tests/robotests/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceControllerTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.network.telephony; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.telephony.TelephonyManager; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class NrDisabledInDsdsFooterPreferenceControllerTest { + private static final String PREF_KEY = "pref_key"; + private static final int SUB_ID = 111; + + private Context mContext; + @Mock + private TelephonyManager mTelephonyManager; + private NrDisabledInDsdsFooterPreferenceController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = spy(RuntimeEnvironment.application); + doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE); + doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(anyInt()); + mController = new NrDisabledInDsdsFooterPreferenceController(mContext, PREF_KEY); + } + + @Test + public void isAvailable_noInit_notAvailable() { + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_dataOnAndDsdsAnd5GSupported_Available() { + when(mTelephonyManager.getSupportedRadioAccessFamily()) + .thenReturn(TelephonyManager.NETWORK_TYPE_BITMASK_NR); + when(mTelephonyManager.getActiveModemCount()).thenReturn(2); + when(mTelephonyManager.isDataEnabled()).thenReturn(true); + mController.init(SUB_ID); + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void isAvailable_5gNotSupported_notAvailable() { + when(mTelephonyManager.getSupportedRadioAccessFamily()) + .thenReturn(TelephonyManager.NETWORK_TYPE_BITMASK_LTE); + when(mTelephonyManager.getActiveModemCount()).thenReturn(2); + when(mTelephonyManager.isDataEnabled()).thenReturn(true); + mController.init(SUB_ID); + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_mobileDataOff_notAvailable() { + when(mTelephonyManager.getSupportedRadioAccessFamily()) + .thenReturn(TelephonyManager.NETWORK_TYPE_BITMASK_NR); + when(mTelephonyManager.getActiveModemCount()).thenReturn(2); + when(mTelephonyManager.isDataEnabled()).thenReturn(false); + mController.init(SUB_ID); + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_singleSimMode_notAvailable() { + when(mTelephonyManager.getSupportedRadioAccessFamily()) + .thenReturn(TelephonyManager.NETWORK_TYPE_BITMASK_NR); + when(mTelephonyManager.getActiveModemCount()).thenReturn(1); + when(mTelephonyManager.isDataEnabled()).thenReturn(true); + mController.init(SUB_ID); + assertThat(mController.isAvailable()).isFalse(); + } +}