Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit caa4fa67 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Make Satellite UI updatable during receiving callback (part I)" into main

parents 5703095c 048be18c
Loading
Loading
Loading
Loading
+86 −54
Original line number Diff line number Diff line
@@ -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);
    /**
     * 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);
        }

    private static void loge(String message) {
        Log.e(TAG, message);
        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 (!mCarrierConfigs.getBoolean(KEY_SATELLITE_ATTACH_SUPPORTED_BOOL)) {
            return CONDITIONALLY_UNAVAILABLE;
        }

        if (isSatelliteAttachSupport && isCarrierRoamingNtnConnectedTypeAuto()
                && mIsSatelliteSmsAvailableForManualType) {
        if (isCarrierRoamingNtnConnectedTypeManual()) {
            return mCarrierRoamingNtnModeCallback.isSatelliteSmsAvailable()
                    ? AVAILABLE
                    : CONDITIONALLY_UNAVAILABLE;
        } else {
            return AVAILABLE;
        }

        return 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);
            }
        }
    }

    @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<Integer> 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
+42 −27
Original line number Diff line number Diff line
@@ -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,13 +119,17 @@ 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);
        mController.initialize(TEST_SUB_ID);
        mController.mCarrierRoamingNtnModeCallback.onCarrierRoamingNtnAvailableServicesChanged(
                new int[]{});

        int result = mController.getAvailabilityStatus(TEST_SUB_ID);

        assertThat(result).isEqualTo(CONDITIONALLY_UNAVAILABLE);
@@ -130,37 +137,36 @@ public class SatelliteSettingsPreferenceControllerTest {

    @Test
    @EnableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG)
    public void getAvailabilityStatus_smsNotAvailable_returnUnavailable() {
    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_AUTOMATIC);
                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(CONDITIONALLY_UNAVAILABLE);
        assertThat(result).isEqualTo(AVAILABLE);
    }

    @Test
    @EnableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG)
    public void getAvailabilityStatus_matchAllConditions_returnAvailable() {
    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.");