diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml index 539c145e4e2..eb80ac84162 100644 --- a/res/xml/mobile_network_settings.xml +++ b/res/xml/mobile_network_settings.xml @@ -152,6 +152,7 @@ android:summary="@string/contact_discovery_opt_in_summary" settings:controller="com.android.settings.network.telephony.ContactDiscoveryPreferenceController"/> + + NetworkModePreferenceType.None + config.worldPhone -> NetworkModePreferenceType.PreferredNetworkMode + else -> NetworkModePreferenceType.EnabledNetworkMode + } +} + +class PreferredNetworkModeSearchItem(private val context: Context) : + MobileNetworkSettingsSearchItem { + private val title: String = context.getString(R.string.preferred_network_mode_title) + + override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? = + when (getNetworkModePreferenceType(context, subId)) { + NetworkModePreferenceType.PreferredNetworkMode -> + MobileNetworkSettingsSearchResult( + key = "preferred_network_mode_key", + title = title, + ) + + NetworkModePreferenceType.EnabledNetworkMode -> + MobileNetworkSettingsSearchResult( + key = "enabled_networks_key", + title = title, + ) + + else -> null + } +} diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt b/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt index b702054643e..58661f0e4fb 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt +++ b/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt @@ -116,6 +116,7 @@ class MobileNetworkSettingsSearchIndex( listOf( MmsMessageSearchItem(context), NrAdvancedCallingSearchItem(context), + PreferredNetworkModeSearchItem(context), RoamingSearchItem(context), WifiCallingSearchItem(context), ) diff --git a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java index bdfeace1be6..210cd879966 100644 --- a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java @@ -16,6 +16,8 @@ package com.android.settings.network.telephony; +import static com.android.settings.network.telephony.EnabledNetworkModePreferenceControllerHelperKt.getNetworkModePreferenceType; + import android.content.Context; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; @@ -27,16 +29,18 @@ import androidx.preference.ListPreference; import androidx.preference.Preference; import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; import com.android.settings.network.CarrierConfigCache; import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants; /** * Preference controller for "Preferred network mode" */ -public class PreferredNetworkModePreferenceController extends TelephonyBasePreferenceController +public class PreferredNetworkModePreferenceController extends BasePreferenceController implements ListPreference.OnPreferenceChangeListener { private static final String TAG = "PrefNetworkModeCtrl"; + private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private CarrierConfigCache mCarrierConfigCache; private TelephonyManager mTelephonyManager; private boolean mIsGlobalCdma; @@ -47,25 +51,10 @@ public class PreferredNetworkModePreferenceController extends TelephonyBasePrefe } @Override - public int getAvailabilityStatus(int subId) { - final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(subId); - boolean visible; - if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - visible = false; - } else if (carrierConfig == null) { - visible = false; - } else if (carrierConfig.getBoolean( - CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL) - || carrierConfig.getBoolean( - CarrierConfigManager.KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL)) { - visible = false; - } else if (carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) { - visible = true; - } else { - visible = false; - } - - return visible ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + public int getAvailabilityStatus() { + return getNetworkModePreferenceType(mContext, mSubId) + == NetworkModePreferenceType.PreferredNetworkMode + ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java b/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java index 3972f3900f3..ee1552083ea 100644 --- a/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java +++ b/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java @@ -17,9 +17,6 @@ package com.android.settings.network.telephony; import android.content.Context; -import android.content.res.Resources; -import android.os.PersistableBundle; -import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import com.android.settings.core.BasePreferenceController; @@ -59,29 +56,4 @@ public abstract class TelephonyBasePreferenceController extends BasePreferenceCo public void unsetAvailabilityStatus() { mSetSessionCount.getAndDecrement(); } - - /** - * Get carrier config based on specific subscription id. - * - * @param subId is the subscription id - * @return {@link PersistableBundle} of carrier config, or {@code null} when carrier config - * is not available. - */ - public PersistableBundle getCarrierConfigForSubId(int subId) { - if (!SubscriptionManager.isValidSubscriptionId(subId)) { - return null; - } - final CarrierConfigManager carrierConfigMgr = - mContext.getSystemService(CarrierConfigManager.class); - return carrierConfigMgr.getConfigForSubId(subId); - } - - /** - * Returns the resources associated with Subscription. - * - * @return Resources associated with Subscription. - */ - public Resources getResourcesForSubId() { - return SubscriptionManager.getResourcesForSubId(mContext, mSubId); - } } diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerHelperTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerHelperTest.kt new file mode 100644 index 00000000000..8edc90fa24c --- /dev/null +++ b/tests/spa_unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerHelperTest.kt @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2024 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.CarrierConfigManager +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.spy + +@RunWith(AndroidJUnit4::class) +class EnabledNetworkModePreferenceControllerHelperTest { + + private var context: Context = spy(ApplicationProvider.getApplicationContext()) {} + + @Before + fun setUp() { + CarrierConfigRepository.resetForTest() + CarrierConfigRepository.setBooleanForTest( + SUB_ID, CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true) + } + + @Test + fun getNetworkModePreferenceType_hideCarrierNetworkSettings_returnNone() { + CarrierConfigRepository.setBooleanForTest( + SUB_ID, CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL, true) + + val networkModePreferenceType = getNetworkModePreferenceType(context, SUB_ID) + + assertThat(networkModePreferenceType).isEqualTo(NetworkModePreferenceType.None) + } + + @Test + fun getNetworkModePreferenceType_hidePreferredNetworkType_returnNone() { + CarrierConfigRepository.setBooleanForTest( + SUB_ID, CarrierConfigManager.KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL, true) + + val networkModePreferenceType = getNetworkModePreferenceType(context, SUB_ID) + + assertThat(networkModePreferenceType).isEqualTo(NetworkModePreferenceType.None) + } + + @Test + fun getNetworkModePreferenceType_carrierConfigNotReady_returnNone() { + CarrierConfigRepository.setBooleanForTest( + SUB_ID, CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, false) + + val networkModePreferenceType = getNetworkModePreferenceType(context, SUB_ID) + + assertThat(networkModePreferenceType).isEqualTo(NetworkModePreferenceType.None) + } + + @Test + fun getNetworkModePreferenceType_isWorldPhone_returnPreferredNetworkMode() { + CarrierConfigRepository.setBooleanForTest( + SUB_ID, CarrierConfigManager.KEY_WORLD_PHONE_BOOL, true) + + val networkModePreferenceType = getNetworkModePreferenceType(context, SUB_ID) + + assertThat(networkModePreferenceType) + .isEqualTo(NetworkModePreferenceType.PreferredNetworkMode) + } + + @Test + fun getNetworkModePreferenceType_notWorldPhone_returnEnabledNetworkMode() { + CarrierConfigRepository.setBooleanForTest( + SUB_ID, CarrierConfigManager.KEY_WORLD_PHONE_BOOL, false) + + val networkModePreferenceType = getNetworkModePreferenceType(context, SUB_ID) + + assertThat(networkModePreferenceType) + .isEqualTo(NetworkModePreferenceType.EnabledNetworkMode) + } + + private companion object { + const val SUB_ID = 10 + } +} diff --git a/tests/unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java index b3d095e5453..adc8dc0cdc4 100644 --- a/tests/unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java @@ -18,9 +18,6 @@ package com.android.settings.network.telephony; import static androidx.lifecycle.Lifecycle.Event.ON_START; -import static com.android.settings.core.BasePreferenceController.AVAILABLE; -import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE; -import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; import static com.android.settings.network.telephony.MobileNetworkUtils.getRafFromNetworkType; import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.CDMA; import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.EVDO; @@ -33,8 +30,6 @@ import static com.android.settings.network.telephony.TelephonyConstants.RadioAcc import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -123,79 +118,6 @@ public class EnabledNetworkModePreferenceControllerTest { mPreference.setKey(mController.getPreferenceKey()); } - @UiThreadTest - @Test - public void getAvailabilityStatus_hideCarrierNetworkSettings_returnUnavailable() { - mPersistableBundle.putBoolean( - CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL, - true); - - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - } - - @UiThreadTest - @Test - public void getAvailabilityStatus_hidePreferredNetworkType_returnUnavailable() { - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL, - true); - - when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); - when(mServiceState.getDataRegistrationState()).thenReturn( - ServiceState.STATE_OUT_OF_SERVICE); - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - - when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE); - when(mServiceState.getDataRegistrationState()).thenReturn(ServiceState.STATE_IN_SERVICE); - - when(mServiceState.getRoaming()).thenReturn(false); - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - - when(mServiceState.getRoaming()).thenReturn(true); - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - } - - @UiThreadTest - @Test - public void getAvailabilityStatus_carrierConfigNotReady_returnUnavailable() { - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, false); - - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - } - - @UiThreadTest - @Test - public void getAvailabilityStatus_notWorldPhone_returnAvailable() { - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL, - false); - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL, false); - - assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); - } - - @UiThreadTest - @Test - public void getAvailabilityStatus_callStateIsIdle_returnAvailable() { - mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA); - mController.getTelephonyCallback().onCallStateChanged(TelephonyManager.CALL_STATE_IDLE); - - mController.updateState(mPreference); - - assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); - assertTrue(mPreference.isEnabled()); - } - - @UiThreadTest - @Test - public void getAvailabilityStatus_duringCalling_returnAvailable() { - mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA); - mController.getTelephonyCallback().onCallStateChanged(TelephonyManager.CALL_STATE_OFFHOOK); - - mController.updateState(mPreference); - - assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE); - assertFalse(mPreference.isEnabled()); - } - @UiThreadTest @Test public void updateState_LteWorldPhone_GlobalHasLte() { diff --git a/tests/unit/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java index 9dbfdde3d3b..f22ad3bce8d 100644 --- a/tests/unit/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java @@ -16,8 +16,6 @@ package com.android.settings.network.telephony; -import static com.android.settings.core.BasePreferenceController.AVAILABLE; -import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.GSM; import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.RAF_TD_SCDMA; import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.WCDMA; @@ -32,7 +30,6 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.os.PersistableBundle; -import android.telephony.CarrierConfigManager; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -91,43 +88,6 @@ public class PreferredNetworkModePreferenceControllerTest { mPreference.setKey(mController.getPreferenceKey()); } - @Test - public void getAvailabilityStatus_hideCarrierNetworkSettings_returnUnavailable() { - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL, - true); - - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - } - - @Test - public void getAvailabilityStatus_worldPhone_returnAvailable() { - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL, - false); - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL, true); - - assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); - } - - @Test - public void getAvailabilityStatus_hidePreferredNetworkType_returnUnavailable() { - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL, - true); - - when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); - when(mServiceState.getDataRegistrationState()).thenReturn( - ServiceState.STATE_OUT_OF_SERVICE); - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - - when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE); - when(mServiceState.getDataRegistrationState()).thenReturn(ServiceState.STATE_IN_SERVICE); - - when(mServiceState.getRoaming()).thenReturn(false); - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - - when(mServiceState.getRoaming()).thenReturn(true); - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - } - @Test public void updateState_updateByNetworkMode() { // NETWORK_MODE_TDSCDMA_GSM_WCDMA = RAF_TD_SCDMA | GSM | WCDMA