From 9df2e6fdc98ace66d9927723e8c75db1ef5dda41 Mon Sep 17 00:00:00 2001 From: tom hsu Date: Mon, 17 Feb 2025 17:25:04 +0000 Subject: [PATCH 1/2] Make Satellite UI updatable during receiving callback (Part II) - Refactor code - Make Satellite category and preference be updatable by callback. Flag: EXEMPT bug fix Fix: b/396233604 Fix: b/382664790 Test: atest pass Change-Id: I55423317d82589312ce4a2f851b32b242529e922 --- ...eSettingsPreferenceCategoryController.java | 119 ++++++++++++++++-- ...tingsPreferenceCategoryControllerTest.java | 119 +++++++++++++++--- 2 files changed, 208 insertions(+), 30 deletions(-) diff --git a/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceCategoryController.java b/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceCategoryController.java index 6218e055038..29502477796 100644 --- a/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceCategoryController.java +++ b/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceCategoryController.java @@ -16,35 +16,48 @@ package com.android.settings.network.telephony; +import static android.telephony.CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC; +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_ESOS_SUPPORTED_BOOL; +import static android.telephony.NetworkRegistrationInfo.SERVICE_TYPE_SMS; import android.content.Context; import android.os.PersistableBundle; +import android.telephony.TelephonyCallback; +import android.telephony.TelephonyManager; +import android.telephony.satellite.NtnSignalStrength; import android.telephony.satellite.SatelliteManager; import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import androidx.lifecycle.DefaultLifecycleObserver; -import androidx.preference.PreferenceCategory; +import androidx.lifecycle.LifecycleOwner; import androidx.preference.PreferenceScreen; -import com.android.settings.R; import com.android.settings.flags.Flags; import com.android.settings.network.CarrierConfigCache; +import java.util.Arrays; +import java.util.List; + /** Preference controller for Satellite functions in mobile network settings. */ public class SatelliteSettingsPreferenceCategoryController extends TelephonyBasePreferenceController implements DefaultLifecycleObserver { private static final String TAG = "SatelliteSettingsPrefCategoryCon"; + @VisibleForTesting + final CarrierRoamingNtnModeCallback mCarrierRoamingNtnModeCallback = + new CarrierRoamingNtnModeCallback(this); + private CarrierConfigCache mCarrierConfigCache; private SatelliteManager mSatelliteManager; - private PreferenceCategory mPreferenceCategory; + private TelephonyManager mTelephonyManager; + private PreferenceScreen mPreferenceScreen; public SatelliteSettingsPreferenceCategoryController(Context context, String key) { super(context, key); - mCarrierConfigCache = CarrierConfigCache.getInstance(context); - mSatelliteManager = context.getSystemService(SatelliteManager.class); } /** @@ -55,13 +68,23 @@ public class SatelliteSettingsPreferenceCategoryController public void init(int subId) { Log.d(TAG, "init(), subId=" + subId); mSubId = subId; + mCarrierConfigCache = CarrierConfigCache.getInstance(mContext); + mSatelliteManager = mContext.getSystemService(SatelliteManager.class); + mTelephonyManager = mContext.getSystemService(TelephonyManager.class); } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - mPreferenceCategory = screen.findPreference(getPreferenceKey()); - mPreferenceCategory.setTitle(R.string.category_title_satellite_connectivity); + if (mPreferenceScreen != null) { + mPreferenceScreen = screen; + } + } + + void displayPreference() { + if (mPreferenceScreen != null) { + displayPreference(mPreferenceScreen); + } } @Override @@ -75,15 +98,89 @@ public class SatelliteSettingsPreferenceCategoryController } final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(subId); - final boolean isSatelliteAttachSupported = carrierConfig.getBoolean( - KEY_SATELLITE_ATTACH_SUPPORTED_BOOL); boolean isSatelliteSosSupported = false; if (Flags.satelliteOemSettingsUxMigration()) { isSatelliteSosSupported = carrierConfig.getBoolean( KEY_SATELLITE_ESOS_SUPPORTED_BOOL); } - return (isSatelliteAttachSupported || isSatelliteSosSupported) - ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE; + if (!carrierConfig.getBoolean(KEY_SATELLITE_ATTACH_SUPPORTED_BOOL)) { + return UNSUPPORTED_ON_DEVICE; + } + + if (isSatelliteSosSupported) { + return AVAILABLE_UNSEARCHABLE; + } + + if (CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC == carrierConfig.getInt( + KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC)) { + return AVAILABLE_UNSEARCHABLE; + } else { + return mCarrierRoamingNtnModeCallback.isSatelliteSmsAvailable() + ? AVAILABLE_UNSEARCHABLE + : CONDITIONALLY_UNAVAILABLE; + } + } + + @Override + public void onResume(@NonNull LifecycleOwner owner) { + if (com.android.settings.flags.Flags.satelliteOemSettingsUxMigration()) { + if (mTelephonyManager != null) { + mTelephonyManager.registerTelephonyCallback(mContext.getMainExecutor(), + mCarrierRoamingNtnModeCallback); + } + } + } + + @Override + public void onPause(@NonNull LifecycleOwner owner) { + if (com.android.settings.flags.Flags.satelliteOemSettingsUxMigration()) { + if (mTelephonyManager != null) { + mTelephonyManager.unregisterTelephonyCallback(mCarrierRoamingNtnModeCallback); + } + } + } + + @VisibleForTesting + static class CarrierRoamingNtnModeCallback extends TelephonyCallback implements + TelephonyCallback.CarrierRoamingNtnListener { + SatelliteSettingsPreferenceCategoryController mController; + private boolean mIsSatelliteSmsAvailable = false; + + CarrierRoamingNtnModeCallback( + SatelliteSettingsPreferenceCategoryController controller) { + mController = controller; + } + + boolean isSatelliteSmsAvailable() { + return mIsSatelliteSmsAvailable; + } + + @Override + public void onCarrierRoamingNtnAvailableServicesChanged(@NonNull int[] availableServices) { + CarrierRoamingNtnListener.super.onCarrierRoamingNtnAvailableServicesChanged( + availableServices); + List availableServicesList = Arrays.stream(availableServices).boxed().toList(); + mIsSatelliteSmsAvailable = availableServicesList.contains(SERVICE_TYPE_SMS); + Log.d(TAG, "isSmsAvailable : " + mIsSatelliteSmsAvailable); + mController.displayPreference(); + } + + @Override + public void onCarrierRoamingNtnEligibleStateChanged(boolean eligible) { + // Do nothing + } + + @Override + public void onCarrierRoamingNtnModeChanged(boolean active) { + // Do nothing + } + + @Override + public void onCarrierRoamingNtnSignalStrengthChanged( + @NonNull NtnSignalStrength ntnSignalStrength) { + // Do nothing + } } } diff --git a/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceCategoryControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceCategoryControllerTest.java index 085a68d8173..a5f5114afe6 100644 --- a/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceCategoryControllerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsPreferenceCategoryControllerTest.java @@ -16,29 +16,38 @@ 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_ESOS_SUPPORTED_BOOL; +import static android.telephony.NetworkRegistrationInfo.SERVICE_TYPE_SMS; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE; +import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; import static com.google.common.truth.Truth.assertThat; -import static junit.framework.Assert.assertEquals; - import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; import android.content.Context; import android.os.Looper; +import android.os.PersistableBundle; +import android.platform.test.annotations.EnableFlags; -import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; -import androidx.preference.PreferenceManager; -import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.android.internal.telephony.flags.Flags; +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; +import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -50,8 +59,12 @@ public class SatelliteSettingsPreferenceCategoryControllerTest { @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Mock + private CarrierConfigCache mCarrierConfigCache; + private Context mContext = null; private SatelliteSettingsPreferenceCategoryController mController = null; + private PersistableBundle mPersistableBundle = new PersistableBundle(); @Before public void setUp() { @@ -59,27 +72,95 @@ public class SatelliteSettingsPreferenceCategoryControllerTest { Looper.prepare(); } mContext = spy(ApplicationProvider.getApplicationContext()); + CarrierConfigCache.setTestInstance(mContext, mCarrierConfigCache); mController = new SatelliteSettingsPreferenceCategoryController(mContext, KEY); + when(mCarrierConfigCache.getConfigForSubId(TEST_SUB_ID)).thenReturn(mPersistableBundle); + } @Test - @Ignore("b/382664790") - public void getAvailabilityStatus_default_returnUnsupported() { + public void getAvailabilityStatus_deviceUnsupported_returnUnsupported() { int result = mController.getAvailabilityStatus(TEST_SUB_ID); assertThat(result).isEqualTo(UNSUPPORTED_ON_DEVICE); } @Test - @Ignore("b/382664790") - public void setPreferenceTitle_hasSmsService_showMessaging() { - PreferenceManager preferenceManager = new PreferenceManager(mContext); - PreferenceScreen preferenceScreen = preferenceManager.createPreferenceScreen(mContext); - PreferenceCategory preferenceCategory = new PreferenceCategory(mContext); - preferenceCategory.setKey(KEY); - preferenceScreen.addPreference(preferenceCategory); - preferenceCategory.addPreference(new Preference(mContext)); - mController.displayPreference(preferenceScreen); + public void getAvailabilityStatus_carrierNotSupport_returnUnsupported() { + mPersistableBundle.putBoolean(KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, false); + mController.init(TEST_SUB_ID); - assertEquals(preferenceCategory.getTitle(), "Satellite connectivity"); + int result = mController.getAvailabilityStatus(TEST_SUB_ID); + + assertThat(result).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + + @Test + @EnableFlags({ + Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG, + com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION + }) + public void getAvailabilityStatus_sosSupported_returnAvailable() { + mPersistableBundle.putBoolean(KEY_SATELLITE_ESOS_SUPPORTED_BOOL, true); + mPersistableBundle.putBoolean(KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true); + mController.init(TEST_SUB_ID); + + int result = mController.getAvailabilityStatus(TEST_SUB_ID); + + assertThat(result).isEqualTo(AVAILABLE_UNSEARCHABLE); + } + + @Test + @EnableFlags({ + Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG, + com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION + }) + public void getAvailabilityStatus_connectTypeAuto_returnAvailable() { + mPersistableBundle.putBoolean(KEY_SATELLITE_ESOS_SUPPORTED_BOOL, false); + mPersistableBundle.putBoolean(KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true); + mPersistableBundle.putInt(KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC); + mController.init(TEST_SUB_ID); + + int result = mController.getAvailabilityStatus(TEST_SUB_ID); + + assertThat(result).isEqualTo(AVAILABLE_UNSEARCHABLE); + } + + @Test + @EnableFlags({ + Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG, + com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION + }) + public void getAvailabilityStatus_connectTypeManualAndAvailable_returnAvailable() { + mPersistableBundle.putBoolean(KEY_SATELLITE_ESOS_SUPPORTED_BOOL, false); + mPersistableBundle.putBoolean(KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true); + mPersistableBundle.putInt(KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC); + mController.init(TEST_SUB_ID); + mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged( + new int[]{SERVICE_TYPE_SMS}); + + int result = mController.getAvailabilityStatus(TEST_SUB_ID); + + assertThat(result).isEqualTo(AVAILABLE_UNSEARCHABLE); + } + + @Test + @EnableFlags({ + Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG, + com.android.settings.flags.Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION + }) + public void getAvailabilityStatus_connectTypeManualAndUnavailable_returnUnavailable() { + mPersistableBundle.putBoolean(KEY_SATELLITE_ESOS_SUPPORTED_BOOL, false); + mPersistableBundle.putBoolean(KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true); + mPersistableBundle.putInt(KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, + CARRIER_ROAMING_NTN_CONNECT_MANUAL); + mController.init(TEST_SUB_ID); + mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged( + new int[]{}); + + int result = mController.getAvailabilityStatus(TEST_SUB_ID); + + assertThat(result).isEqualTo(CONDITIONALLY_UNAVAILABLE); } } From 400dc33b131e98476ac6dd4827348c650bf31e7b Mon Sep 17 00:00:00 2001 From: tom hsu Date: Mon, 17 Feb 2025 17:28:54 +0000 Subject: [PATCH 2/2] Modify the default satellite category title. Flag: EXEMPT resource update Fix: b/382707562 Test: Manual test Change-Id: Ic1e093349ff9466e134b74a2af8a051c8c2225d4 --- res/xml/mobile_network_settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml index 4f7a494509b..ce71f540989 100644 --- a/res/xml/mobile_network_settings.xml +++ b/res/xml/mobile_network_settings.xml @@ -204,7 +204,7 @@