diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java index a90d627c644..82537d48392 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java @@ -27,6 +27,7 @@ import android.content.res.Resources; import android.os.Bundle; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; +import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; @@ -49,6 +50,7 @@ import androidx.preference.PreferenceScreen; import com.android.ims.ImsConfig; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.Phone; +import com.android.internal.telephony.flags.Flags; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsPreferenceFragment; @@ -97,6 +99,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment private boolean mEditableWfcMode = true; private boolean mEditableWfcRoamingMode = true; private boolean mUseWfcHomeModeForRoaming = false; + private boolean mOverrideWfcRoamingModeWhileUsingNtn = false; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private ImsMmTelManager mImsMmTelManager; @@ -166,7 +169,8 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment final Preference pref_roam = getPreferenceScreen().findPreference(BUTTON_WFC_ROAMING_MODE); if (pref_roam != null) { - pref_roam.setEnabled(isWfcRoamingModeEditable); + pref_roam.setEnabled(isWfcRoamingModeEditable + && !overrideWfcRoamingModeWhileUsingNtn()); } } } @@ -361,6 +365,9 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment false); isWifiOnlySupported = b.getBoolean( CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, true); + mOverrideWfcRoamingModeWhileUsingNtn = b.getBoolean( + CarrierConfigManager.KEY_OVERRIDE_WFC_ROAMING_MODE_WHILE_USING_NTN_BOOL, + true); } } @@ -577,7 +584,8 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment mButtonWfcMode.setSummary(getWfcModeSummary(wfcMode)); mButtonWfcMode.setEnabled(wfcEnabled && mEditableWfcMode); // mButtonWfcRoamingMode.setSummary is not needed; summary is just selected value. - mButtonWfcRoamingMode.setEnabled(wfcEnabled && mEditableWfcRoamingMode); + mButtonWfcRoamingMode.setEnabled(wfcEnabled && mEditableWfcRoamingMode + && !overrideWfcRoamingModeWhileUsingNtn()); final PreferenceScreen preferenceScreen = getPreferenceScreen(); final boolean updateAddressEnabled = (getCarrierActivityIntent() != null); @@ -711,4 +719,30 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment } mProvisioningManager.unregisterProvisioningChangedCallback(mProvisioningCallback); } + + /** + * Determine whether to override roaming Wi-Fi calling preference when device is connected to + * non-terrestrial network. + * + * @return {@code true} if phone is connected to non-terrestrial network and if + * {@link CarrierConfigManager#KEY_OVERRIDE_WFC_ROAMING_MODE_WHILE_USING_NTN_BOOL} is true, + * {@code false} otherwise. + */ + private boolean overrideWfcRoamingModeWhileUsingNtn() { + if (!Flags.carrierEnabledSatelliteFlag()) { + return false; + } + + TelephonyManager tm = getTelephonyManagerForSub(mSubId); + ServiceState serviceState = tm.getServiceState(); + if (serviceState == null) { + return false; + } + + if (!serviceState.isUsingNonTerrestrialNetwork()) { + return false; + } + + return mOverrideWfcRoamingModeWhileUsingNtn; + } } diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java index 2e6189ea16d..4497a0a62b9 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java @@ -40,7 +40,10 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.PersistableBundle; +import android.platform.test.flag.junit.SetFlagsRule; import android.telephony.CarrierConfigManager; +import android.telephony.NetworkRegistrationInfo; +import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.telephony.ims.ImsMmTelManager; import android.view.View; @@ -48,6 +51,7 @@ import android.view.View; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import com.android.internal.telephony.flags.Flags; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.network.ims.MockWifiCallingQueryImsState; @@ -57,6 +61,7 @@ import com.android.settings.widget.SettingsMainSwitchBar; import com.android.settings.widget.SettingsMainSwitchPreference; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -70,6 +75,7 @@ import org.robolectric.util.ReflectionHelpers; @Config(shadows = ShadowFragment.class) @RunWith(RobolectricTestRunner.class) public class WifiCallingSettingsForSubTest { + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private static final int SUB_ID = 2; private static final String SWITCH_BAR = "wifi_calling_switch_bar"; @@ -158,6 +164,7 @@ public class WifiCallingSettingsForSubTest { mFragment.onAttach(mContext); mFragment.onCreate(null); mFragment.onActivityCreated(null); + mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG); } private void setDefaultCarrierConfigValues() { @@ -240,6 +247,31 @@ public class WifiCallingSettingsForSubTest { verify(mButtonWfcRoamingMode, times(1)).setVisible(false); } + @Test + public void onResume_overrideWfcRoamingModeWhileUsingNTN_shouldDisableWfcRoaming() { + mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG); + mBundle.putBoolean( + CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, false); + mBundle.putBoolean(CarrierConfigManager.KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, true); + mBundle.putBoolean( + CarrierConfigManager.KEY_OVERRIDE_WFC_ROAMING_MODE_WHILE_USING_NTN_BOOL, true); + + // Phone connected to non-terrestrial network + NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder() + .setIsNonTerrestrialNetwork(true) + .build(); + ServiceState ss = new ServiceState(); + ss.addNetworkRegistrationInfo(nri); + doReturn(ss).when(mTelephonyManager).getServiceState(); + + // Call onResume to update the WFC roaming preference. + mFragment.onResume(); + + // Check that WFC roaming preference is visible but disabled + verify(mButtonWfcRoamingMode, times(1)).setEnabled(false); + verify(mButtonWfcRoamingMode, times(1)).setVisible(true); + } + @Test public void onResume_useWfcHomeModeConfigTrueAndNotEditable_shouldHideWfcRoaming() { mBundle.putBoolean(