Disabled Settings preference in case Satellite's conditions.

Conditions
   - Satellite session started
   - Current subscription for Satellite is carrier based.
 Target preference UI in android settings
   - preferred network type
   - Automatically select network

Flag: com.android.settings.flags.satellite_oem_settings_ux_migration
Fix: b/378409439
Fix: b/378409428
Test: atest pass
Test: Manual test pass
Change-Id: I7aa04b818c8866bf5c891c28372a249c964b066f
This commit is contained in:
tomhsu
2024-11-20 13:55:05 +00:00
parent 01043fdf93
commit 9ca8709173
6 changed files with 401 additions and 24 deletions

View File

@@ -16,9 +16,6 @@
package com.android.settings.network.telephony;
import static androidx.lifecycle.Lifecycle.Event.ON_START;
import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
import static com.android.settings.network.telephony.EnabledNetworkModePreferenceControllerHelperKt.getNetworkModePreferenceType;
import static com.android.settings.network.telephony.EnabledNetworkModePreferenceControllerHelperKt.setAllowedNetworkTypes;
import static com.android.settings.network.telephony.mode.NetworkModes.addNrToLteNetworkMode;
@@ -33,15 +30,17 @@ import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
import android.telephony.satellite.SatelliteManager;
import android.telephony.satellite.SatelliteModemStateCallback;
import android.telephony.satellite.SelectedNbIotSatelliteSubscriptionCallback;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.ListPreference;
import androidx.preference.ListPreferenceDialogFragmentCompat;
import androidx.preference.Preference;
@@ -67,7 +66,7 @@ import java.util.stream.Stream;
*/
public class EnabledNetworkModePreferenceController extends
BasePreferenceController implements
ListPreference.OnPreferenceChangeListener, LifecycleObserver,
ListPreference.OnPreferenceChangeListener, DefaultLifecycleObserver,
SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
private static final String LOG_TAG = "EnabledNetworkMode";
@@ -83,6 +82,43 @@ public class EnabledNetworkModePreferenceController extends
private PhoneCallStateTelephonyCallback mTelephonyCallback;
private FragmentManager mFragmentManager;
private LifecycleOwner mViewLifecycleOwner;
private SatelliteManager mSatelliteManager;
private boolean mIsSatelliteSessionStarted = false;
private boolean mIsCurrentSubscriptionForSatellite = false;
@VisibleForTesting
final SelectedNbIotSatelliteSubscriptionCallback mSelectedNbIotSatelliteSubscriptionCallback =
new SelectedNbIotSatelliteSubscriptionCallback() {
@Override
public void onSelectedNbIotSatelliteSubscriptionChanged(int selectedSubId) {
mIsCurrentSubscriptionForSatellite = selectedSubId == mSubId;
updatePreference();
}
};
@VisibleForTesting
final SatelliteModemStateCallback mSatelliteModemStateCallback =
new SatelliteModemStateCallback() {
@Override
public void onSatelliteModemStateChanged(int state) {
switch (state) {
case SatelliteManager.SATELLITE_MODEM_STATE_OFF:
case SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE:
case SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN:
if (mIsSatelliteSessionStarted) {
mIsSatelliteSessionStarted = false;
updatePreference();
}
break;
default:
if (!mIsSatelliteSessionStarted) {
mIsSatelliteSessionStarted = true;
updatePreference();
}
break;
}
}
};
public EnabledNetworkModePreferenceController(Context context, String key) {
super(context, key);
@@ -90,6 +126,7 @@ public class EnabledNetworkModePreferenceController extends
if (mTelephonyCallback == null) {
mTelephonyCallback = new PhoneCallStateTelephonyCallback();
}
mSatelliteManager = context.getSystemService(SatelliteManager.class);
}
@Override
@@ -103,8 +140,22 @@ public class EnabledNetworkModePreferenceController extends
return mCallState == TelephonyManager.CALL_STATE_IDLE;
}
@OnLifecycleEvent(ON_START)
public void onStart() {
@Override
public void onStart(@NonNull LifecycleOwner owner) {
if (com.android.settings.flags.Flags.satelliteOemSettingsUxMigration()) {
if (mSatelliteManager != null) {
try {
mSatelliteManager.registerForModemStateChanged(
mContext.getMainExecutor(), mSatelliteModemStateCallback);
mSatelliteManager.registerForSelectedNbIotSatelliteSubscriptionChanged(
mContext.getMainExecutor(),
mSelectedNbIotSatelliteSubscriptionCallback);
} catch (IllegalStateException e) {
Log.w(LOG_TAG, "IllegalStateException : " + e);
}
}
}
mSubscriptionsListener.start();
if (mAllowedNetworkTypesListener == null || mTelephonyCallback == null) {
return;
@@ -113,9 +164,21 @@ public class EnabledNetworkModePreferenceController extends
mTelephonyCallback.register(mTelephonyManager, mSubId);
}
@OnLifecycleEvent(ON_STOP)
public void onStop() {
@Override
public void onStop(@NonNull LifecycleOwner owner) {
mSubscriptionsListener.stop();
if (com.android.settings.flags.Flags.satelliteOemSettingsUxMigration()) {
if (mSatelliteManager != null) {
try {
mSatelliteManager.unregisterForModemStateChanged(mSatelliteModemStateCallback);
mSatelliteManager.unregisterForSelectedNbIotSatelliteSubscriptionChanged(
mSelectedNbIotSatelliteSubscriptionCallback);
} catch (IllegalStateException e) {
Log.w(LOG_TAG, "IllegalStateException : " + e);
}
}
}
if (mAllowedNetworkTypesListener == null || mTelephonyCallback == null) {
return;
}
@@ -147,7 +210,7 @@ public class EnabledNetworkModePreferenceController extends
listPreference.setEntryValues(mBuilder.getEntryValues());
listPreference.setValue(Integer.toString(mBuilder.getSelectedEntryValue()));
listPreference.setSummary(mBuilder.getSummary());
boolean listPreferenceEnabled = isCallStateIdle();
boolean listPreferenceEnabled = isPreferenceShallEnabled();
listPreference.setEnabled(listPreferenceEnabled);
if (!listPreferenceEnabled) {
// If dialog is already opened when ListPreference disabled, dismiss them.
@@ -203,6 +266,14 @@ public class EnabledNetworkModePreferenceController extends
}
}
private boolean isPreferenceShallEnabled() {
Log.d(LOG_TAG, "isPreferenceShallEnabled, mIsSatelliteSessionStarted : "
+ mIsSatelliteSessionStarted + " / mIsCurrentSubscriptionForSatellite : "
+ mIsCurrentSubscriptionForSatellite);
return isCallStateIdle()
&& !(mIsSatelliteSessionStarted && mIsCurrentSubscriptionForSatellite);
}
private final class PreferenceEntriesBuilder {
private CarrierConfigCache mCarrierConfigCache;
private Context mContext;
@@ -254,7 +325,7 @@ public class EnabledNetworkModePreferenceController extends
if (flagHidePrefer3gItem) {
mDisplay3gOptions = carrierConfig.getBoolean(
CarrierConfigManager.KEY_PREFER_3G_VISIBILITY_BOOL);
CarrierConfigManager.KEY_PREFER_3G_VISIBILITY_BOOL);
} else {
mDisplay3gOptions = getResourcesForSubId().getBoolean(
R.bool.config_display_network_mode_3g_option);

View File

@@ -24,10 +24,18 @@ import android.telephony.CarrierConfigManager;
import android.telephony.RadioAccessFamily;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.satellite.SatelliteManager;
import android.telephony.satellite.SatelliteModemStateCallback;
import android.telephony.satellite.SelectedNbIotSatelliteSubscriptionCallback;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
@@ -38,17 +46,56 @@ import com.android.settings.network.telephony.mode.NetworkModes;
* Preference controller for "Preferred network mode"
*/
public class PreferredNetworkModePreferenceController extends BasePreferenceController
implements ListPreference.OnPreferenceChangeListener {
implements ListPreference.OnPreferenceChangeListener, DefaultLifecycleObserver {
private static final String TAG = "PrefNetworkModeCtrl";
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
private CarrierConfigCache mCarrierConfigCache;
private TelephonyManager mTelephonyManager;
private boolean mIsGlobalCdma;
private SatelliteManager mSatelliteManager;
private Preference mPreference;
private boolean mIsSatelliteSessionStarted = false;
private boolean mIsCurrentSubscriptionForSatellite = false;
@VisibleForTesting
final SelectedNbIotSatelliteSubscriptionCallback mSelectedNbIotSatelliteSubscriptionCallback =
new SelectedNbIotSatelliteSubscriptionCallback() {
@Override
public void onSelectedNbIotSatelliteSubscriptionChanged(int selectedSubId) {
mIsCurrentSubscriptionForSatellite = selectedSubId == mSubId;
updateState(mPreference);
}
};
@VisibleForTesting
final SatelliteModemStateCallback mSatelliteModemStateCallback =
new SatelliteModemStateCallback() {
@Override
public void onSatelliteModemStateChanged(int state) {
switch (state) {
case SatelliteManager.SATELLITE_MODEM_STATE_OFF:
case SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE:
case SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN:
if (mIsSatelliteSessionStarted) {
mIsSatelliteSessionStarted = false;
updateState(mPreference);
}
break;
default:
if (!mIsSatelliteSessionStarted) {
mIsSatelliteSessionStarted = true;
updateState(mPreference);
}
break;
}
}
};
public PreferredNetworkModePreferenceController(Context context, String key) {
super(context, key);
mCarrierConfigCache = CarrierConfigCache.getInstance(context);
mSatelliteManager = context.getSystemService(SatelliteManager.class);
}
@Override
@@ -58,9 +105,19 @@ public class PreferredNetworkModePreferenceController extends BasePreferenceCont
? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
}
@Override
public void updateState(Preference preference) {
if (preference == null) {
return;
}
super.updateState(preference);
preference.setEnabled(!(mIsCurrentSubscriptionForSatellite && mIsSatelliteSessionStarted));
final ListPreference listPreference = (ListPreference) preference;
final int networkMode = getPreferredNetworkMode();
listPreference.setValue(Integer.toString(networkMode));
@@ -75,9 +132,9 @@ public class PreferredNetworkModePreferenceController extends BasePreferenceCont
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER,
RadioAccessFamily.getRafFromNetworkType(newPreferredNetworkMode));
final ListPreference listPreference = (ListPreference) preference;
listPreference.setSummary(getPreferredNetworkModeSummaryResId(newPreferredNetworkMode));
return true;
final ListPreference listPreference = (ListPreference) preference;
listPreference.setSummary(getPreferredNetworkModeSummaryResId(newPreferredNetworkMode));
return true;
}
public void init(int subId) {
@@ -90,6 +147,38 @@ public class PreferredNetworkModePreferenceController extends BasePreferenceCont
&& carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL);
}
@Override
public void onStart(@NonNull LifecycleOwner owner) {
if (com.android.settings.flags.Flags.satelliteOemSettingsUxMigration()) {
if (mSatelliteManager != null) {
try {
mSatelliteManager.registerForModemStateChanged(
mContext.getMainExecutor(), mSatelliteModemStateCallback);
mSatelliteManager.registerForSelectedNbIotSatelliteSubscriptionChanged(
mContext.getMainExecutor(),
mSelectedNbIotSatelliteSubscriptionCallback);
} catch (IllegalStateException e) {
Log.w(TAG, "IllegalStateException : " + e);
}
}
}
}
@Override
public void onStop(@NonNull LifecycleOwner owner) {
if (com.android.settings.flags.Flags.satelliteOemSettingsUxMigration()) {
if (mSatelliteManager != null) {
try {
mSatelliteManager.unregisterForModemStateChanged(mSatelliteModemStateCallback);
mSatelliteManager.unregisterForSelectedNbIotSatelliteSubscriptionChanged(
mSelectedNbIotSatelliteSubscriptionCallback);
} catch (IllegalStateException e) {
Log.w(TAG, "IllegalStateException : " + e);
}
}
}
}
private int getPreferredNetworkMode() {
if (mTelephonyManager == null) {
Log.w(TAG, "TelephonyManager is null");

View File

@@ -25,18 +25,22 @@ import android.telephony.CarrierConfigManager
import android.telephony.ServiceState
import android.telephony.SubscriptionManager
import android.telephony.TelephonyManager
import android.telephony.satellite.SatelliteManager
import android.telephony.satellite.SatelliteModemStateCallback
import android.telephony.satellite.SelectedNbIotSatelliteSubscriptionCallback
import android.util.Log
import androidx.annotation.VisibleForTesting
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.preference.Preference
import androidx.preference.PreferenceScreen
import com.android.settings.R
import com.android.settings.Settings.NetworkSelectActivity
import com.android.settings.flags.Flags
import com.android.settings.network.CarrierConfigCache
import com.android.settings.network.telephony.MobileNetworkUtils
import com.android.settings.network.telephony.allowedNetworkTypesFlow
@@ -46,8 +50,6 @@ import com.android.settingslib.spa.framework.compose.OverridableFlow
import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
import kotlin.properties.Delegates.notNull
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
@@ -59,6 +61,7 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlin.time.Duration.Companion.seconds
/**
* Preference controller for "Auto Select Network"
@@ -73,9 +76,13 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
private val getConfigForSubId: (subId: Int) -> PersistableBundle = { subId ->
CarrierConfigCache.getInstance(context).getConfigForSubId(subId)
},
) : ComposePreferenceController(context, key) {
) : ComposePreferenceController(context, key), DefaultLifecycleObserver {
private var isSatelliteSessionStarted = false
private var isSelectedSubIdForSatellite = false
private lateinit var telephonyManager: TelephonyManager
private lateinit var satelliteManager: SatelliteManager
private val listeners = mutableListOf<OnNetworkSelectModeListener>()
@VisibleForTesting
@@ -83,6 +90,21 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
private var subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID
val satelliteModemStateCallback = SatelliteModemStateCallback { state ->
isSatelliteSessionStarted = when (state) {
SatelliteManager.SATELLITE_MODEM_STATE_OFF,
SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE,
SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN -> false
else -> true
}
}
val selectedNbIotSatelliteSubscriptionCallback =
SelectedNbIotSatelliteSubscriptionCallback { selectedSubId ->
isSelectedSubIdForSatellite = selectedSubId == subId
}
/**
* Initialization based on given subscription id.
*/
@@ -90,7 +112,7 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
this.subId = subId
telephonyManager = mContext.getSystemService(TelephonyManager::class.java)!!
.createForSubscriptionId(subId)
satelliteManager = mContext.getSystemService(SatelliteManager::class.java)!!
return this
}
@@ -117,7 +139,10 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
SwitchPreference(object : SwitchPreferenceModel {
override val title = stringResource(R.string.select_automatically)
override val summary = { disallowedSummary }
override val changeable = { disallowedSummary.isEmpty() }
override val changeable = {
disallowedSummary.isEmpty()
&& !(isSatelliteSessionStarted && isSelectedSubIdForSatellite)
}
override val checked = { isAuto }
override val onCheckedChange: (Boolean) -> Unit = { newChecked ->
if (newChecked) {
@@ -132,6 +157,38 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
})
}
override fun onStart(owner: LifecycleOwner) {
if (Flags.satelliteOemSettingsUxMigration()) {
if (satelliteManager != null) {
try {
satelliteManager.registerForModemStateChanged(
mContext.mainExecutor, satelliteModemStateCallback
)
satelliteManager.registerForSelectedNbIotSatelliteSubscriptionChanged(
mContext.mainExecutor, selectedNbIotSatelliteSubscriptionCallback
)
} catch (e: IllegalStateException) {
Log.w(TAG, "IllegalStateException $e")
}
}
}
}
override fun onStop(owner: LifecycleOwner) {
if (Flags.satelliteOemSettingsUxMigration()) {
if (satelliteManager != null) {
try {
satelliteManager.unregisterForModemStateChanged(satelliteModemStateCallback)
satelliteManager.unregisterForSelectedNbIotSatelliteSubscriptionChanged(
selectedNbIotSatelliteSubscriptionCallback
)
} catch (e: IllegalStateException) {
Log.w(TAG, "IllegalStateException $e")
}
}
}
}
private suspend fun getDisallowedSummary(serviceState: ServiceState): String =
withContext(Dispatchers.Default) {
if (!serviceState.roaming && onlyAutoSelectInHome()) {
@@ -213,6 +270,8 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
}
companion object {
private const val TAG = "AutoSelectPreferenceController"
private val MINIMUM_DIALOG_TIME = 1.seconds
}
}

View File

@@ -18,10 +18,12 @@ package com.android.settings.network.telephony.gsm
import android.content.Context
import android.content.Intent
import android.platform.test.annotations.EnableFlags
import android.provider.Settings
import android.telephony.CarrierConfigManager
import android.telephony.ServiceState
import android.telephony.TelephonyManager
import android.telephony.satellite.SatelliteManager
import androidx.compose.ui.test.assertIsEnabled
import androidx.compose.ui.test.assertIsNotEnabled
import androidx.compose.ui.test.assertIsOff
@@ -36,6 +38,7 @@ import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R
import com.android.settings.Settings.NetworkSelectActivity
import com.android.settings.flags.Flags
import com.android.settings.spa.preference.ComposePreference
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.delay
@@ -46,6 +49,8 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.doNothing
@@ -57,6 +62,9 @@ import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
class AutoSelectPreferenceControllerTest {
@get:Rule
val mockito = MockitoJUnit.rule()
@get:Rule
val composeTestRule = createComposeRule()
@@ -65,8 +73,12 @@ class AutoSelectPreferenceControllerTest {
on { simOperatorName } doReturn OPERATOR_NAME
}
private val mockSatelliteManager = mock<SatelliteManager> {
}
private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
on { getSystemService(SatelliteManager::class.java) } doReturn mockSatelliteManager
doNothing().whenever(mock).startActivity(any())
}
@@ -115,7 +127,6 @@ class AutoSelectPreferenceControllerTest {
.assertIsOff()
}
@Test
fun isEnabled_isRoaming_enabled() {
serviceState.roaming = true
@@ -158,6 +169,54 @@ class AutoSelectPreferenceControllerTest {
.assertIsNotEnabled()
}
@Test
@EnableFlags(Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION)
fun isEnabled_isSatelliteSessionStartedAndSelectedSubForSatellite_disabled() {
controller.selectedNbIotSatelliteSubscriptionCallback
.onSelectedNbIotSatelliteSubscriptionChanged(SUB_ID)
controller.satelliteModemStateCallback
.onSatelliteModemStateChanged(SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED)
composeTestRule.setContent {
controller.Content()
}
composeTestRule.onNodeWithText(context.getString(R.string.select_automatically))
.assertIsNotEnabled()
}
@Test
@EnableFlags(Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION)
fun isEnabled_isSatelliteSessionNotStartedButIsSelectedSubForSatellite_enabled() {
controller.selectedNbIotSatelliteSubscriptionCallback
.onSelectedNbIotSatelliteSubscriptionChanged(SUB_ID)
controller.satelliteModemStateCallback
.onSatelliteModemStateChanged(SatelliteManager.SATELLITE_MODEM_STATE_OFF)
composeTestRule.setContent {
controller.Content()
}
composeTestRule.onNodeWithText(context.getString(R.string.select_automatically))
.assertIsEnabled()
}
@Test
@EnableFlags(Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION)
fun isEnabled_isSatelliteSessionStartedButNotSelectedSubForSatellite_enabled() {
controller.selectedNbIotSatelliteSubscriptionCallback
.onSelectedNbIotSatelliteSubscriptionChanged(0)
controller.satelliteModemStateCallback
.onSatelliteModemStateChanged(SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED)
composeTestRule.setContent {
controller.Content()
}
composeTestRule.onNodeWithText(context.getString(R.string.select_automatically))
.assertIsEnabled()
}
@Test
fun onClick_turnOff_startNetworkSelectActivity() {
serviceState.isManualSelection = false

View File

@@ -16,6 +16,9 @@
package com.android.settings.network.telephony;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_OFF;
import static androidx.lifecycle.Lifecycle.Event.ON_START;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.CDMA;
@@ -29,12 +32,15 @@ import static com.android.settings.network.telephony.TelephonyConstants.RadioAcc
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.PersistableBundle;
import android.platform.test.annotations.EnableFlags;
import android.telephony.CarrierConfigManager;
import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState;
@@ -51,6 +57,7 @@ import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.flags.Flags;
import com.android.settings.network.CarrierConfigCache;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -294,6 +301,48 @@ public class EnabledNetworkModePreferenceControllerTest {
String.valueOf(TelephonyManager.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
}
@UiThreadTest
@Test
@EnableFlags(Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION)
public void updateState_satelliteIsStartedAndSelectedSubForSatellite_disablePreference() {
mController.mSatelliteModemStateCallback
.onSatelliteModemStateChanged(SATELLITE_MODEM_STATE_CONNECTED);
mController.mSelectedNbIotSatelliteSubscriptionCallback
.onSelectedNbIotSatelliteSubscriptionChanged(SUB_ID);
mController.updateState(mPreference);
assertFalse(mPreference.isEnabled());
}
@UiThreadTest
@Test
@EnableFlags(Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION)
public void updateState_satelliteIsIdle_enablePreference() {
mController.mSatelliteModemStateCallback
.onSatelliteModemStateChanged(SATELLITE_MODEM_STATE_OFF);
mController.mSelectedNbIotSatelliteSubscriptionCallback
.onSelectedNbIotSatelliteSubscriptionChanged(SUB_ID);
mController.updateState(mPreference);
assertTrue(mPreference.isEnabled());
}
@UiThreadTest
@Test
@EnableFlags(Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION)
public void updateState_notSelectedSubForSatellite_enablePreference() {
mController.mSatelliteModemStateCallback
.onSatelliteModemStateChanged(SATELLITE_MODEM_STATE_CONNECTED);
mController.mSelectedNbIotSatelliteSubscriptionCallback
.onSelectedNbIotSatelliteSubscriptionChanged(0);
mController.updateState(mPreference);
assertTrue(mPreference.isEnabled());
}
@UiThreadTest
@Test
public void onPreferenceChange_updateSuccess() {

View File

@@ -16,12 +16,17 @@
package com.android.settings.network.telephony;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_OFF;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.GSM;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.RAF_TD_SCDMA;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.WCDMA;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -30,15 +35,18 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.PersistableBundle;
import android.platform.test.annotations.EnableFlags;
import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import androidx.preference.ListPreference;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.flags.Flags;
import com.android.settings.network.CarrierConfigCache;
import com.android.settings.testutils.ResourcesUtils;
@@ -104,6 +112,48 @@ public class PreferredNetworkModePreferenceControllerTest {
"preferred_network_mode_tdscdma_gsm_wcdma_summary"));
}
@Test
@UiThreadTest
@EnableFlags(Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION)
public void updateState_satelliteIsStartedAndSelectedSubForSatellite_disablePreference() {
mController.mSatelliteModemStateCallback
.onSatelliteModemStateChanged(SATELLITE_MODEM_STATE_CONNECTED);
mController.mSelectedNbIotSatelliteSubscriptionCallback
.onSelectedNbIotSatelliteSubscriptionChanged(SUB_ID);
mController.updateState(mPreference);
assertFalse(mPreference.isEnabled());
}
@Test
@UiThreadTest
@EnableFlags(Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION)
public void updateState_satelliteIsIdle_enablePreference() {
mController.mSatelliteModemStateCallback
.onSatelliteModemStateChanged(SATELLITE_MODEM_STATE_OFF);
mController.mSelectedNbIotSatelliteSubscriptionCallback
.onSelectedNbIotSatelliteSubscriptionChanged(SUB_ID);
mController.updateState(mPreference);
assertTrue(mPreference.isEnabled());
}
@Test
@UiThreadTest
@EnableFlags(Flags.FLAG_SATELLITE_OEM_SETTINGS_UX_MIGRATION)
public void updateState_notSelectedSubForSatellite_enablePreference() {
mController.mSatelliteModemStateCallback
.onSatelliteModemStateChanged(SATELLITE_MODEM_STATE_CONNECTED);
mController.mSelectedNbIotSatelliteSubscriptionCallback
.onSelectedNbIotSatelliteSubscriptionChanged(0);
mController.updateState(mPreference);
assertTrue(mPreference.isEnabled());
}
@Test
public void onPreferenceChange_updateNetworkMode() {
mController.onPreferenceChange(mPreference,