diff --git a/aconfig/Android.bp b/aconfig/Android.bp index 51d977ab131..57b7476b6ff 100644 --- a/aconfig/Android.bp +++ b/aconfig/Android.bp @@ -11,6 +11,7 @@ aconfig_declarations { "settings_globalintl_flag_declarations.aconfig", "settings_apn_flag_declarations.aconfig", "settings_onboarding_experience_flag_declarations.aconfig", + "settings_telephony_flag_declarations.aconfig", ], } diff --git a/aconfig/settings_telephony_flag_declarations.aconfig b/aconfig/settings_telephony_flag_declarations.aconfig new file mode 100644 index 00000000000..68e313b4567 --- /dev/null +++ b/aconfig/settings_telephony_flag_declarations.aconfig @@ -0,0 +1,8 @@ +package: "com.android.settings.flags" + +flag { + name: "remove_key_hide_enable_2g" + namespace: "cellular_security" + description: "Stop honoring CarrierConfigManager.KEY_HIDE_ENABLE_2G. Allow 2G toggle cannot be hidden from users by carriers." + bug: "300248708" +} diff --git a/src/com/android/settings/network/telephony/Enable2gPreferenceController.java b/src/com/android/settings/network/telephony/Enable2gPreferenceController.java index 9d9958ffa51..e941ce547a4 100644 --- a/src/com/android/settings/network/telephony/Enable2gPreferenceController.java +++ b/src/com/android/settings/network/telephony/Enable2gPreferenceController.java @@ -29,6 +29,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settings.flags.Flags; import com.android.settings.network.CarrierConfigCache; import com.android.settings.network.SubscriptionUtil; import com.android.settings.overlay.FeatureFactory; @@ -111,19 +112,25 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr return; } - final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(mSubId); - boolean isDisabledByCarrier = - carrierConfig != null - && carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G); - preference.setEnabled(!isDisabledByCarrier); - String summary; - if (isDisabledByCarrier) { - summary = mContext.getString(R.string.enable_2g_summary_disabled_carrier, - getSimCardName()); + // TODO: b/303411083 remove all dynamic logic and rely on summary in resource file once flag + // is no longer needed + if (Flags.removeKeyHideEnable2g()) { + preference.setSummary(mContext.getString(R.string.enable_2g_summary)); } else { - summary = mContext.getString(R.string.enable_2g_summary); + final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(mSubId); + boolean isDisabledByCarrier = + carrierConfig != null + && carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G); + preference.setEnabled(!isDisabledByCarrier); + String summary; + if (isDisabledByCarrier) { + summary = mContext.getString(R.string.enable_2g_summary_disabled_carrier, + getSimCardName()); + } else { + summary = mContext.getString(R.string.enable_2g_summary); + } + preference.setSummary(summary); } - preference.setSummary(summary); } private String getSimCardName() { @@ -154,14 +161,12 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr */ @Override public int getAvailabilityStatus(int subId) { - final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(subId); if (mTelephonyManager == null) { Log.w(LOG_TAG, "Telephony manager not yet initialized"); mTelephonyManager = mContext.getSystemService(TelephonyManager.class); } boolean visible = SubscriptionManager.isUsableSubscriptionId(subId) - && carrierConfig != null && mTelephonyManager.isRadioInterfaceCapabilitySupported( mTelephonyManager.CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK); return visible ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp index eb3898043c2..1b14a734436 100644 --- a/tests/unit/Android.bp +++ b/tests/unit/Android.bp @@ -18,6 +18,7 @@ android_test { ], static_libs: [ + "aconfig_settings_flags_lib", "androidx.arch.core_core-testing", "androidx.test.core", "androidx.test.rules", diff --git a/tests/unit/src/com/android/settings/network/telephony/Enable2gPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/Enable2gPreferenceControllerTest.java index 22f2d3a3bb3..962a33b07ae 100644 --- a/tests/unit/src/com/android/settings/network/telephony/Enable2gPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/Enable2gPreferenceControllerTest.java @@ -29,19 +29,23 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.os.Looper; import android.os.PersistableBundle; +import android.platform.test.flag.junit.SetFlagsRule; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import androidx.preference.Preference; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.android.settings.flags.Flags; import com.android.settings.network.CarrierConfigCache; import com.android.settingslib.RestrictedSwitchPreference; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -49,6 +53,8 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public final class Enable2gPreferenceControllerTest { + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private static final int SUB_ID = 2; private static final String PREFERENCE_KEY = "TEST_2G_PREFERENCE"; @@ -102,31 +108,10 @@ public final class Enable2gPreferenceControllerTest { assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } - @Test - public void getAvailabilityStatus_hideEnable2g_returnUnavailable() { - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G, - true); - - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - } - - @Test - public void getAvailabilityStatus_nullCarrierConfig_returnUnavailable() { - doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported( - mTelephonyManager.CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK); - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G, - false); - doReturn(null).when(mCarrierConfigCache).getConfigForSubId(SUB_ID); - - assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); - } - @Test public void getAvailabilityStatus_capabilityNotSupported_returnUnavailable() { doReturn(false).when(mTelephonyManager).isRadioInterfaceCapabilitySupported( mTelephonyManager.CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK); - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G, - false); assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } @@ -135,8 +120,6 @@ public final class Enable2gPreferenceControllerTest { public void getAvailabilityStatus_returnAvailable() { doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported( mTelephonyManager.CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK); - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G, - false); assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } @@ -160,15 +143,9 @@ public final class Enable2gPreferenceControllerTest { } @Test - public void onPreferenceChange_update() { + public void setChecked_disable2G() { when2gIsEnabledForReasonEnable2g(); - // Setup state to allow disabling - doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported( - mTelephonyManager.CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK); - mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G, - false); - // Disable 2G boolean changed = mController.setChecked(false); assertThat(changed).isEqualTo(true); @@ -201,6 +178,43 @@ public final class Enable2gPreferenceControllerTest { assertThat(mController.isChecked()).isTrue(); } + @Test + public void updateState_carrierDisablementSupported_carrierHidesToggle() { + mSetFlagsRule.disableFlags(Flags.FLAG_REMOVE_KEY_HIDE_ENABLE_2G); + when2gIsDisabledByAdmin(false); + mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G, true); + mPreference.setEnabled(true); + + mController.updateState((Preference) mPreference); + + assertThat(mPreference.isEnabled()).isFalse(); + } + + @Test + public void updateState_carrierDisablementSupported_carrierShowsToggle() { + mSetFlagsRule.disableFlags(Flags.FLAG_REMOVE_KEY_HIDE_ENABLE_2G); + when2gIsDisabledByAdmin(false); + mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G, false); + mPreference.setEnabled(true); + + mController.updateState((Preference) mPreference); + + assertThat(mPreference.isEnabled()).isTrue(); + } + + @Test + public void updateState_carrierDisablementRemoved() { + mSetFlagsRule.enableFlags(Flags.FLAG_REMOVE_KEY_HIDE_ENABLE_2G); + mPreference.setEnabled(true); + when2gIsDisabledByAdmin(false); + // Set the config, so that we can later assert it was ignored + mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G, true); + + mController.updateState((Preference) mPreference); + + assertThat(mPreference.isEnabled()).isTrue(); + } + private void when2gIsEnabledForReasonEnable2g() { when(mTelephonyManager.getAllowedNetworkTypesForReason( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G)).thenReturn(