Loading src/java/com/android/internal/telephony/data/AutoDataSwitchController.java +26 −9 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import android.provider.Settings; import android.telephony.AccessNetworkConstants; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo.RegistrationState; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; Loading @@ -48,6 +49,7 @@ import android.util.LocalLog; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.flags.FeatureFlags; import com.android.internal.telephony.flags.FeatureFlagsImpl; import com.android.internal.telephony.subscription.SubscriptionInfoInternal; import com.android.internal.telephony.subscription.SubscriptionManagerService; import com.android.internal.telephony.util.NotificationChannelController; Loading Loading @@ -126,7 +128,7 @@ public class AutoDataSwitchController extends Handler { private final @NonNull LocalLog mLocalLog = new LocalLog(128); private final @NonNull Context mContext; private final @NonNull FeatureFlags mFlags; private static @NonNull FeatureFlags sFeatureFlags = new FeatureFlagsImpl(); private final @NonNull SubscriptionManagerService mSubscriptionManagerService; private final @NonNull PhoneSwitcher mPhoneSwitcher; private final @NonNull AutoDataSwitchControllerCallback mPhoneSwitcherCallback; Loading Loading @@ -173,7 +175,10 @@ public class AutoDataSwitchController extends Handler { * How preferred the current phone is. */ enum UsableState { HOME(1), ROAMING_ENABLED(0), NOT_USABLE(-1); HOME(2), ROAMING_ENABLED(1), NON_TERRESTRIAL(0), NOT_USABLE(-1); /** * The higher the score, the more preferred. * HOME is preferred over ROAMING assuming roaming is metered. Loading Loading @@ -214,12 +219,24 @@ public class AutoDataSwitchController extends Handler { * @return The current usable state of the phone. */ private UsableState getUsableState() { ServiceState serviceState = mPhone.getServiceState(); boolean isUsingNonTerrestrialNetwork = sFeatureFlags.carrierEnabledSatelliteFlag() && (serviceState != null) && serviceState.isUsingNonTerrestrialNetwork(); switch (mDataRegState) { case NetworkRegistrationInfo.REGISTRATION_STATE_HOME: if (isUsingNonTerrestrialNetwork) { return UsableState.NON_TERRESTRIAL; } return UsableState.HOME; case NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING: return mPhone.getDataRoamingEnabled() ? UsableState.ROAMING_ENABLED : UsableState.NOT_USABLE; if (mPhone.getDataRoamingEnabled()) { if (isUsingNonTerrestrialNetwork) { return UsableState.NON_TERRESTRIAL; } return UsableState.ROAMING_ENABLED; } return UsableState.NOT_USABLE; default: return UsableState.NOT_USABLE; } Loading Loading @@ -275,7 +292,7 @@ public class AutoDataSwitchController extends Handler { @NonNull AutoDataSwitchControllerCallback phoneSwitcherCallback) { super(looper); mContext = context; mFlags = featureFlags; sFeatureFlags = featureFlags; mSubscriptionManagerService = SubscriptionManagerService.getInstance(); mPhoneSwitcher = phoneSwitcher; mPhoneSwitcherCallback = phoneSwitcherCallback; Loading Loading @@ -599,7 +616,7 @@ public class AutoDataSwitchController extends Handler { boolean backToDefault = false; boolean needValidation = true; if (mFlags.autoSwitchAllowRoaming()) { if (sFeatureFlags.autoSwitchAllowRoaming()) { if (mDefaultNetworkIsOnNonCellular) { debugMessage.append(", back to default as default network") .append(" is active on nonCellular transport"); Loading Loading @@ -719,7 +736,7 @@ public class AutoDataSwitchController extends Handler { return INVALID_PHONE_INDEX; } if (mFlags.autoSwitchAllowRoaming()) { if (sFeatureFlags.autoSwitchAllowRoaming()) { // check whether primary and secondary signal status are worth switching if (!isRatSignalStrengthBasedSwitchEnabled() && isHomeService(mPhonesSignalStatus[defaultPhoneId].mDataRegState)) { Loading @@ -741,7 +758,7 @@ public class AutoDataSwitchController extends Handler { Phone secondaryDataPhone = null; PhoneSignalStatus candidatePhoneStatus = mPhonesSignalStatus[phoneId]; if (mFlags.autoSwitchAllowRoaming()) { if (sFeatureFlags.autoSwitchAllowRoaming()) { PhoneSignalStatus.UsableState currentUsableState = mPhonesSignalStatus[defaultPhoneId].getUsableState(); PhoneSignalStatus.UsableState candidatePhoneUsableRank = Loading Loading @@ -811,7 +828,7 @@ public class AutoDataSwitchController extends Handler { * @return {@code true} If the feature of switching base on RAT and signal strength is enabled. */ private boolean isRatSignalStrengthBasedSwitchEnabled() { return mFlags.autoDataSwitchRatSs() && mScoreTolerance >= 0; return sFeatureFlags.autoDataSwitchRatSs() && mScoreTolerance >= 0; } /** Loading tests/telephonytests/src/com/android/internal/telephony/data/AutoDataSwitchControllerTest.java +28 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ public class AutoDataSwitchControllerTest extends TelephonyTest { private static final int SCORE_TOLERANCE = 100; private static final int GOOD_RAT_SIGNAL_SCORE = 200; private static final int BAD_RAT_SIGNAL_SCORE = 50; private boolean mIsNonTerrestrialNetwork = false; // Mocked private AutoDataSwitchController.AutoDataSwitchControllerCallback mMockedPhoneSwitcherCallback; Loading Loading @@ -155,6 +156,7 @@ public class AutoDataSwitchControllerTest extends TelephonyTest { mPhoneSwitcher, mFeatureFlags, mMockedPhoneSwitcherCallback); doReturn(true).when(mFeatureFlags).autoSwitchAllowRoaming(); doReturn(true).when(mFeatureFlags).carrierEnabledSatelliteFlag(); } @After Loading Loading @@ -245,6 +247,31 @@ public class AutoDataSwitchControllerTest extends TelephonyTest { true/*needValidation*/); } @Test public void testRoaming_prefer_roam_over_nonTerrestrial() { // DDS -> nDDS: Prefer Roaming over non-terrestrial prepareIdealUsesNonDdsCondition(); mIsNonTerrestrialNetwork = true; serviceStateChanged(PHONE_1, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING); mIsNonTerrestrialNetwork = false; serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING); processAllFutureMessages(); verify(mMockedPhoneSwitcherCallback).onRequireValidation(PHONE_2, true/*needValidation*/); // nDDS -> DDS: Prefer Roaming over non-terrestrial doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId(); mIsNonTerrestrialNetwork = false; serviceStateChanged(PHONE_1, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); mIsNonTerrestrialNetwork = true; serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING); processAllFutureMessages(); verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX, true/*needValidation*/); mIsNonTerrestrialNetwork = false; } @Test public void testRoaming_roaming_but_roam_disabled() { // Disable RAT + signalStrength base switching. Loading Loading @@ -677,6 +704,7 @@ public class AutoDataSwitchControllerTest extends TelephonyTest { .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setRegistrationState(dataRegState) .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setIsNonTerrestrialNetwork(mIsNonTerrestrialNetwork) .build()); ss.setDataRoamingFromRegistration(dataRegState Loading Loading
src/java/com/android/internal/telephony/data/AutoDataSwitchController.java +26 −9 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import android.provider.Settings; import android.telephony.AccessNetworkConstants; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo.RegistrationState; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; Loading @@ -48,6 +49,7 @@ import android.util.LocalLog; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.flags.FeatureFlags; import com.android.internal.telephony.flags.FeatureFlagsImpl; import com.android.internal.telephony.subscription.SubscriptionInfoInternal; import com.android.internal.telephony.subscription.SubscriptionManagerService; import com.android.internal.telephony.util.NotificationChannelController; Loading Loading @@ -126,7 +128,7 @@ public class AutoDataSwitchController extends Handler { private final @NonNull LocalLog mLocalLog = new LocalLog(128); private final @NonNull Context mContext; private final @NonNull FeatureFlags mFlags; private static @NonNull FeatureFlags sFeatureFlags = new FeatureFlagsImpl(); private final @NonNull SubscriptionManagerService mSubscriptionManagerService; private final @NonNull PhoneSwitcher mPhoneSwitcher; private final @NonNull AutoDataSwitchControllerCallback mPhoneSwitcherCallback; Loading Loading @@ -173,7 +175,10 @@ public class AutoDataSwitchController extends Handler { * How preferred the current phone is. */ enum UsableState { HOME(1), ROAMING_ENABLED(0), NOT_USABLE(-1); HOME(2), ROAMING_ENABLED(1), NON_TERRESTRIAL(0), NOT_USABLE(-1); /** * The higher the score, the more preferred. * HOME is preferred over ROAMING assuming roaming is metered. Loading Loading @@ -214,12 +219,24 @@ public class AutoDataSwitchController extends Handler { * @return The current usable state of the phone. */ private UsableState getUsableState() { ServiceState serviceState = mPhone.getServiceState(); boolean isUsingNonTerrestrialNetwork = sFeatureFlags.carrierEnabledSatelliteFlag() && (serviceState != null) && serviceState.isUsingNonTerrestrialNetwork(); switch (mDataRegState) { case NetworkRegistrationInfo.REGISTRATION_STATE_HOME: if (isUsingNonTerrestrialNetwork) { return UsableState.NON_TERRESTRIAL; } return UsableState.HOME; case NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING: return mPhone.getDataRoamingEnabled() ? UsableState.ROAMING_ENABLED : UsableState.NOT_USABLE; if (mPhone.getDataRoamingEnabled()) { if (isUsingNonTerrestrialNetwork) { return UsableState.NON_TERRESTRIAL; } return UsableState.ROAMING_ENABLED; } return UsableState.NOT_USABLE; default: return UsableState.NOT_USABLE; } Loading Loading @@ -275,7 +292,7 @@ public class AutoDataSwitchController extends Handler { @NonNull AutoDataSwitchControllerCallback phoneSwitcherCallback) { super(looper); mContext = context; mFlags = featureFlags; sFeatureFlags = featureFlags; mSubscriptionManagerService = SubscriptionManagerService.getInstance(); mPhoneSwitcher = phoneSwitcher; mPhoneSwitcherCallback = phoneSwitcherCallback; Loading Loading @@ -599,7 +616,7 @@ public class AutoDataSwitchController extends Handler { boolean backToDefault = false; boolean needValidation = true; if (mFlags.autoSwitchAllowRoaming()) { if (sFeatureFlags.autoSwitchAllowRoaming()) { if (mDefaultNetworkIsOnNonCellular) { debugMessage.append(", back to default as default network") .append(" is active on nonCellular transport"); Loading Loading @@ -719,7 +736,7 @@ public class AutoDataSwitchController extends Handler { return INVALID_PHONE_INDEX; } if (mFlags.autoSwitchAllowRoaming()) { if (sFeatureFlags.autoSwitchAllowRoaming()) { // check whether primary and secondary signal status are worth switching if (!isRatSignalStrengthBasedSwitchEnabled() && isHomeService(mPhonesSignalStatus[defaultPhoneId].mDataRegState)) { Loading @@ -741,7 +758,7 @@ public class AutoDataSwitchController extends Handler { Phone secondaryDataPhone = null; PhoneSignalStatus candidatePhoneStatus = mPhonesSignalStatus[phoneId]; if (mFlags.autoSwitchAllowRoaming()) { if (sFeatureFlags.autoSwitchAllowRoaming()) { PhoneSignalStatus.UsableState currentUsableState = mPhonesSignalStatus[defaultPhoneId].getUsableState(); PhoneSignalStatus.UsableState candidatePhoneUsableRank = Loading Loading @@ -811,7 +828,7 @@ public class AutoDataSwitchController extends Handler { * @return {@code true} If the feature of switching base on RAT and signal strength is enabled. */ private boolean isRatSignalStrengthBasedSwitchEnabled() { return mFlags.autoDataSwitchRatSs() && mScoreTolerance >= 0; return sFeatureFlags.autoDataSwitchRatSs() && mScoreTolerance >= 0; } /** Loading
tests/telephonytests/src/com/android/internal/telephony/data/AutoDataSwitchControllerTest.java +28 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ public class AutoDataSwitchControllerTest extends TelephonyTest { private static final int SCORE_TOLERANCE = 100; private static final int GOOD_RAT_SIGNAL_SCORE = 200; private static final int BAD_RAT_SIGNAL_SCORE = 50; private boolean mIsNonTerrestrialNetwork = false; // Mocked private AutoDataSwitchController.AutoDataSwitchControllerCallback mMockedPhoneSwitcherCallback; Loading Loading @@ -155,6 +156,7 @@ public class AutoDataSwitchControllerTest extends TelephonyTest { mPhoneSwitcher, mFeatureFlags, mMockedPhoneSwitcherCallback); doReturn(true).when(mFeatureFlags).autoSwitchAllowRoaming(); doReturn(true).when(mFeatureFlags).carrierEnabledSatelliteFlag(); } @After Loading Loading @@ -245,6 +247,31 @@ public class AutoDataSwitchControllerTest extends TelephonyTest { true/*needValidation*/); } @Test public void testRoaming_prefer_roam_over_nonTerrestrial() { // DDS -> nDDS: Prefer Roaming over non-terrestrial prepareIdealUsesNonDdsCondition(); mIsNonTerrestrialNetwork = true; serviceStateChanged(PHONE_1, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING); mIsNonTerrestrialNetwork = false; serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING); processAllFutureMessages(); verify(mMockedPhoneSwitcherCallback).onRequireValidation(PHONE_2, true/*needValidation*/); // nDDS -> DDS: Prefer Roaming over non-terrestrial doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId(); mIsNonTerrestrialNetwork = false; serviceStateChanged(PHONE_1, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); mIsNonTerrestrialNetwork = true; serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING); processAllFutureMessages(); verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX, true/*needValidation*/); mIsNonTerrestrialNetwork = false; } @Test public void testRoaming_roaming_but_roam_disabled() { // Disable RAT + signalStrength base switching. Loading Loading @@ -677,6 +704,7 @@ public class AutoDataSwitchControllerTest extends TelephonyTest { .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setRegistrationState(dataRegState) .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setIsNonTerrestrialNetwork(mIsNonTerrestrialNetwork) .build()); ss.setDataRoamingFromRegistration(dataRegState Loading