Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d09450c7 authored by Ling Ma's avatar Ling Ma
Browse files

Keep ping request

Currently, if ping test fails, network validator revokes the ping
request from the target phone. However, this revoke is unnecessary if
ping is not required to pass - in which case the revoke causes
unnecessary disconnect and reconnect of internet.

Therefore, this change keeps the ping request if ping test is not
required.

Fix: 366318732
Test: manual voice call + data browsing
Flag: com.android.internal.telephony.flags.keep_ping_request

Change-Id: Ie412316ef1711978ff5d46ef76f820f7576ddb28
parent 6a489a8e
Loading
Loading
Loading
Loading
+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"
+1 −1
Original line number Diff line number Diff line
@@ -268,7 +268,7 @@ public class PhoneFactory {
                            SimultaneousCallingTracker.init(sContext, featureFlags);
                }

                sCellularNetworkValidator = CellularNetworkValidator.make(sContext);
                sCellularNetworkValidator = CellularNetworkValidator.make(sContext, sFeatureFlags);

                int maxActivePhones = sPhoneConfigurationManager
                        .getNumberOfModemsWithSimultaneousDataConnections();
+15 −8
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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);
    }
@@ -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;

@@ -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);

@@ -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();
+2 −1
Original line number Diff line number Diff line
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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();