Merge "Exit emergency callback mode before turning off radio power" into main
diff --git a/flags/data.aconfig b/flags/data.aconfig
index e65f8e4..152660b 100644
--- a/flags/data.aconfig
+++ b/flags/data.aconfig
@@ -1,6 +1,20 @@
package: "com.android.internal.telephony.flags"
flag {
+ name: "auto_switch_allow_roaming"
+ namespace: "telephony"
+ description: "Allow using roaming network as target if user allows it from settings."
+ bug: "306488039"
+}
+
+flag {
+ name: "auto_data_switch_rat_ss"
+ namespace: "telephony"
+ description: "Whether switch for better rat and signal strength"
+ bug:"260928808"
+}
+
+flag {
name: "use_alarm_callback"
namespace: "telephony"
description: "Use alarm callback instead of broadcast."
@@ -69,4 +83,3 @@
description: "notify data activity changed for slot id"
bug: "309896936"
}
-
diff --git a/flags/misc.aconfig b/flags/misc.aconfig
index c7140f5..7f40596 100644
--- a/flags/misc.aconfig
+++ b/flags/misc.aconfig
@@ -70,3 +70,10 @@
description: "Expose carrier config KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL and KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL."
bug: "310264981"
}
+
+flag {
+ name: "radio_info_is_radio_on"
+ namespace: "telephony"
+ description: "change method to show mobile radio power from service state to radio power"
+ bug: "306084899"
+}
diff --git a/src/java/com/android/internal/telephony/PhoneFactory.java b/src/java/com/android/internal/telephony/PhoneFactory.java
index 3560048..0cbc035 100644
--- a/src/java/com/android/internal/telephony/PhoneFactory.java
+++ b/src/java/com/android/internal/telephony/PhoneFactory.java
@@ -265,7 +265,8 @@
sPhoneSwitcher = TelephonyComponentFactory.getInstance().inject(
PhoneSwitcher.class.getName()).
- makePhoneSwitcher(maxActivePhones, sContext, Looper.myLooper());
+ makePhoneSwitcher(maxActivePhones, sContext, Looper.myLooper(),
+ featureFlags);
sProxyController = ProxyController.getInstance(context);
diff --git a/src/java/com/android/internal/telephony/TelephonyComponentFactory.java b/src/java/com/android/internal/telephony/TelephonyComponentFactory.java
index eede6a6..74094a3 100644
--- a/src/java/com/android/internal/telephony/TelephonyComponentFactory.java
+++ b/src/java/com/android/internal/telephony/TelephonyComponentFactory.java
@@ -481,8 +481,8 @@
}
public PhoneSwitcher makePhoneSwitcher(int maxDataAttachModemCount, Context context,
- Looper looper) {
- return PhoneSwitcher.make(maxDataAttachModemCount, context, looper);
+ Looper looper, @NonNull FeatureFlags featureFlags) {
+ return PhoneSwitcher.make(maxDataAttachModemCount, context, looper, featureFlags);
}
/**
diff --git a/src/java/com/android/internal/telephony/data/AutoDataSwitchController.java b/src/java/com/android/internal/telephony/data/AutoDataSwitchController.java
index 0ea0598..e8cd8f0 100644
--- a/src/java/com/android/internal/telephony/data/AutoDataSwitchController.java
+++ b/src/java/com/android/internal/telephony/data/AutoDataSwitchController.java
@@ -47,6 +47,7 @@
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.util.NotificationChannelController;
@@ -125,6 +126,7 @@
private final @NonNull LocalLog mLocalLog = new LocalLog(128);
private final @NonNull Context mContext;
+ private final @NonNull FeatureFlags mFlags;
private final @NonNull SubscriptionManagerService mSubscriptionManagerService;
private final @NonNull PhoneSwitcher mPhoneSwitcher;
private final @NonNull AutoDataSwitchControllerCallback mPhoneSwitcherCallback;
@@ -167,15 +169,29 @@
* switch to.
*/
private static class PhoneSignalStatus {
+ /**
+ * How preferred the current phone is.
+ */
+ enum UsableState {
+ HOME(1), ROAMING_ENABLED(0), NOT_USABLE(-1);
+ /**
+ * The higher the score, the more preferred.
+ * HOME is preferred over ROAMING assuming roaming is metered.
+ */
+ final int mScore;
+ UsableState(int score) {
+ this.mScore = score;
+ }
+ }
/** The phone */
- private final @NonNull Phone mPhone;
+ @NonNull private final Phone mPhone;
/** Data registration state of the phone */
- private @RegistrationState int mDataRegState = NetworkRegistrationInfo
+ @RegistrationState private int mDataRegState = NetworkRegistrationInfo
.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING;
/** Current Telephony display info of the phone */
- private @NonNull TelephonyDisplayInfo mDisplayInfo;
+ @NonNull private TelephonyDisplayInfo mDisplayInfo;
/** Signal strength of the phone */
- private @NonNull SignalStrength mSignalStrength;
+ @NonNull private SignalStrength mSignalStrength;
/** {@code true} if this slot is listening for events. */
private boolean mListeningForEvents;
private PhoneSignalStatus(@NonNull Phone phone) {
@@ -193,11 +209,28 @@
? mPhone.getDataNetworkController().getDataConfigManager()
.getAutoDataSwitchScore(mDisplayInfo, mSignalStrength) : 0;
}
+
+ /**
+ * @return The current usable state of the phone.
+ */
+ private UsableState getUsableState() {
+ switch (mDataRegState) {
+ case NetworkRegistrationInfo.REGISTRATION_STATE_HOME:
+ return UsableState.HOME;
+ case NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING:
+ return mPhone.getDataRoamingEnabled()
+ ? UsableState.ROAMING_ENABLED : UsableState.NOT_USABLE;
+ default:
+ return UsableState.NOT_USABLE;
+ }
+ }
+
@Override
public String toString() {
return "{phone " + mPhone.getPhoneId()
+ " score=" + getRatSignalScore() + " dataRegState="
+ NetworkRegistrationInfo.registrationStateToString(mDataRegState)
+ + " " + getUsableState()
+ " display=" + mDisplayInfo + " signalStrength=" + mSignalStrength.getLevel()
+ " listeningForEvents=" + mListeningForEvents
+ "}";
@@ -238,10 +271,11 @@
* @param phoneSwitcherCallback Callback for phone switcher to execute.
*/
public AutoDataSwitchController(@NonNull Context context, @NonNull Looper looper,
- @NonNull PhoneSwitcher phoneSwitcher,
+ @NonNull PhoneSwitcher phoneSwitcher, @NonNull FeatureFlags featureFlags,
@NonNull AutoDataSwitchControllerCallback phoneSwitcherCallback) {
super(looper);
mContext = context;
+ mFlags = featureFlags;
mSubscriptionManagerService = SubscriptionManagerService.getInstance();
mPhoneSwitcher = phoneSwitcher;
mPhoneSwitcherCallback = phoneSwitcherCallback;
@@ -275,7 +309,7 @@
}
/** Notify subscriptions changed. */
- public void notifySubscriptionsChanged() {
+ public void notifySubscriptionsMappingChanged() {
sendEmptyMessage(EVENT_SUBSCRIPTIONS_CHANGED);
}
@@ -291,16 +325,19 @@
.collect(Collectors.toSet());
// Track events only if there are at least two active visible subscriptions.
if (activePhoneIds.size() < 2) activePhoneIds.clear();
+ boolean changed = false;
for (int phoneId = 0; phoneId < mPhonesSignalStatus.length; phoneId++) {
if (activePhoneIds.contains(phoneId)
&& !mPhonesSignalStatus[phoneId].mListeningForEvents) {
registerAllEventsForPhone(phoneId);
+ changed = true;
} else if (!activePhoneIds.contains(phoneId)
&& mPhonesSignalStatus[phoneId].mListeningForEvents) {
unregisterAllEventsForPhone(phoneId);
+ changed = true;
}
}
- logl("onSubscriptionChanged: " + Arrays.toString(mPhonesSignalStatus));
+ if (changed) logl("onSubscriptionChanged: " + Arrays.toString(mPhonesSignalStatus));
}
/**
@@ -362,7 +399,7 @@
case EVENT_SERVICE_STATE_CHANGED:
ar = (AsyncResult) msg.obj;
phoneId = (int) ar.userObj;
- onRegistrationStateChanged(phoneId);
+ onServiceStateChanged(phoneId);
break;
case EVENT_DISPLAY_INFO_CHANGED:
ar = (AsyncResult) msg.obj;
@@ -396,7 +433,7 @@
/**
* Called when registration state changed.
*/
- private void onRegistrationStateChanged(int phoneId) {
+ private void onServiceStateChanged(int phoneId) {
Phone phone = PhoneFactory.getPhone(phoneId);
if (phone != null && isActiveModemPhone(phoneId)) {
int oldRegState = mPhonesSignalStatus[phoneId].mDataRegState;
@@ -409,7 +446,7 @@
mPhonesSignalStatus[phoneId].mDataRegState = newRegState;
if (isInService(oldRegState) != isInService(newRegState)
|| isHomeService(oldRegState) != isHomeService(newRegState)) {
- log("onRegistrationStateChanged: phone " + phoneId + " "
+ log("onServiceStateChanged: phone " + phoneId + " "
+ NetworkRegistrationInfo.registrationStateToString(oldRegState)
+ " -> "
+ NetworkRegistrationInfo.registrationStateToString(newRegState));
@@ -562,35 +599,92 @@
boolean backToDefault = false;
boolean needValidation = true;
- if (mDefaultNetworkIsOnNonCellular) {
- log(debugMessage.append(", back to default as default network")
- .append(" is active on nonCellular transport").toString());
- backToDefault = true;
- needValidation = false;
- } else if (!isHomeService(mPhonesSignalStatus[preferredPhoneId].mDataRegState)) {
- log(debugMessage.append(", back to default as backup phone lost HOME registration")
- .toString());
- backToDefault = true;
- needValidation = false;
- } else if (isRatSignalStrengthBasedSwitchEnabled()) {
- int defaultScore = mPhonesSignalStatus[defaultDataPhoneId].getRatSignalScore();
- int currentScore = mPhonesSignalStatus[preferredPhoneId].getRatSignalScore();
- if ((defaultScore - currentScore) > mScoreTolerance) {
- log(debugMessage
- .append(", back to default as default phone has higher score ")
- .append(defaultScore).append(" versus current ")
- .append(currentScore).toString());
+ if (mFlags.autoSwitchAllowRoaming()) {
+ if (mDefaultNetworkIsOnNonCellular) {
+ debugMessage.append(", back to default as default network")
+ .append(" is active on nonCellular transport");
+ backToDefault = true;
+ needValidation = false;
+ } else {
+ PhoneSignalStatus.UsableState defaultUsableState =
+ mPhonesSignalStatus[defaultDataPhoneId].getUsableState();
+ PhoneSignalStatus.UsableState currentUsableState =
+ mPhonesSignalStatus[preferredPhoneId].getUsableState();
+
+ boolean isCurrentUsable = currentUsableState.mScore
+ > PhoneSignalStatus.UsableState.NOT_USABLE.mScore;
+
+ if (currentUsableState.mScore < defaultUsableState.mScore) {
+ debugMessage.append(", back to default phone ").append(preferredPhoneId)
+ .append(" : ").append(defaultUsableState)
+ .append(" , backup phone: ").append(currentUsableState);
+
+ backToDefault = true;
+ // Require validation if the current preferred phone is usable.
+ needValidation = isCurrentUsable && mRequirePingTestBeforeSwitch;
+ } else if (defaultUsableState.mScore == currentUsableState.mScore) {
+ debugMessage.append(", default phone ").append(preferredPhoneId)
+ .append(" : ").append(defaultUsableState)
+ .append(" , backup phone: ").append(currentUsableState);
+
+ if (isCurrentUsable) {
+ // Both phones are usable.
+ if (isRatSignalStrengthBasedSwitchEnabled()) {
+ int defaultScore = mPhonesSignalStatus[defaultDataPhoneId]
+ .getRatSignalScore();
+ int currentScore = mPhonesSignalStatus[preferredPhoneId]
+ .getRatSignalScore();
+ if ((defaultScore - currentScore) > mScoreTolerance) {
+ debugMessage
+ .append(", back to default for higher score ")
+ .append(defaultScore).append(" versus current ")
+ .append(currentScore);
+ backToDefault = true;
+ needValidation = mRequirePingTestBeforeSwitch;
+ }
+ } else {
+ // Only OOS/in service switch is enabled, switch back.
+ debugMessage.append(", back to default as it's usable. ");
+ backToDefault = true;
+ needValidation = mRequirePingTestBeforeSwitch;
+ }
+ } else {
+ debugMessage.append(", back to default as both phones are unusable.");
+ backToDefault = true;
+ needValidation = false;
+ }
+ }
+ }
+ } else {
+ if (mDefaultNetworkIsOnNonCellular) {
+ debugMessage.append(", back to default as default network")
+ .append(" is active on nonCellular transport");
+ backToDefault = true;
+ needValidation = false;
+ } else if (!isHomeService(mPhonesSignalStatus[preferredPhoneId].mDataRegState)) {
+ debugMessage.append(", back to default as backup phone lost HOME registration");
+ backToDefault = true;
+ needValidation = false;
+ } else if (isRatSignalStrengthBasedSwitchEnabled()) {
+ int defaultScore = mPhonesSignalStatus[defaultDataPhoneId].getRatSignalScore();
+ int currentScore = mPhonesSignalStatus[preferredPhoneId].getRatSignalScore();
+ if ((defaultScore - currentScore) > mScoreTolerance) {
+ debugMessage
+ .append(", back to default as default phone has higher score ")
+ .append(defaultScore).append(" versus current ")
+ .append(currentScore);
+ backToDefault = true;
+ needValidation = mRequirePingTestBeforeSwitch;
+ }
+ } else if (isInService(mPhonesSignalStatus[defaultDataPhoneId].mDataRegState)) {
+ debugMessage.append(", back to default as the default is back to service ");
backToDefault = true;
needValidation = mRequirePingTestBeforeSwitch;
}
- } else if (isInService(mPhonesSignalStatus[defaultDataPhoneId].mDataRegState)) {
- log(debugMessage.append(", back to default as the default is back to service ")
- .toString());
- backToDefault = true;
- needValidation = mRequirePingTestBeforeSwitch;
}
if (backToDefault) {
+ log(debugMessage.toString());
mSelectedTargetPhoneId = defaultDataPhoneId;
startStabilityCheck(DEFAULT_PHONE_INDEX, needValidation);
} else {
@@ -625,20 +719,60 @@
return INVALID_PHONE_INDEX;
}
- // check whether primary and secondary signal status are worth switching
- if (!isRatSignalStrengthBasedSwitchEnabled()
- && isInService(mPhonesSignalStatus[defaultPhoneId].mDataRegState)) {
- debugMessage.append(", no candidate as default phone is in service");
- return INVALID_PHONE_INDEX;
+ if (mFlags.autoSwitchAllowRoaming()) {
+ // check whether primary and secondary signal status are worth switching
+ if (!isRatSignalStrengthBasedSwitchEnabled()
+ && isHomeService(mPhonesSignalStatus[defaultPhoneId].mDataRegState)) {
+ debugMessage.append(", no candidate as default phone is in HOME service");
+ return INVALID_PHONE_INDEX;
+ }
+ } else {
+ // check whether primary and secondary signal status are worth switching
+ if (!isRatSignalStrengthBasedSwitchEnabled()
+ && isInService(mPhonesSignalStatus[defaultPhoneId].mDataRegState)) {
+ debugMessage.append(", no candidate as default phone is in service");
+ return INVALID_PHONE_INDEX;
+ }
}
- for (int phoneId = 0; phoneId < mPhonesSignalStatus.length; phoneId++) {
- if (phoneId != defaultPhoneId
- // the alternative phone must have HOME availability
- && isHomeService(mPhonesSignalStatus[phoneId].mDataRegState)) {
- Phone secondaryDataPhone = null;
- debugMessage.append(", found phone ").append(phoneId).append(" in HOME reg");
- if (isInService(mPhonesSignalStatus[defaultPhoneId].mDataRegState)) {
+ PhoneSignalStatus defaultPhoneStatus = mPhonesSignalStatus[defaultPhoneId];
+ for (int phoneId = 0; phoneId < mPhonesSignalStatus.length; phoneId++) {
+ if (phoneId == defaultPhoneId) continue;
+
+ Phone secondaryDataPhone = null;
+ PhoneSignalStatus candidatePhoneStatus = mPhonesSignalStatus[phoneId];
+ if (mFlags.autoSwitchAllowRoaming()) {
+ PhoneSignalStatus.UsableState currentUsableState =
+ mPhonesSignalStatus[defaultPhoneId].getUsableState();
+ PhoneSignalStatus.UsableState candidatePhoneUsableRank =
+ mPhonesSignalStatus[phoneId].getUsableState();
+ debugMessage.append(", found phone ").append(phoneId).append(" is ").append(
+ candidatePhoneUsableRank)
+ .append(", current is ").append(currentUsableState);
+ if (candidatePhoneUsableRank.mScore > currentUsableState.mScore) {
+ secondaryDataPhone = PhoneFactory.getPhone(phoneId);
+ } else if (isRatSignalStrengthBasedSwitchEnabled()
+ && currentUsableState.mScore == candidatePhoneUsableRank.mScore) {
+ // Both phones are home or both roaming enabled, so compare RAT/signal score.
+
+ int defaultScore = defaultPhoneStatus.getRatSignalScore();
+ int candidateScore = candidatePhoneStatus.getRatSignalScore();
+ if ((candidateScore - defaultScore) > mScoreTolerance) {
+ debugMessage.append(" with higher score ").append(
+ candidateScore)
+ .append(" versus current ").append(defaultScore);
+ secondaryDataPhone = PhoneFactory.getPhone(phoneId);
+ } else {
+ debugMessage.append(", but its score ").append(candidateScore)
+ .append(" doesn't meet the bar to switch given the current ")
+ .append(defaultScore);
+ }
+ }
+ } else if (isHomeService(candidatePhoneStatus.mDataRegState)) {
+ // the alternative phone must have HOME availability
+ debugMessage.append(", found phone ").append(phoneId).append(" in HOME service");
+
+ if (isInService(defaultPhoneStatus.mDataRegState)) {
// Use score if RAT/signal strength based switch is enabled and both phone are
// in service.
if (isRatSignalStrengthBasedSwitchEnabled()) {
@@ -658,13 +792,14 @@
// Only OOS/in service switch is enabled.
secondaryDataPhone = PhoneFactory.getPhone(phoneId);
}
- if (secondaryDataPhone != null) {
- // check auto switch feature enabled
- if (secondaryDataPhone.isDataAllowed()) {
- return phoneId;
- } else {
- debugMessage.append(", but its data is not allowed");
- }
+ }
+
+ if (secondaryDataPhone != null) {
+ // check auto switch feature enabled
+ if (secondaryDataPhone.isDataAllowed()) {
+ return phoneId;
+ } else {
+ debugMessage.append(", but its data is not allowed");
}
}
}
@@ -676,7 +811,7 @@
* @return {@code true} If the feature of switching base on RAT and signal strength is enabled.
*/
private boolean isRatSignalStrengthBasedSwitchEnabled() {
- return mScoreTolerance >= 0;
+ return mFlags.autoDataSwitchRatSs() && mScoreTolerance >= 0;
}
/**
diff --git a/src/java/com/android/internal/telephony/data/PhoneSwitcher.java b/src/java/com/android/internal/telephony/data/PhoneSwitcher.java
index 36e6587..2c84f5e 100644
--- a/src/java/com/android/internal/telephony/data/PhoneSwitcher.java
+++ b/src/java/com/android/internal/telephony/data/PhoneSwitcher.java
@@ -28,6 +28,7 @@
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_NONE;
+
import static java.util.Arrays.copyOf;
import android.annotation.NonNull;
@@ -83,6 +84,7 @@
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.data.DataNetworkController.NetworkRequestList;
import com.android.internal.telephony.data.DataSettingsManager.DataSettingsManagerCallback;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.DataSwitch;
@@ -184,6 +186,7 @@
private final @NonNull NetworkRequestList mNetworkRequestList = new NetworkRequestList();
protected final RegistrantList mActivePhoneRegistrants;
private final SubscriptionManagerService mSubscriptionManagerService;
+ private final @NonNull FeatureFlags mFlags;
protected final Context mContext;
private final LocalLog mLocalLog;
protected PhoneState[] mPhoneStates;
@@ -397,9 +400,10 @@
/**
* Method to create singleton instance.
*/
- public static PhoneSwitcher make(int maxDataAttachModemCount, Context context, Looper looper) {
+ public static PhoneSwitcher make(int maxDataAttachModemCount, Context context, Looper looper,
+ @NonNull FeatureFlags flags) {
if (sPhoneSwitcher == null) {
- sPhoneSwitcher = new PhoneSwitcher(maxDataAttachModemCount, context, looper);
+ sPhoneSwitcher = new PhoneSwitcher(maxDataAttachModemCount, context, looper, flags);
}
return sPhoneSwitcher;
@@ -457,9 +461,11 @@
}
@VisibleForTesting
- public PhoneSwitcher(int maxActivePhones, Context context, Looper looper) {
+ public PhoneSwitcher(int maxActivePhones, Context context, Looper looper,
+ @NonNull FeatureFlags featureFlags) {
super(looper);
mContext = context;
+ mFlags = featureFlags;
mActiveModemCount = getTm().getActiveModemCount();
mPhoneSubscriptions = new int[mActiveModemCount];
mPhoneStates = new PhoneState[mActiveModemCount];
@@ -497,6 +503,12 @@
@TelephonyManager.DataEnabledChangedReason int reason,
@NonNull String callingPackage) {
PhoneSwitcher.this.onDataEnabledChanged();
+ }
+ @Override
+ public void onDataRoamingEnabledChanged(boolean enabled) {
+ PhoneSwitcher.this.mAutoDataSwitchController.evaluateAutoDataSwitch(
+ AutoDataSwitchController
+ .EVALUATION_REASON_DATA_SETTINGS_CHANGED);
}});
phone.getDataSettingsManager().registerCallback(
mDataSettingsManagerCallbacks.get(phoneId));
@@ -546,7 +558,7 @@
}
};
mAutoDataSwitchController = new AutoDataSwitchController(context, looper, this,
- mAutoDataSwitchCallback);
+ mFlags, mAutoDataSwitchCallback);
mContext.registerReceiver(mDefaultDataChangedReceiver,
new IntentFilter(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED));
@@ -647,7 +659,6 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case EVENT_SUBSCRIPTION_CHANGED: {
- mAutoDataSwitchController.notifySubscriptionsChanged();
onEvaluate(REQUESTS_UNCHANGED, "subscription changed");
break;
}
@@ -902,6 +913,12 @@
@NonNull String callingPackage) {
PhoneSwitcher.this.onDataEnabledChanged();
}
+ @Override
+ public void onDataRoamingEnabledChanged(boolean enabled) {
+ PhoneSwitcher.this.mAutoDataSwitchController.evaluateAutoDataSwitch(
+ AutoDataSwitchController
+ .EVALUATION_REASON_DATA_SETTINGS_CHANGED);
+ }
});
phone.getDataSettingsManager().registerCallback(
mDataSettingsManagerCallbacks.get(phone.getPhoneId()));
@@ -1080,6 +1097,7 @@
registerForImsRadioTechChange(mContext, i);
}
diffDetected = true;
+ mAutoDataSwitchController.notifySubscriptionsMappingChanged();
}
}
diff --git a/src/java/com/android/internal/telephony/nitz/TEST_MAPPING b/src/java/com/android/internal/telephony/nitz/TEST_MAPPING
index 2bcb04e..4063803 100644
--- a/src/java/com/android/internal/telephony/nitz/TEST_MAPPING
+++ b/src/java/com/android/internal/telephony/nitz/TEST_MAPPING
@@ -1,6 +1,5 @@
{
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ "presubmit": [
{
"name": "FrameworksTelephonyTests",
"options": [
diff --git a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
index 62cb452..a8d05a3 100644
--- a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
+++ b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
@@ -2879,12 +2879,14 @@
* @return The subscription Id default to use.
*/
private int getDefaultAsUser(@UserIdInt int userId, int defaultValue) {
- List<SubscriptionInfoInternal> subInfos =
- getSubscriptionInfoStreamAsUser(UserHandle.of(userId))
- .filter(SubscriptionInfoInternal::isActive)
- .toList();
- if (subInfos.size() == 1) {
- return subInfos.get(0).getSubscriptionId();
+ if (mFeatureFlags.workProfileApiSplit()) {
+ List<SubscriptionInfoInternal> subInfos =
+ getSubscriptionInfoStreamAsUser(UserHandle.of(userId))
+ .filter(SubscriptionInfoInternal::isActive)
+ .toList();
+ if (subInfos.size() == 1) {
+ return subInfos.get(0).getSubscriptionId();
+ }
}
return defaultValue;
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java b/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java
index 2dac867..da3920e 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java
@@ -779,7 +779,7 @@
doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
doAnswer(invocation -> mNetworkId++).when(mNetwork).getNetId();
doReturn(mNetwork).when(mConnectivityManager).registerNetworkAgent(
- any(), any(), any(), any(), any(), any(), any(), anyInt());
+ any(), any(), any(), any(), any(), any(), anyInt());
doReturn(true).when(mEuiccManager).isEnabled();
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/AutoDataSwitchControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/AutoDataSwitchControllerTest.java
index 4b88f0a..6462d73 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/AutoDataSwitchControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/AutoDataSwitchControllerTest.java
@@ -152,12 +152,16 @@
doReturn(PHONE_1).when(mPhoneSwitcher).getPreferredDataPhoneId();
mAutoDataSwitchControllerUT = new AutoDataSwitchController(mContext, Looper.myLooper(),
- mPhoneSwitcher, mMockedPhoneSwitcherCallback);
+ mPhoneSwitcher, mFeatureFlags, mMockedPhoneSwitcherCallback);
+
+ doReturn(true).when(mFeatureFlags).autoSwitchAllowRoaming();
}
@After
public void tearDown() throws Exception {
mAutoDataSwitchControllerUT = null;
+ mGoodTelephonyDisplayInfo = null;
+ mBadTelephonyDisplayInfo = null;
super.tearDown();
}
@@ -222,6 +226,97 @@
}
@Test
+ public void testRoaming_prefer_home_over_roam() {
+ // DDS -> nDDS: Prefer Home over Roaming
+ prepareIdealUsesNonDdsCondition();
+ serviceStateChanged(PHONE_1, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
+ serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ processAllFutureMessages();
+
+ verify(mMockedPhoneSwitcherCallback).onRequireValidation(PHONE_2, true/*needValidation*/);
+
+ // nDDS -> DDS: Prefer Home over Roaming
+ doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId();
+ serviceStateChanged(PHONE_1, NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
+ processAllFutureMessages();
+
+ verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX,
+ true/*needValidation*/);
+ }
+
+ @Test
+ public void testRoaming_roaming_but_roam_disabled() {
+ // Disable RAT + signalStrength base switching.
+ doReturn(-1).when(mDataConfigManager).getAutoDataSwitchScoreTolerance();
+ mAutoDataSwitchControllerUT = new AutoDataSwitchController(mContext, Looper.myLooper(),
+ mPhoneSwitcher, mFeatureFlags, mMockedPhoneSwitcherCallback);
+
+ // On primary phone
+ // 1.1 Both roaming, user allow roaming on both phone, no need to switch.
+ prepareIdealUsesNonDdsCondition();
+ serviceStateChanged(PHONE_1, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
+ serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
+ processAllFutureMessages();
+ clearInvocations(mMockedPhoneSwitcherCallback);
+
+ mAutoDataSwitchControllerUT.evaluateAutoDataSwitch(EVALUATION_REASON_DATA_SETTINGS_CHANGED);
+ processAllFutureMessages();
+ verify(mMockedPhoneSwitcherCallback, never()).onRequireValidation(anyInt(),
+ anyBoolean()/*needValidation*/);
+
+ // 1.2 Both roaming, but roaming is only allowed on the backup phone.
+ doReturn(false).when(mPhone).getDataRoamingEnabled();
+ mAutoDataSwitchControllerUT.evaluateAutoDataSwitch(EVALUATION_REASON_DATA_SETTINGS_CHANGED);
+ processAllFutureMessages();
+
+ verify(mMockedPhoneSwitcherCallback).onRequireValidation(PHONE_2, true/*needValidation*/);
+
+ // On backup phone
+ doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId();
+ // 2.1 Both roaming, user allow roaming on both phone, prefer default.
+ doReturn(true).when(mPhone).getDataRoamingEnabled();
+ mAutoDataSwitchControllerUT.evaluateAutoDataSwitch(EVALUATION_REASON_DATA_SETTINGS_CHANGED);
+ processAllFutureMessages();
+
+ verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX,
+ true/*needValidation*/);
+
+ // 2.1 Both roaming, but roaming is only allowed on the default phone.
+ doReturn(false).when(mPhone2).getDataRoamingEnabled();
+ mAutoDataSwitchControllerUT.evaluateAutoDataSwitch(EVALUATION_REASON_DATA_SETTINGS_CHANGED);
+ processAllFutureMessages();
+
+ verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX,
+ false/*needValidation*/);
+ }
+
+ @Test
+ public void testRoaming_same_roaming_condition_uses_rat_signalStrength() {
+ doReturn(true).when(mFeatureFlags).autoDataSwitchRatSs();
+ // On primary phone
+ // 1. Both roaming, user allow roaming on both phone, uses RAT score to decide switch.
+ prepareIdealUsesNonDdsCondition();
+ serviceStateChanged(PHONE_1, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
+ serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
+ processAllFutureMessages();
+
+ verify(mMockedPhoneSwitcherCallback).onRequireValidation(PHONE_2, true/*needValidation*/);
+
+ // On backup phone
+ doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId();
+ // 2. Both roaming, user allow roaming on both phone, uses RAT score to decide switch.
+ signalStrengthChanged(PHONE_1, SignalStrength.SIGNAL_STRENGTH_GREAT);
+ signalStrengthChanged(PHONE_2, SignalStrength.SIGNAL_STRENGTH_POOR);
+ displayInfoChanged(PHONE_1, mGoodTelephonyDisplayInfo);
+ displayInfoChanged(PHONE_2, mBadTelephonyDisplayInfo);
+ processAllFutureMessages();
+
+ verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX,
+ true/*needValidation*/);
+ }
+
+ @Test
public void testCancelSwitch_onPrimary_rat_signalStrength() {
// 4.1.1 Display info and signal strength on secondary phone became bad,
// but primary is still OOS, so still switch to the secondary.
@@ -269,13 +364,13 @@
// Disable Rat/SignalStrength based switch to test primary OOS based switch
doReturn(-1).when(mDataConfigManager).getAutoDataSwitchScoreTolerance();
mAutoDataSwitchControllerUT = new AutoDataSwitchController(mContext, Looper.myLooper(),
- mPhoneSwitcher, mMockedPhoneSwitcherCallback);
+ mPhoneSwitcher, mFeatureFlags, mMockedPhoneSwitcherCallback);
doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId();
prepareIdealUsesNonDdsCondition();
// 1.1 service state changes - primary becomes available again, require validation
serviceStateChanged(PHONE_1,
- NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING/*need validate*/);
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME/*need validate*/);
processAllFutureMessages();
verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX,
true/*needValidation*/);
@@ -285,7 +380,7 @@
// 1.2 service state changes - secondary becomes unavailable, NO need validation
serviceStateChanged(PHONE_1,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME/*need validate*/);
- serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING/*no need*/);
+ serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_DENIED/*no need*/);
processAllFutureMessages();
// The later validation requirement overrides the previous
verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX,
@@ -325,6 +420,7 @@
@Test
public void testOnNonDdsSwitchBackToPrimary_rat_signalStrength() {
+ doReturn(true).when(mFeatureFlags).autoDataSwitchRatSs();
doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId();
prepareIdealUsesNonDdsCondition();
@@ -354,8 +450,8 @@
doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId();
prepareIdealUsesNonDdsCondition();
- // attempts the switch back due to secondary becomes ROAMING
- serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
+ // attempts the switch back due to secondary not usable
+ serviceStateChanged(PHONE_2, NetworkRegistrationInfo.REGISTRATION_STATE_DENIED);
processAllFutureMessages();
verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX,
@@ -413,7 +509,7 @@
doReturn(-1 /*Disable signal based switch for easy mock*/).when(mDataConfigManager)
.getAutoDataSwitchScoreTolerance();
mAutoDataSwitchControllerUT = new AutoDataSwitchController(mContext, Looper.myLooper(),
- mPhoneSwitcher, mMockedPhoneSwitcherCallback);
+ mPhoneSwitcher, mFeatureFlags, mMockedPhoneSwitcherCallback);
//1. DDS -> nDDS, verify callback doesn't require validation
prepareIdealUsesNonDdsCondition();
@@ -423,7 +519,7 @@
//2. nDDS -> DDS, verify callback doesn't require validation
doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId();
- serviceStateChanged(PHONE_1, NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
+ serviceStateChanged(PHONE_1, NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
processAllFutureMessages();
verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX,
false/*needValidation*/);
@@ -478,7 +574,7 @@
int modemCount = 2;
doReturn(new int[]{SUB_2}).when(mSubscriptionManagerService)
.getActiveSubIdList(true);
- mAutoDataSwitchControllerUT.notifySubscriptionsChanged();
+ mAutoDataSwitchControllerUT.notifySubscriptionsMappingChanged();
processAllMessages();
// Verify unregister from both slots since only 1 visible SIM is insufficient for switching
@@ -492,7 +588,7 @@
clearInvocations(mDisplayInfoController, mSignalStrengthController, mSST);
doReturn(new int[]{SUB_1, SUB_2}).when(mSubscriptionManagerService)
.getActiveSubIdList(true);
- mAutoDataSwitchControllerUT.notifySubscriptionsChanged();
+ mAutoDataSwitchControllerUT.notifySubscriptionsMappingChanged();
processAllMessages();
// Verify register on both slots
@@ -544,8 +640,10 @@
// 4.1 User data enabled on primary SIM
doReturn(true).when(mPhone).isUserDataEnabled();
+ doReturn(true).when(mPhone).getDataRoamingEnabled();
// 4.2 Auto switch feature is enabled
+ doReturn(true).when(mPhone2).getDataRoamingEnabled();
doReturn(true).when(mPhone2).isDataAllowed();
// 5. No default network
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
index ffaf8fc..5dd83bf 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
@@ -445,7 +445,7 @@
verify(mConnectivityManager).registerNetworkAgent(any(), any(NetworkInfo.class),
linkPropertiesCaptor.capture(), networkCapabilitiesCaptor.capture(), any(), any(),
- any(), anyInt());
+ anyInt());
// The very first link properties from telephony is an empty link properties. It will be
// updated later.
assertThat(linkPropertiesCaptor.getValue()).isEqualTo(new LinkProperties());
@@ -552,7 +552,7 @@
verify(mConnectivityManager).registerNetworkAgent(any(), any(NetworkInfo.class),
any(LinkProperties.class), networkCapabilitiesCaptor.capture(), any(), any(),
- any(), anyInt());
+ anyInt());
// Make sure the initial network capability has NOT_SUSPENDED
assertThat(networkCapabilitiesCaptor.getValue().hasCapability(
@@ -616,7 +616,7 @@
// Agent re-created, so register should be called twice.
verify(mConnectivityManager, times(2)).registerNetworkAgent(any(), any(NetworkInfo.class),
any(LinkProperties.class), networkCapabilitiesCaptor.capture(), any(), any(),
- any(), anyInt());
+ anyInt());
// Make sure the 2nd network agent was created with NOT_SUSPENDED.
assertThat(networkCapabilitiesCaptor.getValue().hasCapability(
@@ -663,7 +663,7 @@
verify(mConnectivityManager).registerNetworkAgent(any(), any(NetworkInfo.class),
linkPropertiesCaptor.capture(), networkCapabilitiesCaptor.capture(), any(), any(),
- any(), anyInt());
+ anyInt());
// The very first link properties from telephony is an empty link properties. It will be
// updated later.
assertThat(linkPropertiesCaptor.getValue()).isEqualTo(new LinkProperties());
@@ -1424,8 +1424,8 @@
.forClass(NetworkAgentConfig.class);
verify(mConnectivityManager).registerNetworkAgent(any(), any(NetworkInfo.class),
- any(LinkProperties.class), any(NetworkCapabilities.class), any(), any(),
- captor.capture(), anyInt());
+ any(LinkProperties.class), any(NetworkCapabilities.class), any(), captor.capture(),
+ anyInt());
NetworkAgentConfig networkAgentConfig = captor.getValue();
@@ -1508,7 +1508,7 @@
// Agent re-created, so register should be called twice.
verify(mConnectivityManager, times(2)).registerNetworkAgent(any(), any(NetworkInfo.class),
any(LinkProperties.class), any(NetworkCapabilities.class), any(), any(),
- any(), anyInt());
+ anyInt());
assertThat(mDataNetworkUT.getNetworkCapabilities().hasCapability(
NetworkCapabilities.NET_CAPABILITY_ENTERPRISE)).isTrue();
@@ -1530,7 +1530,7 @@
// Agent not re-created, so register should be called once.
verify(mConnectivityManager, times(1)).registerNetworkAgent(any(), any(NetworkInfo.class),
any(LinkProperties.class), any(NetworkCapabilities.class), any(), any(),
- any(), anyInt());
+ anyInt());
assertThat(mDataNetworkUT.getNetworkCapabilities().hasCapability(
NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED)).isTrue();
@@ -1730,7 +1730,7 @@
// Agent re-created, so register should be called twice.
verify(mConnectivityManager, times(2)).registerNetworkAgent(any(), any(NetworkInfo.class),
linkPropertiesCaptor.capture(), any(NetworkCapabilities.class), any(), any(),
- any(), anyInt());
+ anyInt());
// The new agent should have the new IP address.
assertThat(linkPropertiesCaptor.getValue().getAllAddresses()).containsExactly(
InetAddresses.parseNumericAddress(IPV4_ADDRESS1),
@@ -1779,7 +1779,7 @@
// Agent re-created, so register should be called twice.
verify(mConnectivityManager, times(2)).registerNetworkAgent(any(), any(NetworkInfo.class),
linkPropertiesCaptor.capture(), any(NetworkCapabilities.class), any(), any(),
- any(), anyInt());
+ anyInt());
// The new agent should have the new IP address.
assertThat(linkPropertiesCaptor.getValue().getAllAddresses()).containsExactly(
InetAddresses.parseNumericAddress(IPV6_ADDRESS1));
@@ -1870,7 +1870,7 @@
// Agent should not be re-created, so register should be called ony once.
verify(mConnectivityManager, times(1)).registerNetworkAgent(any(), any(NetworkInfo.class),
any(LinkProperties.class), any(NetworkCapabilities.class), any(), any(),
- any(), anyInt());
+ anyInt());
// The network should have IPv6 address now
assertThat(mDataNetworkUT.getLinkProperties().getAllAddresses()).containsExactly(
@@ -1914,7 +1914,7 @@
// Agent should not be re-created, so register should be called ony once.
verify(mConnectivityManager, times(1)).registerNetworkAgent(any(), any(NetworkInfo.class),
any(LinkProperties.class), any(NetworkCapabilities.class), any(), any(),
- any(), anyInt());
+ anyInt());
// The network should have IPv6 address now
assertThat(mDataNetworkUT.getLinkProperties().getAllAddresses()).containsExactly(
@@ -1959,7 +1959,7 @@
// Agent should not be re-created, so register should be called ony once.
verify(mConnectivityManager, times(1)).registerNetworkAgent(any(), any(NetworkInfo.class),
any(LinkProperties.class), any(NetworkCapabilities.class), any(), any(),
- any(), anyInt());
+ anyInt());
// The network should have IPv6 address now
assertThat(mDataNetworkUT.getLinkProperties().getAllAddresses()).containsExactly(
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/PhoneSwitcherTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/PhoneSwitcherTest.java
index 94fd934..13ab611 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/PhoneSwitcherTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/PhoneSwitcherTest.java
@@ -26,8 +26,10 @@
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_LTE;
+
import static com.android.internal.telephony.data.AutoDataSwitchController.EVALUATION_REASON_VOICE_CALL_END;
import static com.android.internal.telephony.data.PhoneSwitcher.ECBM_DEFAULT_DATA_SWITCH_BASE_TIME_MS;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -267,12 +269,14 @@
assertFalse("data allowed", mDataAllowed[0]);
setSlotIndexToSubId(1, 1);
+ clearInvocations(mAutoDataSwitchController);
mSubChangedListener.onSubscriptionsChanged();
processAllMessages();
Message.obtain(mPhoneSwitcherUT, EVENT_MODEM_COMMAND_DONE, res).sendToTarget();
processAllMessages();
verify(mActivePhoneSwitchHandler, times(1)).sendMessageAtTime(any(), anyLong());
+ verify(mAutoDataSwitchController).notifySubscriptionsMappingChanged();
clearInvocations(mActivePhoneSwitchHandler);
assertFalse("data allowed", mDataAllowed[0]);
assertTrue("data not allowed", mDataAllowed[1]);
@@ -289,8 +293,10 @@
// 3 lose default via sub->phone change
setSlotIndexToSubId(0, 2);
+ clearInvocations(mAutoDataSwitchController);
mSubChangedListener.onSubscriptionsChanged();
processAllMessages();
+ verify(mAutoDataSwitchController).notifySubscriptionsMappingChanged();
Message.obtain(mPhoneSwitcherUT, EVENT_MODEM_COMMAND_DONE, res).sendToTarget();
processAllMessages();
@@ -1097,7 +1103,6 @@
}
@Test
- @SmallTest
public void testDataEnabledChangedDuringVoiceCall() throws Exception {
doReturn(true).when(mMockRadioConfig).isSetPreferredDataCommandSupported();
initialize();
@@ -1135,6 +1140,18 @@
}
@Test
+ public void testRoamingToggle() throws Exception {
+ initialize();
+ setSlotIndexToSubId(0, 1);
+
+ mDataSettingsManagerCallbacks.get(0).onDataRoamingEnabledChanged(true);
+ processAllMessages();
+
+ verify(mAutoDataSwitchController).evaluateAutoDataSwitch(AutoDataSwitchController
+ .EVALUATION_REASON_DATA_SETTINGS_CHANGED);
+ }
+
+ @Test
@SmallTest
public void testNetworkRequestOnNonDefaultData() throws Exception {
doReturn(true).when(mMockRadioConfig).isSetPreferredDataCommandSupported();
@@ -1858,7 +1875,8 @@
initializeConnManagerMock();
initializeConfigMock();
- mPhoneSwitcherUT = new PhoneSwitcher(mMaxDataAttachModemCount, mContext, Looper.myLooper());
+ mPhoneSwitcherUT = new PhoneSwitcher(mMaxDataAttachModemCount, mContext, Looper.myLooper(),
+ mFeatureFlags);
Field field = PhoneSwitcher.class.getDeclaredField("mDataSettingsManagerCallbacks");
field.setAccessible(true);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/nitz/TEST_MAPPING b/tests/telephonytests/src/com/android/internal/telephony/nitz/TEST_MAPPING
index 2bcb04e..4063803 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/nitz/TEST_MAPPING
+++ b/tests/telephonytests/src/com/android/internal/telephony/nitz/TEST_MAPPING
@@ -1,6 +1,5 @@
{
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ "presubmit": [
{
"name": "FrameworksTelephonyTests",
"options": [