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; 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.getNetworkModePreferenceType;
import static com.android.settings.network.telephony.EnabledNetworkModePreferenceControllerHelperKt.setAllowedNetworkTypes; import static com.android.settings.network.telephony.EnabledNetworkModePreferenceControllerHelperKt.setAllowedNetworkTypes;
import static com.android.settings.network.telephony.mode.NetworkModes.addNrToLteNetworkMode; 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.SubscriptionManager;
import android.telephony.TelephonyCallback; import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.satellite.SatelliteManager;
import android.telephony.satellite.SatelliteModemStateCallback;
import android.telephony.satellite.SelectedNbIotSatelliteSubscriptionCallback;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.ListPreference; import androidx.preference.ListPreference;
import androidx.preference.ListPreferenceDialogFragmentCompat; import androidx.preference.ListPreferenceDialogFragmentCompat;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -67,7 +66,7 @@ import java.util.stream.Stream;
*/ */
public class EnabledNetworkModePreferenceController extends public class EnabledNetworkModePreferenceController extends
BasePreferenceController implements BasePreferenceController implements
ListPreference.OnPreferenceChangeListener, LifecycleObserver, ListPreference.OnPreferenceChangeListener, DefaultLifecycleObserver,
SubscriptionsChangeListener.SubscriptionsChangeListenerClient { SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
private static final String LOG_TAG = "EnabledNetworkMode"; private static final String LOG_TAG = "EnabledNetworkMode";
@@ -83,6 +82,43 @@ public class EnabledNetworkModePreferenceController extends
private PhoneCallStateTelephonyCallback mTelephonyCallback; private PhoneCallStateTelephonyCallback mTelephonyCallback;
private FragmentManager mFragmentManager; private FragmentManager mFragmentManager;
private LifecycleOwner mViewLifecycleOwner; 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) { public EnabledNetworkModePreferenceController(Context context, String key) {
super(context, key); super(context, key);
@@ -90,6 +126,7 @@ public class EnabledNetworkModePreferenceController extends
if (mTelephonyCallback == null) { if (mTelephonyCallback == null) {
mTelephonyCallback = new PhoneCallStateTelephonyCallback(); mTelephonyCallback = new PhoneCallStateTelephonyCallback();
} }
mSatelliteManager = context.getSystemService(SatelliteManager.class);
} }
@Override @Override
@@ -103,8 +140,22 @@ public class EnabledNetworkModePreferenceController extends
return mCallState == TelephonyManager.CALL_STATE_IDLE; return mCallState == TelephonyManager.CALL_STATE_IDLE;
} }
@OnLifecycleEvent(ON_START) @Override
public void onStart() { 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(); mSubscriptionsListener.start();
if (mAllowedNetworkTypesListener == null || mTelephonyCallback == null) { if (mAllowedNetworkTypesListener == null || mTelephonyCallback == null) {
return; return;
@@ -113,9 +164,21 @@ public class EnabledNetworkModePreferenceController extends
mTelephonyCallback.register(mTelephonyManager, mSubId); mTelephonyCallback.register(mTelephonyManager, mSubId);
} }
@OnLifecycleEvent(ON_STOP) @Override
public void onStop() { public void onStop(@NonNull LifecycleOwner owner) {
mSubscriptionsListener.stop(); 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) { if (mAllowedNetworkTypesListener == null || mTelephonyCallback == null) {
return; return;
} }
@@ -147,7 +210,7 @@ public class EnabledNetworkModePreferenceController extends
listPreference.setEntryValues(mBuilder.getEntryValues()); listPreference.setEntryValues(mBuilder.getEntryValues());
listPreference.setValue(Integer.toString(mBuilder.getSelectedEntryValue())); listPreference.setValue(Integer.toString(mBuilder.getSelectedEntryValue()));
listPreference.setSummary(mBuilder.getSummary()); listPreference.setSummary(mBuilder.getSummary());
boolean listPreferenceEnabled = isCallStateIdle(); boolean listPreferenceEnabled = isPreferenceShallEnabled();
listPreference.setEnabled(listPreferenceEnabled); listPreference.setEnabled(listPreferenceEnabled);
if (!listPreferenceEnabled) { if (!listPreferenceEnabled) {
// If dialog is already opened when ListPreference disabled, dismiss them. // 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 final class PreferenceEntriesBuilder {
private CarrierConfigCache mCarrierConfigCache; private CarrierConfigCache mCarrierConfigCache;
private Context mContext; private Context mContext;
@@ -254,7 +325,7 @@ public class EnabledNetworkModePreferenceController extends
if (flagHidePrefer3gItem) { if (flagHidePrefer3gItem) {
mDisplay3gOptions = carrierConfig.getBoolean( mDisplay3gOptions = carrierConfig.getBoolean(
CarrierConfigManager.KEY_PREFER_3G_VISIBILITY_BOOL); CarrierConfigManager.KEY_PREFER_3G_VISIBILITY_BOOL);
} else { } else {
mDisplay3gOptions = getResourcesForSubId().getBoolean( mDisplay3gOptions = getResourcesForSubId().getBoolean(
R.bool.config_display_network_mode_3g_option); 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.RadioAccessFamily;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.satellite.SatelliteManager;
import android.telephony.satellite.SatelliteModemStateCallback;
import android.telephony.satellite.SelectedNbIotSatelliteSubscriptionCallback;
import android.util.Log; 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.ListPreference;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
@@ -38,17 +46,56 @@ import com.android.settings.network.telephony.mode.NetworkModes;
* Preference controller for "Preferred network mode" * Preference controller for "Preferred network mode"
*/ */
public class PreferredNetworkModePreferenceController extends BasePreferenceController public class PreferredNetworkModePreferenceController extends BasePreferenceController
implements ListPreference.OnPreferenceChangeListener { implements ListPreference.OnPreferenceChangeListener, DefaultLifecycleObserver {
private static final String TAG = "PrefNetworkModeCtrl"; private static final String TAG = "PrefNetworkModeCtrl";
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
private CarrierConfigCache mCarrierConfigCache; private CarrierConfigCache mCarrierConfigCache;
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
private boolean mIsGlobalCdma; 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) { public PreferredNetworkModePreferenceController(Context context, String key) {
super(context, key); super(context, key);
mCarrierConfigCache = CarrierConfigCache.getInstance(context); mCarrierConfigCache = CarrierConfigCache.getInstance(context);
mSatelliteManager = context.getSystemService(SatelliteManager.class);
} }
@Override @Override
@@ -58,9 +105,19 @@ public class PreferredNetworkModePreferenceController extends BasePreferenceCont
? AVAILABLE : CONDITIONALLY_UNAVAILABLE; ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
} }
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
}
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
if (preference == null) {
return;
}
super.updateState(preference); super.updateState(preference);
preference.setEnabled(!(mIsCurrentSubscriptionForSatellite && mIsSatelliteSessionStarted));
final ListPreference listPreference = (ListPreference) preference; final ListPreference listPreference = (ListPreference) preference;
final int networkMode = getPreferredNetworkMode(); final int networkMode = getPreferredNetworkMode();
listPreference.setValue(Integer.toString(networkMode)); listPreference.setValue(Integer.toString(networkMode));
@@ -75,9 +132,9 @@ public class PreferredNetworkModePreferenceController extends BasePreferenceCont
TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER, TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER,
RadioAccessFamily.getRafFromNetworkType(newPreferredNetworkMode)); RadioAccessFamily.getRafFromNetworkType(newPreferredNetworkMode));
final ListPreference listPreference = (ListPreference) preference; final ListPreference listPreference = (ListPreference) preference;
listPreference.setSummary(getPreferredNetworkModeSummaryResId(newPreferredNetworkMode)); listPreference.setSummary(getPreferredNetworkModeSummaryResId(newPreferredNetworkMode));
return true; return true;
} }
public void init(int subId) { public void init(int subId) {
@@ -90,6 +147,38 @@ public class PreferredNetworkModePreferenceController extends BasePreferenceCont
&& carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL); && 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() { private int getPreferredNetworkMode() {
if (mTelephonyManager == null) { if (mTelephonyManager == null) {
Log.w(TAG, "TelephonyManager is null"); Log.w(TAG, "TelephonyManager is null");

View File

@@ -25,18 +25,22 @@ import android.telephony.CarrierConfigManager
import android.telephony.ServiceState import android.telephony.ServiceState
import android.telephony.SubscriptionManager import android.telephony.SubscriptionManager
import android.telephony.TelephonyManager 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.annotation.VisibleForTesting
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.preference.Preference
import androidx.preference.PreferenceScreen
import com.android.settings.R import com.android.settings.R
import com.android.settings.Settings.NetworkSelectActivity import com.android.settings.Settings.NetworkSelectActivity
import com.android.settings.flags.Flags
import com.android.settings.network.CarrierConfigCache import com.android.settings.network.CarrierConfigCache
import com.android.settings.network.telephony.MobileNetworkUtils import com.android.settings.network.telephony.MobileNetworkUtils
import com.android.settings.network.telephony.allowedNetworkTypesFlow 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.framework.util.collectLatestWithLifecycle
import com.android.settingslib.spa.widget.preference.SwitchPreference import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel 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.Dispatchers
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@@ -59,6 +61,7 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import kotlin.time.Duration.Companion.seconds
/** /**
* Preference controller for "Auto Select Network" * Preference controller for "Auto Select Network"
@@ -73,9 +76,13 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
private val getConfigForSubId: (subId: Int) -> PersistableBundle = { subId -> private val getConfigForSubId: (subId: Int) -> PersistableBundle = { subId ->
CarrierConfigCache.getInstance(context).getConfigForSubId(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 telephonyManager: TelephonyManager
private lateinit var satelliteManager: SatelliteManager
private val listeners = mutableListOf<OnNetworkSelectModeListener>() private val listeners = mutableListOf<OnNetworkSelectModeListener>()
@VisibleForTesting @VisibleForTesting
@@ -83,6 +90,21 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
private var subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID 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. * Initialization based on given subscription id.
*/ */
@@ -90,7 +112,7 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
this.subId = subId this.subId = subId
telephonyManager = mContext.getSystemService(TelephonyManager::class.java)!! telephonyManager = mContext.getSystemService(TelephonyManager::class.java)!!
.createForSubscriptionId(subId) .createForSubscriptionId(subId)
satelliteManager = mContext.getSystemService(SatelliteManager::class.java)!!
return this return this
} }
@@ -117,7 +139,10 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
SwitchPreference(object : SwitchPreferenceModel { SwitchPreference(object : SwitchPreferenceModel {
override val title = stringResource(R.string.select_automatically) override val title = stringResource(R.string.select_automatically)
override val summary = { disallowedSummary } override val summary = { disallowedSummary }
override val changeable = { disallowedSummary.isEmpty() } override val changeable = {
disallowedSummary.isEmpty()
&& !(isSatelliteSessionStarted && isSelectedSubIdForSatellite)
}
override val checked = { isAuto } override val checked = { isAuto }
override val onCheckedChange: (Boolean) -> Unit = { newChecked -> override val onCheckedChange: (Boolean) -> Unit = { newChecked ->
if (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 = private suspend fun getDisallowedSummary(serviceState: ServiceState): String =
withContext(Dispatchers.Default) { withContext(Dispatchers.Default) {
if (!serviceState.roaming && onlyAutoSelectInHome()) { if (!serviceState.roaming && onlyAutoSelectInHome()) {
@@ -213,6 +270,8 @@ class AutoSelectPreferenceController @JvmOverloads constructor(
} }
companion object { companion object {
private const val TAG = "AutoSelectPreferenceController"
private val MINIMUM_DIALOG_TIME = 1.seconds 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.Context
import android.content.Intent import android.content.Intent
import android.platform.test.annotations.EnableFlags
import android.provider.Settings import android.provider.Settings
import android.telephony.CarrierConfigManager import android.telephony.CarrierConfigManager
import android.telephony.ServiceState import android.telephony.ServiceState
import android.telephony.TelephonyManager import android.telephony.TelephonyManager
import android.telephony.satellite.SatelliteManager
import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsEnabled
import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.assertIsNotEnabled
import androidx.compose.ui.test.assertIsOff import androidx.compose.ui.test.assertIsOff
@@ -36,6 +38,7 @@ import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R import com.android.settings.R
import com.android.settings.Settings.NetworkSelectActivity import com.android.settings.Settings.NetworkSelectActivity
import com.android.settings.flags.Flags
import com.android.settings.spa.preference.ComposePreference import com.android.settings.spa.preference.ComposePreference
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@@ -46,6 +49,8 @@ import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.kotlin.any import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.doNothing import org.mockito.kotlin.doNothing
@@ -57,6 +62,9 @@ import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class AutoSelectPreferenceControllerTest { class AutoSelectPreferenceControllerTest {
@get:Rule
val mockito = MockitoJUnit.rule()
@get:Rule @get:Rule
val composeTestRule = createComposeRule() val composeTestRule = createComposeRule()
@@ -65,8 +73,12 @@ class AutoSelectPreferenceControllerTest {
on { simOperatorName } doReturn OPERATOR_NAME on { simOperatorName } doReturn OPERATOR_NAME
} }
private val mockSatelliteManager = mock<SatelliteManager> {
}
private val context: Context = spy(ApplicationProvider.getApplicationContext()) { private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
on { getSystemService(SatelliteManager::class.java) } doReturn mockSatelliteManager
doNothing().whenever(mock).startActivity(any()) doNothing().whenever(mock).startActivity(any())
} }
@@ -115,7 +127,6 @@ class AutoSelectPreferenceControllerTest {
.assertIsOff() .assertIsOff()
} }
@Test @Test
fun isEnabled_isRoaming_enabled() { fun isEnabled_isRoaming_enabled() {
serviceState.roaming = true serviceState.roaming = true
@@ -158,6 +169,54 @@ class AutoSelectPreferenceControllerTest {
.assertIsNotEnabled() .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 @Test
fun onClick_turnOff_startNetworkSelectActivity() { fun onClick_turnOff_startNetworkSelectActivity() {
serviceState.isManualSelection = false serviceState.isManualSelection = false

View File

@@ -16,6 +16,9 @@
package com.android.settings.network.telephony; 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 androidx.lifecycle.Lifecycle.Event.ON_START;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.CDMA; 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 com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals; 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.doReturn;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.platform.test.annotations.EnableFlags;
import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager;
import android.telephony.RadioAccessFamily; import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState; import android.telephony.ServiceState;
@@ -51,6 +57,7 @@ import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.flags.Flags;
import com.android.settings.network.CarrierConfigCache; import com.android.settings.network.CarrierConfigCache;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -294,6 +301,48 @@ public class EnabledNetworkModePreferenceControllerTest {
String.valueOf(TelephonyManager.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA)); 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 @UiThreadTest
@Test @Test
public void onPreferenceChange_updateSuccess() { public void onPreferenceChange_updateSuccess() {

View File

@@ -16,12 +16,17 @@
package com.android.settings.network.telephony; 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.GSM;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.RAF_TD_SCDMA; 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.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.WCDMA;
import static com.google.common.truth.Truth.assertThat; 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.doReturn;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
@@ -30,15 +35,18 @@ import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.platform.test.annotations.EnableFlags;
import android.telephony.RadioAccessFamily; import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState; import android.telephony.ServiceState;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import androidx.preference.ListPreference; import androidx.preference.ListPreference;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.flags.Flags;
import com.android.settings.network.CarrierConfigCache; import com.android.settings.network.CarrierConfigCache;
import com.android.settings.testutils.ResourcesUtils; import com.android.settings.testutils.ResourcesUtils;
@@ -104,6 +112,48 @@ public class PreferredNetworkModePreferenceControllerTest {
"preferred_network_mode_tdscdma_gsm_wcdma_summary")); "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 @Test
public void onPreferenceChange_updateNetworkMode() { public void onPreferenceChange_updateNetworkMode() {
mController.onPreferenceChange(mPreference, mController.onPreferenceChange(mPreference,