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

Commit ae05591f authored by Willy Hu's avatar Willy Hu Committed by Android (Google) Code Review
Browse files

Merge "[DSRM] skip the recovery action when network scan started" into main

parents 4a8f05f1 0309e4b2
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -79,13 +79,16 @@ public final class NetworkScanRequestTracker {
        @Override
        public void handleMessage(Message msg) {
            Log.d(TAG, "Received Event :" + msg.what);
            AsyncResult ar;
            switch (msg.what) {
                case CMD_START_NETWORK_SCAN:
                    mScheduler.doStartScan((NetworkScanRequestInfo) msg.obj);
                    break;

                case EVENT_START_NETWORK_SCAN_DONE:
                    mScheduler.startScanDone((AsyncResult) msg.obj);
                    ar = (AsyncResult) msg.obj;
                    mScheduler.startScanDone(ar);
                    ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(true);
                    break;

                case EVENT_RECEIVE_NETWORK_SCAN_RESULT:
@@ -97,7 +100,9 @@ public final class NetworkScanRequestTracker {
                    break;

                case EVENT_STOP_NETWORK_SCAN_DONE:
                    mScheduler.stopScanDone((AsyncResult) msg.obj);
                    ar = (AsyncResult) msg.obj;
                    mScheduler.stopScanDone(ar);
                    ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(false);
                    break;

                case CMD_INTERRUPT_NETWORK_SCAN:
@@ -105,17 +110,20 @@ public final class NetworkScanRequestTracker {
                    break;

                case EVENT_INTERRUPT_NETWORK_SCAN_DONE:
                    mScheduler.interruptScanDone((AsyncResult) msg.obj);
                    ar = (AsyncResult) msg.obj;
                    mScheduler.interruptScanDone(ar);
                    ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(false);
                    break;

                case EVENT_RADIO_UNAVAILABLE:
                    // Fallthrough
                case EVENT_MODEM_RESET:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    ar = (AsyncResult) msg.obj;
                    mScheduler.deleteScanAndMayNotify(
                            (NetworkScanRequestInfo) ar.userObj,
                            NetworkScan.ERROR_MODEM_ERROR,
                            true);
                    ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(false);
                    break;
            }
        }
+19 −0
Original line number Diff line number Diff line
@@ -391,6 +391,7 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
    private int mPreferredUsageSetting = SubscriptionManager.USAGE_SETTING_UNKNOWN;
    private int mUsageSettingFromModem = SubscriptionManager.USAGE_SETTING_UNKNOWN;
    private boolean mIsUsageSettingSupported = true;
    private boolean mIsNetworkScanStarted = false;

    //IMS
    /**
@@ -4157,6 +4158,24 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
        return false;
    }

    /**
     * Sets the network scan started status.
     *
     * @param started {@code true} if the network scan has started, {@code false} otherwise.
     */
    public void setNetworkScanStarted(boolean started) {
        mIsNetworkScanStarted = started;
    }

    /**
     * Gets the network scan started status.
     *
     * @return {@code true} if the network scan has started, {@code false} otherwise.
     */
    public boolean getNetworkScanStarted() {
        return mIsNetworkScanStarted;
    }

    /**
     * Override the roaming indicator for the current ICCID.
     */
+40 −2
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.util.LocalLog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback;
import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback;
import com.android.internal.telephony.data.DataSettingsManager.DataSettingsManagerCallback;
@@ -800,12 +801,17 @@ public class DataStallRecoveryManager extends Handler {
        }

        // Skip recovery if it can cause a call to drop
        if (mPhone.getState() != PhoneConstants.State.IDLE
                && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) {
        if (!isPhoneStateIdle() && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) {
            logl("skip data stall recovery as there is an active call");
            return false;
        }

        // Skip when network scan started
        if (isAnyPhoneNetworkScanStarted()) {
            logl("skip data stall recovery as network scan started");
            return false;
        }

        // Skip when poor signal strength
        if (mPhone.getSignalStrength().getLevel() <= CellSignalStrength.SIGNAL_STRENGTH_POOR) {
            logl("skip data stall recovery as in poor signal condition");
@@ -824,6 +830,38 @@ public class DataStallRecoveryManager extends Handler {
        return true;
    }

    /**
     * Checks if any network scan is currently started on any of the available phones.
     *
     * @return {@code true} if any network scan is started on any phone; {@code false} otherwise.
     */
    private boolean isAnyPhoneNetworkScanStarted() {
        for (Phone phone : PhoneFactory.getPhones()) {
            logl("NetworkScanStarted: " + phone.getNetworkScanStarted()
                    + " on phone" + phone.getPhoneId());
            if (phone.getNetworkScanStarted()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Check whether the phone state is {@link PhoneConstants.State#IDLE} for all phones.
     * If any phone is not IDLE (voice call active on any phone), do not trigger recovery.
     *
     * @return {@code true} if all phones are IDLE and {@code false} if any phones are not IDLE.
     */
    private boolean isPhoneStateIdle() {
        for (Phone phone : PhoneFactory.getPhones()) {
            logl("Phone State: " + phone.getState() + " on phone" + phone.getPhoneId());
            if (phone.getState() != PhoneConstants.State.IDLE) {
                return false;
            }
        }
        return true;
    }

    /**
     * Set the validation status into metrics.
     *
+21 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

@@ -581,4 +582,24 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {
        // recovery action will jump to modem reset action if user doing the radio restart.
        assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(4);
    }

    @Test
    public void testDoNotDoRecoveryActionWhenActiveCall() throws Exception {
        sendOnInternetDataNetworkCallback(true);
        mDataStallRecoveryManager.setRecoveryAction(
                DataStallRecoveryManager.RECOVERY_ACTION_RADIO_RESTART);
        doReturn(mSignalStrength).when(mPhone).getSignalStrength();
        // Simulate active call
        doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState();

        logd("Sending validation failed callback");
        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);
        processAllFutureMessages();

        verify(mSST, never()).powerOffRadioSafely();
        verify(mPhone, never()).rebootModem(any());

        assertThat(mDataStallRecoveryManager.getRecoveryAction())
                .isEqualTo(DataStallRecoveryManager.RECOVERY_ACTION_RADIO_RESTART);
    }
}