Loading flags/data.aconfig +11 −0 Original line number Diff line number Diff line package: "com.android.internal.telephony.flags" container: "system" # OWNER=linggm TARGET=25Q2 flag { name: "keep_ping_request" namespace: "telephony" description: "If ping test is not required to pass, keep the ping request to avoid deactivate followed by reactivate" bug: "366318732" metadata { purpose: PURPOSE_BUGFIX } } # OWNER=linggm TARGET=24Q4 flag { name: "keep_empty_requests_network" Loading src/java/com/android/internal/telephony/PhoneFactory.java +1 −1 Original line number Diff line number Diff line Loading @@ -268,7 +268,7 @@ public class PhoneFactory { SimultaneousCallingTracker.init(sContext, featureFlags); } sCellularNetworkValidator = CellularNetworkValidator.make(sContext); sCellularNetworkValidator = CellularNetworkValidator.make(sContext, sFeatureFlags); int maxActivePhones = sPhoneConfigurationManager .getNumberOfModemsWithSimultaneousDataConnections(); Loading src/java/com/android/internal/telephony/data/CellularNetworkValidator.java +15 −8 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConfigurationManager; import com.android.internal.telephony.PhoneFactory; 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.subscription.SubscriptionInfoInternal; Loading Loading @@ -77,7 +78,7 @@ public class CellularNetworkValidator { private int mState = STATE_IDLE; private int mSubId; private boolean mReleaseAfterValidation; private boolean mRequireTestPass; private ValidationCallback mValidationCallback; private final Context mContext; Loading @@ -88,6 +89,8 @@ public class CellularNetworkValidator { public ConnectivityNetworkCallback mNetworkCallback; private final ValidatedNetworkCache mValidatedNetworkCache = new ValidatedNetworkCache(); @NonNull private final FeatureFlags mFlags; private class ValidatedNetworkCache { // A cache with fixed size. It remembers 10 most recently successfully validated networks. private static final int VALIDATED_NETWORK_CACHE_SIZE = 10; Loading Loading @@ -206,11 +209,12 @@ public class CellularNetworkValidator { /** * Create instance. */ public static CellularNetworkValidator make(Context context) { public static CellularNetworkValidator make(Context context, @NonNull FeatureFlags featureFlags) { if (sInstance != null) { logd("createCellularNetworkValidator failed. Instance already exists."); } else { sInstance = new CellularNetworkValidator(context); sInstance = new CellularNetworkValidator(context, featureFlags); } return sInstance; Loading @@ -232,8 +236,9 @@ public class CellularNetworkValidator { } @VisibleForTesting public CellularNetworkValidator(Context context) { public CellularNetworkValidator(Context context, @NonNull FeatureFlags featureFlags) { mContext = context; mFlags = featureFlags; mConnectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); } Loading @@ -242,7 +247,7 @@ public class CellularNetworkValidator { * API to start a validation */ public synchronized void validate(int subId, long timeoutInMs, boolean releaseAfterValidation, ValidationCallback callback) { boolean requireTestPass, ValidationCallback callback) { // If it's already validating the same subscription, do nothing. if (subId == mSubId) return; Loading @@ -261,10 +266,10 @@ public class CellularNetworkValidator { mState = STATE_VALIDATING; mSubId = subId; mValidationCallback = callback; mReleaseAfterValidation = releaseAfterValidation; mRequireTestPass = requireTestPass; logd("Start validating subId " + mSubId + " timeoutInMs " + timeoutInMs + " mReleaseAfterValidation " + mReleaseAfterValidation); + " mRequireTestPass " + mRequireTestPass); mNetworkCallback = new ConnectivityNetworkCallback(subId); Loading Loading @@ -329,8 +334,10 @@ public class CellularNetworkValidator { if (mState == STATE_VALIDATING) { mValidationCallback.onValidationDone(passed, mSubId); mState = STATE_VALIDATED; boolean keepRequest = mFlags.keepPingRequest() ? (passed || !mRequireTestPass) : (!mRequireTestPass && passed); // If validation passed and per request to NOT release after validation, delay cleanup. if (!mReleaseAfterValidation && passed) { if (keepRequest) { mHandler.postDelayed(this::stopValidation, 500); } else { stopValidation(); Loading src/java/com/android/internal/telephony/data/PhoneSwitcher.java +2 −1 Original line number Diff line number Diff line Loading @@ -1617,7 +1617,8 @@ public class PhoneSwitcher extends Handler { mPendingSwitchNeedValidation = needValidation; mSetOpptSubCallback = callback; long validationTimeout = getValidationTimeout(subIdToValidate, needValidation); mValidator.validate(subIdToValidate, validationTimeout, false, mValidationCallback); mValidator.validate(subIdToValidate, validationTimeout, mFlags.keepPingRequest() && mPendingSwitchNeedValidation, mValidationCallback); } private long getValidationTimeout(int subId, boolean needValidation) { Loading tests/telephonytests/src/com/android/internal/telephony/data/CellularNetworkValidatorTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -77,7 +77,7 @@ public class CellularNetworkValidatorTest extends TelephonyTest { doReturn(CAPABILITY_WITH_VALIDATION_SUPPORTED).when(mPhoneConfigurationManager) .getCurrentPhoneCapability(); mValidatorUT = new CellularNetworkValidator(mContext); mValidatorUT = new CellularNetworkValidator(mContext, mFeatureFlags); doReturn(new SubscriptionInfoInternal.Builder().setSimSlotIndex(0).setId(1).build()) .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt()); processAllMessages(); Loading Loading
flags/data.aconfig +11 −0 Original line number Diff line number Diff line package: "com.android.internal.telephony.flags" container: "system" # OWNER=linggm TARGET=25Q2 flag { name: "keep_ping_request" namespace: "telephony" description: "If ping test is not required to pass, keep the ping request to avoid deactivate followed by reactivate" bug: "366318732" metadata { purpose: PURPOSE_BUGFIX } } # OWNER=linggm TARGET=24Q4 flag { name: "keep_empty_requests_network" Loading
src/java/com/android/internal/telephony/PhoneFactory.java +1 −1 Original line number Diff line number Diff line Loading @@ -268,7 +268,7 @@ public class PhoneFactory { SimultaneousCallingTracker.init(sContext, featureFlags); } sCellularNetworkValidator = CellularNetworkValidator.make(sContext); sCellularNetworkValidator = CellularNetworkValidator.make(sContext, sFeatureFlags); int maxActivePhones = sPhoneConfigurationManager .getNumberOfModemsWithSimultaneousDataConnections(); Loading
src/java/com/android/internal/telephony/data/CellularNetworkValidator.java +15 −8 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConfigurationManager; import com.android.internal.telephony.PhoneFactory; 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.subscription.SubscriptionInfoInternal; Loading Loading @@ -77,7 +78,7 @@ public class CellularNetworkValidator { private int mState = STATE_IDLE; private int mSubId; private boolean mReleaseAfterValidation; private boolean mRequireTestPass; private ValidationCallback mValidationCallback; private final Context mContext; Loading @@ -88,6 +89,8 @@ public class CellularNetworkValidator { public ConnectivityNetworkCallback mNetworkCallback; private final ValidatedNetworkCache mValidatedNetworkCache = new ValidatedNetworkCache(); @NonNull private final FeatureFlags mFlags; private class ValidatedNetworkCache { // A cache with fixed size. It remembers 10 most recently successfully validated networks. private static final int VALIDATED_NETWORK_CACHE_SIZE = 10; Loading Loading @@ -206,11 +209,12 @@ public class CellularNetworkValidator { /** * Create instance. */ public static CellularNetworkValidator make(Context context) { public static CellularNetworkValidator make(Context context, @NonNull FeatureFlags featureFlags) { if (sInstance != null) { logd("createCellularNetworkValidator failed. Instance already exists."); } else { sInstance = new CellularNetworkValidator(context); sInstance = new CellularNetworkValidator(context, featureFlags); } return sInstance; Loading @@ -232,8 +236,9 @@ public class CellularNetworkValidator { } @VisibleForTesting public CellularNetworkValidator(Context context) { public CellularNetworkValidator(Context context, @NonNull FeatureFlags featureFlags) { mContext = context; mFlags = featureFlags; mConnectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); } Loading @@ -242,7 +247,7 @@ public class CellularNetworkValidator { * API to start a validation */ public synchronized void validate(int subId, long timeoutInMs, boolean releaseAfterValidation, ValidationCallback callback) { boolean requireTestPass, ValidationCallback callback) { // If it's already validating the same subscription, do nothing. if (subId == mSubId) return; Loading @@ -261,10 +266,10 @@ public class CellularNetworkValidator { mState = STATE_VALIDATING; mSubId = subId; mValidationCallback = callback; mReleaseAfterValidation = releaseAfterValidation; mRequireTestPass = requireTestPass; logd("Start validating subId " + mSubId + " timeoutInMs " + timeoutInMs + " mReleaseAfterValidation " + mReleaseAfterValidation); + " mRequireTestPass " + mRequireTestPass); mNetworkCallback = new ConnectivityNetworkCallback(subId); Loading Loading @@ -329,8 +334,10 @@ public class CellularNetworkValidator { if (mState == STATE_VALIDATING) { mValidationCallback.onValidationDone(passed, mSubId); mState = STATE_VALIDATED; boolean keepRequest = mFlags.keepPingRequest() ? (passed || !mRequireTestPass) : (!mRequireTestPass && passed); // If validation passed and per request to NOT release after validation, delay cleanup. if (!mReleaseAfterValidation && passed) { if (keepRequest) { mHandler.postDelayed(this::stopValidation, 500); } else { stopValidation(); Loading
src/java/com/android/internal/telephony/data/PhoneSwitcher.java +2 −1 Original line number Diff line number Diff line Loading @@ -1617,7 +1617,8 @@ public class PhoneSwitcher extends Handler { mPendingSwitchNeedValidation = needValidation; mSetOpptSubCallback = callback; long validationTimeout = getValidationTimeout(subIdToValidate, needValidation); mValidator.validate(subIdToValidate, validationTimeout, false, mValidationCallback); mValidator.validate(subIdToValidate, validationTimeout, mFlags.keepPingRequest() && mPendingSwitchNeedValidation, mValidationCallback); } private long getValidationTimeout(int subId, boolean needValidation) { Loading
tests/telephonytests/src/com/android/internal/telephony/data/CellularNetworkValidatorTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -77,7 +77,7 @@ public class CellularNetworkValidatorTest extends TelephonyTest { doReturn(CAPABILITY_WITH_VALIDATION_SUPPORTED).when(mPhoneConfigurationManager) .getCurrentPhoneCapability(); mValidatorUT = new CellularNetworkValidator(mContext); mValidatorUT = new CellularNetworkValidator(mContext, mFeatureFlags); doReturn(new SubscriptionInfoInternal.Builder().setSimSlotIndex(0).setId(1).build()) .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt()); processAllMessages(); Loading