From 292f1bdd0198c87214db7b0d87b1a9a47fff2a8e Mon Sep 17 00:00:00 2001 From: tom hsu Date: Mon, 10 Feb 2025 03:59:02 +0000 Subject: [PATCH] [Satellite] Add satellite string for KDDI if no entitlement - Currently Android only handles Satellite w/ entitlement for any notifications. Some carriers such as KDDI have no entitlement for satellite service, so this change is to add some strings to avoid any confuse to Android user on satellite service. Flag: EXEMPT resource update Fix: b/382387532 Test: Manual test Test: atest pass Change-Id: I835787c9e0fe29eeecec0470e9bd6b38939abd8c --- res/values/strings.xml | 10 +- .../network/telephony/SatelliteSetting.java | 22 ++- .../SatelliteSettingPreferenceController.java | 58 ++++---- ...lliteSettingsPreferenceControllerTest.java | 127 +++++++++++++++--- 4 files changed, 166 insertions(+), 51 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 39e0dbdf4e8..45183b69c9d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12533,12 +12533,14 @@ Invalid Network Mode %1$d. Ignore. - + Satellite messaging - + Send and receive text messages by satellite. Included with your account. - + Send and receive text messages by satellite. Not included with your account. + + Send and receive text messages by satellite. Contact your carrier for details. Satellite messaging, satellite connectivity @@ -12565,6 +12567,8 @@ You can text anyone, including emergency services. Your phone will reconnect to a mobile network when available. %1$s may take longer and is available only in some areas. Weather and certain structures may affect your satellite connection. Calling by satellite isn\u2019t available. Emergency calls may still connect.\n\nIt may take some time for account changes to show in Settings. Contact %2$s for details. + + %1$s may take longer and is available only in some areas. Weather and certain structures may affect your satellite connection. Calling by satellite isn\u2019t available. Emergency calls may still connect. Texting with emergency services may not be available in all areas.\n\nIt may take some time for account changes to show in Settings. Contact %2$s for details. More about %1$s diff --git a/src/com/android/settings/network/telephony/SatelliteSetting.java b/src/com/android/settings/network/telephony/SatelliteSetting.java index 52957d98b30..d4bd212d153 100644 --- a/src/com/android/settings/network/telephony/SatelliteSetting.java +++ b/src/com/android/settings/network/telephony/SatelliteSetting.java @@ -19,7 +19,9 @@ package com.android.settings.network.telephony; import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC; import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_MANUAL; import static android.telephony.CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT; +import static android.telephony.CarrierConfigManager.KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL; import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL; +import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL; import static android.telephony.CarrierConfigManager.KEY_SATELLITE_INFORMATION_REDIRECT_URL_STRING; import android.app.Activity; @@ -165,8 +167,14 @@ public class SatelliteSetting extends RestrictedDashboardFragment { } private void updateMobilePlan(boolean isSatelliteEligible) { - // Your mobile plan PreferenceCategory prefCategory = findPreference(PREF_KEY_CATEGORY_YOUR_SATELLITE_PLAN); + if (prefCategory == null || !mConfigBundle.getBoolean( + KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL)) { + prefCategory.setVisible(false); + return; + } + + // Your mobile plan prefCategory.setTitle(getResources().getString(R.string.category_title_your_satellite_plan, mSimOperatorName)); Preference messagingPreference = findPreference(PREF_KEY_YOUR_SATELLITE_PLAN); @@ -227,9 +235,11 @@ public class SatelliteSetting extends RestrictedDashboardFragment { // More about satellite messaging FooterPreference footerPreference = findPreference(KEY_FOOTER_PREFERENCE); if (footerPreference != null) { - footerPreference.setSummary( - getResources().getString(R.string.satellite_setting_summary_more_information, - getSubjectString(), mSimOperatorName)); + int summary = mConfigBundle.getBoolean(KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL) + ? R.string.satellite_setting_summary_more_information + : R.string.satellite_setting_summary_more_information_no_emergency_messaging; + footerPreference.setSummary(getResources().getString(summary, + getSubjectString(), mSimOperatorName)); final String[] link = new String[1]; link[0] = readSatelliteMoreInfoString(); @@ -273,7 +283,9 @@ public class SatelliteSetting extends RestrictedDashboardFragment { bundle = carrierConfigManager.getConfigForSubId(subId, KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, KEY_SATELLITE_INFORMATION_REDIRECT_URL_STRING, - KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT); + KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, + KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL); if (bundle.isEmpty()) { Log.d(TAG, "SatelliteSettings: getDefaultConfig"); bundle = CarrierConfigManager.getDefaultConfig(); diff --git a/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java b/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java index e2c6412ba57..fd82e5c77f4 100644 --- a/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java +++ b/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java @@ -17,9 +17,9 @@ package com.android.settings.network.telephony; import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC; -import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_MANUAL; import static android.telephony.CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT; import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL; +import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL; import static android.telephony.NetworkRegistrationInfo.SERVICE_TYPE_DATA; import static android.telephony.NetworkRegistrationInfo.SERVICE_TYPE_SMS; @@ -65,9 +65,9 @@ public class SatelliteSettingPreferenceController extends @Nullable private Boolean mIsSatelliteEligible = null; private boolean mIsServiceDataType = false; - private boolean mIsSatelliteSmsAvailableForManualType = false; - private boolean mIsCarrierSatelliteAttachSupported = false; - private boolean mIsCarrierRoamingNtnConnectedTypeManual = false; + @VisibleForTesting + boolean mIsSatelliteSmsAvailableForManualType = false; + private PersistableBundle mCarrierConfigs = new PersistableBundle(); public SatelliteSettingPreferenceController(@NonNull Context context, @NonNull String key) { super(context, key); @@ -95,13 +95,15 @@ public class SatelliteSettingPreferenceController extends return UNSUPPORTED_ON_DEVICE; } - int availabilityStatus = mIsCarrierSatelliteAttachSupported - ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; - if (availabilityStatus == AVAILABLE && mIsCarrierRoamingNtnConnectedTypeManual - && !mIsSatelliteSmsAvailableForManualType) { - availabilityStatus = CONDITIONALLY_UNAVAILABLE; + boolean isSatelliteAttachSupport = mCarrierConfigs.getBoolean( + KEY_SATELLITE_ATTACH_SUPPORTED_BOOL); + + if (isSatelliteAttachSupport && isCarrierRoamingNtnConnectedTypeAuto() + && mIsSatelliteSmsAvailableForManualType) { + return AVAILABLE; } - return availabilityStatus; + + return CONDITIONALLY_UNAVAILABLE; } @Override @@ -128,7 +130,7 @@ public class SatelliteSettingPreferenceController extends @Override public void updateState(@Nullable Preference preference) { super.updateState(preference); - if (preference != null) { + if (preference != null && preference.getKey().equals(getPreferenceKey())) { mCarrierRoamingNtnModeCallback.mPref = preference; updateSummary(preference); } @@ -162,18 +164,7 @@ public class SatelliteSettingPreferenceController extends logd("init(), subId=" + subId); mSubId = subId; mTelephonyManager = mTelephonyManager.createForSubscriptionId(subId); - - final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(subId); - if (carrierConfig == null) { - logd("init(), no carrier config data"); - return; - } - mIsCarrierSatelliteAttachSupported = carrierConfig.getBoolean( - KEY_SATELLITE_ATTACH_SUPPORTED_BOOL); - mIsCarrierRoamingNtnConnectedTypeManual = - CARRIER_ROAMING_NTN_CONNECT_MANUAL == carrierConfig.getInt( - KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, - CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC); + mCarrierConfigs = mCarrierConfigCache.getConfigForSubId(subId); } private void updateSummary(Preference preference) { @@ -186,11 +177,12 @@ public class SatelliteSettingPreferenceController extends return; } - if (mIsCarrierRoamingNtnConnectedTypeManual) { - preference.setSummary(mIsSatelliteSmsAvailableForManualType - ? R.string.satellite_setting_enabled_summary - : R.string.satellite_setting_disabled_summary); - } else { + if (!mCarrierConfigs.getBoolean(KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL)) { + preference.setSummary(R.string.satellite_setting_summary_without_entitlement); + return; + } + + if (isCarrierRoamingNtnConnectedTypeAuto()) { try { Set restrictionReason = mSatelliteManager.getAttachRestrictionReasonsForCarrier(mSubId); @@ -207,9 +199,19 @@ public class SatelliteSettingPreferenceController extends loge(ex.toString()); preference.setSummary(R.string.satellite_setting_disabled_summary); } + } else { + preference.setSummary(mIsSatelliteSmsAvailableForManualType + ? R.string.satellite_setting_enabled_summary + : R.string.satellite_setting_disabled_summary); } } + private boolean isCarrierRoamingNtnConnectedTypeAuto() { + return CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC == mCarrierConfigs.getInt( + KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC); + } + @VisibleForTesting class CarrierRoamingNtnModeCallback extends TelephonyCallback implements TelephonyCallback.CarrierRoamingNtnListener { diff --git a/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceControllerTest.java index 6e650fd883f..8fcb32e493d 100644 --- a/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceControllerTest.java @@ -16,10 +16,12 @@ package com.android.settings.network.telephony; +import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC; +import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_MANUAL; +import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL; import static android.telephony.NetworkRegistrationInfo.SERVICE_TYPE_DATA; import static android.telephony.NetworkRegistrationInfo.SERVICE_TYPE_SMS; -import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; @@ -39,6 +41,9 @@ import android.telephony.TelephonyManager; import android.telephony.satellite.SatelliteManager; import androidx.preference.Preference; +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; +import androidx.test.annotation.UiThreadTest; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -47,7 +52,6 @@ import com.android.settings.R; import com.android.settings.network.CarrierConfigCache; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -56,10 +60,10 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @RunWith(AndroidJUnit4.class) -@Ignore("b/382664790") +@UiThreadTest public class SatelliteSettingsPreferenceControllerTest { - private static final String KEY = "key"; - private static final int TEST_SUB_ID = 0; + private static final String KEY = "SatelliteSettingsPreferenceControllerTest"; + private static final int TEST_SUB_ID = 5; @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); @@ -85,12 +89,13 @@ public class SatelliteSettingsPreferenceControllerTest { when(mContext.getSystemService(SatelliteManager.class)).thenReturn(mSatelliteManager); when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); when(mTelephonyManager.createForSubscriptionId(TEST_SUB_ID)).thenReturn(mTelephonyManager); + when(mCarrierConfigCache.getConfigForSubId(TEST_SUB_ID)).thenReturn(mCarrierConfig); mController = spy(new SatelliteSettingPreferenceController(mContext, KEY)); } @Test @EnableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) - public void getAvailabilityStatus_noSatellite_returnUnsupport() { + public void getAvailabilityStatus_noSatellite_returnUnsupported() { when(mContext.getSystemService(SatelliteManager.class)).thenReturn(null); mController = new SatelliteSettingPreferenceController(mContext, KEY); @@ -102,11 +107,39 @@ public class SatelliteSettingsPreferenceControllerTest { @Test @EnableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) public void getAvailabilityStatus_carrierIsNotSupport_returnUnavailable() { - when(mContext.getSystemService(SatelliteManager.class)).thenReturn(null); mCarrierConfig.putBoolean( CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, false); - when(mCarrierConfigCache.getConfigForSubId(TEST_SUB_ID)).thenReturn(mCarrierConfig); + int result = mController.getAvailabilityStatus(TEST_SUB_ID); + + assertThat(result).isEqualTo(CONDITIONALLY_UNAVAILABLE); + } + + @Test + @EnableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) + public void getAvailabilityStatus_ntnConnectIsManual_returnUnavailable() { + mCarrierConfig.putBoolean( + CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, + true); + mCarrierConfig.putInt( + CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_MANUAL); + int result = mController.getAvailabilityStatus(TEST_SUB_ID); + + assertThat(result).isEqualTo(CONDITIONALLY_UNAVAILABLE); + } + + @Test + @EnableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) + public void getAvailabilityStatus_smsNotAvailable_returnUnavailable() { + mCarrierConfig.putBoolean( + CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, + true); + mCarrierConfig.putInt( + CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC); + mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged( + new int[]{SERVICE_TYPE_SMS}); int result = mController.getAvailabilityStatus(TEST_SUB_ID); @@ -115,22 +148,25 @@ public class SatelliteSettingsPreferenceControllerTest { @Test @EnableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) - public void getAvailabilityStatus_carrierIsSupport_returnAvailable() { - when(mContext.getSystemService(SatelliteManager.class)).thenReturn(null); + public void getAvailabilityStatus_matchAllConditions_returnAvailable() { mCarrierConfig.putBoolean( CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true); - when(mCarrierConfigCache.getConfigForSubId(TEST_SUB_ID)).thenReturn(mCarrierConfig); + mCarrierConfig.putInt( + CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC); + + mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged( + new int[]{SERVICE_TYPE_SMS}); int result = mController.getAvailabilityStatus(TEST_SUB_ID); - assertThat(result).isEqualTo(AVAILABLE); + assertThat(result).isEqualTo(CONDITIONALLY_UNAVAILABLE); } @Test - @Ignore("avoid post submit failed") @EnableFlags(com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION) - public void getAvailabilityStatus_registerTelephonyCallback_success() { + public void onResume_registerTelephonyCallback_success() { mController.init(TEST_SUB_ID); mController.onResume(null); @@ -138,7 +174,6 @@ public class SatelliteSettingsPreferenceControllerTest { } @Test - @Ignore("avoid post submit failed") @EnableFlags(com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION) public void getAvailabilityStatus_unregisterTelephonyCallback_success() { mController.init(TEST_SUB_ID); @@ -178,4 +213,66 @@ public class SatelliteSettingsPreferenceControllerTest { assertThat(preference.getTitle()).isEqualTo( mContext.getString(R.string.satellite_setting_title)); } + + @Test + @EnableFlags(com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION) + public void getAvailabilityStatus_noEntitlement_showSummaryWithoutEntitlement() { + mCarrierConfig.putBoolean( + KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, + false); + mController.init(TEST_SUB_ID); + Preference preference = new Preference(mContext); + preference.setKey(KEY); + preference.setTitle("test title"); + mController.updateState(preference); + + assertThat(preference.getSummary()).isEqualTo( + mContext.getString(R.string.satellite_setting_summary_without_entitlement)); + } + + @Test + @EnableFlags(com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION) + public void getAvailabilityStatus_smsAvailableForManualType_showSummaryWithAccount() { + mCarrierConfig.putBoolean( + KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, + true); + mCarrierConfig.putInt( + CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_MANUAL); + mController.init(TEST_SUB_ID); + PreferenceManager preferenceManager = new PreferenceManager(mContext); + PreferenceScreen preferenceScreen = preferenceManager.createPreferenceScreen(mContext); + Preference preference = new Preference(mContext); + preference.setKey(KEY); + preference.setTitle("test title"); + preferenceScreen.addPreference(preference); + mController.mIsSatelliteSmsAvailableForManualType = true; + mController.displayPreference(preferenceScreen); + + assertThat(preference.getSummary()).isEqualTo( + mContext.getString(R.string.satellite_setting_enabled_summary)); + } + + @Test + @EnableFlags(com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION) + public void getAvailabilityStatus_smsAvailableForAutoType_showSummaryWithoutAccount() { + mCarrierConfig.putBoolean( + KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, + true); + mCarrierConfig.putInt( + CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_MANUAL); + mController.init(TEST_SUB_ID); + PreferenceManager preferenceManager = new PreferenceManager(mContext); + PreferenceScreen preferenceScreen = preferenceManager.createPreferenceScreen(mContext); + Preference preference = new Preference(mContext); + preference.setKey(KEY); + preference.setTitle("test title"); + preferenceScreen.addPreference(preference); + mController.mIsSatelliteSmsAvailableForManualType = false; + mController.displayPreference(preferenceScreen); + + assertThat(preference.getSummary()).isEqualTo( + mContext.getString(R.string.satellite_setting_disabled_summary)); + } }