From 048be18c5e2ce31685e00d06cb95f9487b23fd90 Mon Sep 17 00:00:00 2001 From: tom hsu Date: Mon, 17 Feb 2025 17:22:07 +0000 Subject: [PATCH] Make Satellite UI updatable during receiving callback (part I) - Refactor code - Make Satellite category and preference be updatable by callback. Flag: EXEMPT bug fix Fix: 396233604 Test: atest pass Change-Id: If2e3d9b82950f05c4911ee7ce3bb41fb26e0d3e4 --- .../SatelliteSettingPreferenceController.java | 142 +++++++++++------- ...lliteSettingsPreferenceControllerTest.java | 93 +++++++----- 2 files changed, 141 insertions(+), 94 deletions(-) diff --git a/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java b/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java index 5ee1dd96e03..f7f4fc09c3c 100644 --- a/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java +++ b/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java @@ -58,30 +58,34 @@ public class SatelliteSettingPreferenceController extends private static final String TAG = "SatelliteSettingPreferenceController"; @VisibleForTesting final CarrierRoamingNtnModeCallback mCarrierRoamingNtnModeCallback = - new CarrierRoamingNtnModeCallback(); + new CarrierRoamingNtnModeCallback(this); CarrierConfigCache mCarrierConfigCache; SatelliteManager mSatelliteManager; - private TelephonyManager mTelephonyManager = null; + private TelephonyManager mTelephonyManager; @Nullable private Boolean mIsSatelliteEligible = null; - private boolean mIsServiceDataType = false; - @VisibleForTesting - boolean mIsSatelliteSmsAvailableForManualType = false; private PersistableBundle mCarrierConfigs = new PersistableBundle(); + private PreferenceScreen mPreferenceScreen; public SatelliteSettingPreferenceController(@NonNull Context context, @NonNull String key) { super(context, key); - mCarrierConfigCache = CarrierConfigCache.getInstance(context); - mSatelliteManager = context.getSystemService(SatelliteManager.class); - mTelephonyManager = context.getSystemService(TelephonyManager.class); } - private static void logd(String message) { - Log.d(TAG, message); - } - - private static void loge(String message) { - Log.e(TAG, message); + /** + * Set subId for Satellite Settings page. + * + * @param subId subscription ID. + */ + public void initialize(int subId) { + logd("initialize(), subId=" + subId); + mSubId = subId; + mCarrierConfigCache = CarrierConfigCache.getInstance(mContext); + mSatelliteManager = mContext.getSystemService(SatelliteManager.class); + mTelephonyManager = mContext.getSystemService(TelephonyManager.class); + if (mTelephonyManager != null) { + mTelephonyManager = mTelephonyManager.createForSubscriptionId(subId); + } + mCarrierConfigs = mCarrierConfigCache.getConfigForSubId(subId); } @Override @@ -95,43 +99,58 @@ public class SatelliteSettingPreferenceController extends return UNSUPPORTED_ON_DEVICE; } - boolean isSatelliteAttachSupport = mCarrierConfigs.getBoolean( - KEY_SATELLITE_ATTACH_SUPPORTED_BOOL); - - if (isSatelliteAttachSupport && isCarrierRoamingNtnConnectedTypeAuto() - && mIsSatelliteSmsAvailableForManualType) { - return AVAILABLE; + if (!mCarrierConfigs.getBoolean(KEY_SATELLITE_ATTACH_SUPPORTED_BOOL)) { + return CONDITIONALLY_UNAVAILABLE; } - return CONDITIONALLY_UNAVAILABLE; + if (isCarrierRoamingNtnConnectedTypeManual()) { + return mCarrierRoamingNtnModeCallback.isSatelliteSmsAvailable() + ? AVAILABLE + : CONDITIONALLY_UNAVAILABLE; + } else { + return AVAILABLE; + } } @Override public void onResume(@NonNull LifecycleOwner owner) { if (com.android.settings.flags.Flags.satelliteOemSettingsUxMigration()) { - mTelephonyManager.registerTelephonyCallback(mContext.getMainExecutor(), - mCarrierRoamingNtnModeCallback); + if (mTelephonyManager != null) { + mTelephonyManager.registerTelephonyCallback(mContext.getMainExecutor(), + mCarrierRoamingNtnModeCallback); + } } } @Override public void onPause(@NonNull LifecycleOwner owner) { if (com.android.settings.flags.Flags.satelliteOemSettingsUxMigration()) { - mTelephonyManager.unregisterTelephonyCallback(mCarrierRoamingNtnModeCallback); + if (mTelephonyManager != null) { + mTelephonyManager.unregisterTelephonyCallback(mCarrierRoamingNtnModeCallback); + } } } @Override public void displayPreference(@NonNull PreferenceScreen screen) { super.displayPreference(screen); + if (mPreferenceScreen == null) { + mPreferenceScreen = screen; + } updateState(screen.findPreference(getPreferenceKey())); } + void displayPreference() { + if (mPreferenceScreen != null) { + displayPreference(mPreferenceScreen); + } + } + @Override public void updateState(@Nullable Preference preference) { super.updateState(preference); if (preference != null && preference.getKey().equals(getPreferenceKey())) { - mCarrierRoamingNtnModeCallback.mPref = preference; + updateTitle(preference); updateSummary(preference); } } @@ -145,9 +164,10 @@ public class SatelliteSettingPreferenceController extends // This will setup the Home and Search affordance intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, true); intent.putExtra(SatelliteSetting.SUB_ID, mSubId); - intent.putExtra(SatelliteSetting.EXTRA_IS_SERVICE_DATA_TYPE, mIsServiceDataType); + intent.putExtra(SatelliteSetting.EXTRA_IS_SERVICE_DATA_TYPE, + mCarrierRoamingNtnModeCallback.isSatelliteServiceDataType()); intent.putExtra(SatelliteSetting.EXTRA_IS_SMS_AVAILABLE_FOR_MANUAL_TYPE, - mIsSatelliteSmsAvailableForManualType); + mCarrierRoamingNtnModeCallback.isSatelliteSmsAvailable()); mContext.startActivity(intent); return true; } @@ -155,16 +175,10 @@ public class SatelliteSettingPreferenceController extends return false; } - /** - * Set subId for Satellite Settings page. - * - * @param subId subscription ID. - */ - public void initialize(int subId) { - logd("init(), subId=" + subId); - mSubId = subId; - mTelephonyManager = mTelephonyManager.createForSubscriptionId(subId); - mCarrierConfigs = mCarrierConfigCache.getConfigForSubId(subId); + private void updateTitle(Preference preference) { + preference.setTitle(mCarrierRoamingNtnModeCallback.isSatelliteServiceDataType() + ? R.string.title_satellite_setting_connectivity + : R.string.satellite_setting_title); } private void updateSummary(Preference preference) { @@ -182,7 +196,12 @@ public class SatelliteSettingPreferenceController extends return; } - if (isCarrierRoamingNtnConnectedTypeAuto()) { + if (isCarrierRoamingNtnConnectedTypeManual()) { + preference.setSummary( + mCarrierRoamingNtnModeCallback.isSatelliteSmsAvailable() + ? R.string.satellite_setting_enabled_summary + : R.string.satellite_setting_disabled_summary); + } else { try { Set restrictionReason = mSatelliteManager.getAttachRestrictionReasonsForCarrier(mSubId); @@ -199,23 +218,42 @@ 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( + private boolean isCarrierRoamingNtnConnectedTypeManual() { + return CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC != mCarrierConfigs.getInt( KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC); } + private static void logd(String message) { + Log.d(TAG, message); + } + + private static void loge(String message) { + Log.e(TAG, message); + } + @VisibleForTesting - class CarrierRoamingNtnModeCallback extends TelephonyCallback implements + static class CarrierRoamingNtnModeCallback extends TelephonyCallback implements TelephonyCallback.CarrierRoamingNtnListener { - Preference mPref = null; + SatelliteSettingPreferenceController mSatelliteSettingPreferenceController; + private boolean mIsSatelliteServiceDataType = false; + private boolean mIsSatelliteSmsAvailable = false; + + CarrierRoamingNtnModeCallback( + SatelliteSettingPreferenceController satelliteSettingPreferenceController) { + mSatelliteSettingPreferenceController = satelliteSettingPreferenceController; + } + + boolean isSatelliteServiceDataType() { + return mIsSatelliteServiceDataType; + } + + boolean isSatelliteSmsAvailable() { + return mIsSatelliteSmsAvailable; + } @Override public void onCarrierRoamingNtnAvailableServicesChanged(int[] availableServices) { @@ -226,15 +264,9 @@ public class SatelliteSettingPreferenceController extends boolean isDataAvailable = availableServicesList.contains(SERVICE_TYPE_DATA); logd("isSmsAvailable : " + isSmsAvailable + " / isDataAvailable " + isDataAvailable); - if (mPref == null) { - logd("Satellite preference is not initialized yet"); - return; - } - mIsServiceDataType = isDataAvailable; - mIsSatelliteSmsAvailableForManualType = isSmsAvailable; - mPref.setTitle(isDataAvailable ? R.string.title_satellite_setting_connectivity - : R.string.satellite_setting_title); - updateSummary(mPref); + mIsSatelliteServiceDataType = isDataAvailable; + mIsSatelliteSmsAvailable = isSmsAvailable; + mSatelliteSettingPreferenceController.displayPreference(); } @Override 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 2c11647e1e7..5a0456d22d5 100644 --- a/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceControllerTest.java @@ -22,6 +22,7 @@ import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_S 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; @@ -72,10 +73,9 @@ public class SatelliteSettingsPreferenceControllerTest { @Mock private TelephonyManager mTelephonyManager; - private Context mContext = null; - private SatelliteManager mSatelliteManager; - private SatelliteSettingPreferenceController mController = null; - private PersistableBundle mCarrierConfig = new PersistableBundle(); + private Context mContext; + private SatelliteSettingPreferenceController mController; + private final PersistableBundle mCarrierConfig = new PersistableBundle(); @Before public void setUp() { @@ -83,13 +83,13 @@ public class SatelliteSettingsPreferenceControllerTest { Looper.prepare(); } mContext = spy(ApplicationProvider.getApplicationContext()); - mSatelliteManager = new SatelliteManager(mContext); + SatelliteManager satelliteManager = new SatelliteManager(mContext); CarrierConfigCache.setTestInstance(mContext, mCarrierConfigCache); - when(mContext.getSystemService(SatelliteManager.class)).thenReturn(mSatelliteManager); + when(mContext.getSystemService(SatelliteManager.class)).thenReturn(satelliteManager); 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)); + mController = new SatelliteSettingPreferenceController(mContext, KEY); } @Test @@ -97,6 +97,7 @@ public class SatelliteSettingsPreferenceControllerTest { public void getAvailabilityStatus_noSatellite_returnUnsupported() { when(mContext.getSystemService(SatelliteManager.class)).thenReturn(null); mController = new SatelliteSettingPreferenceController(mContext, KEY); + mController.initialize(TEST_SUB_ID); int result = mController.getAvailabilityStatus(TEST_SUB_ID); @@ -109,6 +110,8 @@ public class SatelliteSettingsPreferenceControllerTest { mCarrierConfig.putBoolean( CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, false); + mController.initialize(TEST_SUB_ID); + int result = mController.getAvailabilityStatus(TEST_SUB_ID); assertThat(result).isEqualTo(CONDITIONALLY_UNAVAILABLE); @@ -116,29 +119,16 @@ public class SatelliteSettingsPreferenceControllerTest { @Test @EnableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) - public void getAvailabilityStatus_ntnConnectIsManual_returnUnavailable() { + public void getAvailabilityStatus_connectTypeIsManualButUnavailable_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.initialize(TEST_SUB_ID); mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged( - new int[]{SERVICE_TYPE_SMS}); + new int[]{}); int result = mController.getAvailabilityStatus(TEST_SUB_ID); @@ -147,20 +137,36 @@ public class SatelliteSettingsPreferenceControllerTest { @Test @EnableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) - public void getAvailabilityStatus_matchAllConditions_returnAvailable() { + public void getAvailabilityStatus_connectTypeIsManualAndAvailable_returnAvailable() { + mCarrierConfig.putBoolean( + CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, + true); + mCarrierConfig.putInt( + CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_MANUAL); + mController.initialize(TEST_SUB_ID); + mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged( + new int[]{SERVICE_TYPE_SMS}); + + int result = mController.getAvailabilityStatus(TEST_SUB_ID); + + assertThat(result).isEqualTo(AVAILABLE); + } + + @Test + @EnableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) + public void getAvailabilityStatus_connectTypeIsAuto_returnAvailable() { 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}); + mController.initialize(TEST_SUB_ID); int result = mController.getAvailabilityStatus(TEST_SUB_ID); - assertThat(result).isEqualTo(CONDITIONALLY_UNAVAILABLE); + assertThat(result).isEqualTo(AVAILABLE); } @Test @@ -183,13 +189,15 @@ public class SatelliteSettingsPreferenceControllerTest { @Test @EnableFlags(com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION) - public void getAvailabilityStatus_hasServiceDataType_showDataUi() { + public void title_hasServiceDataType_showDataUi() { mController.initialize(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"); - mController.updateState(preference); - + preferenceScreen.addPreference(preference); + mController.displayPreference(preferenceScreen); mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged( new int[]{SERVICE_TYPE_SMS, SERVICE_TYPE_DATA}); @@ -198,13 +206,15 @@ public class SatelliteSettingsPreferenceControllerTest { @Test @EnableFlags(com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION) - public void getAvailabilityStatus_onlyHasServiceSmsType_showSmsUi() { + public void title_onlyHasServiceSmsType_showSmsUi() { mController.initialize(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"); - mController.updateState(preference); - + preferenceScreen.addPreference(preference); + mController.displayPreference(preferenceScreen); mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged( new int[]{SERVICE_TYPE_SMS}); @@ -213,15 +223,18 @@ public class SatelliteSettingsPreferenceControllerTest { @Test @EnableFlags(com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION) - public void getAvailabilityStatus_noEntitlement_showSummaryWithoutEntitlement() { + public void summary_noEntitlement_showSummaryWithoutEntitlement() { mCarrierConfig.putBoolean( KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false); mController.initialize(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"); - mController.updateState(preference); + preferenceScreen.addPreference(preference); + mController.displayPreference(preferenceScreen); assertThat(preference.getSummary()).isEqualTo( "Send and receive text messages by satellite. Contact your carrier for details."); @@ -229,7 +242,7 @@ public class SatelliteSettingsPreferenceControllerTest { @Test @EnableFlags(com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION) - public void getAvailabilityStatus_smsAvailableForManualType_showSummaryWithAccount() { + public void summary_smsAvailableForManualType_showSummaryWithAccount() { mCarrierConfig.putBoolean( KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, true); @@ -243,8 +256,9 @@ public class SatelliteSettingsPreferenceControllerTest { preference.setKey(KEY); preference.setTitle("test title"); preferenceScreen.addPreference(preference); - mController.mIsSatelliteSmsAvailableForManualType = true; mController.displayPreference(preferenceScreen); + mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged( + new int[]{SERVICE_TYPE_SMS}); assertThat(preference.getSummary()).isEqualTo( "Send and receive text messages by satellite. Included with your account."); @@ -266,8 +280,9 @@ public class SatelliteSettingsPreferenceControllerTest { preference.setKey(KEY); preference.setTitle("test title"); preferenceScreen.addPreference(preference); - mController.mIsSatelliteSmsAvailableForManualType = false; mController.displayPreference(preferenceScreen); + mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged( + new int[]{}); assertThat(preference.getSummary()).isEqualTo( "Send and receive text messages by satellite. Not included with your account.");