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

Commit 04485d81 authored by Jack Yu's avatar Jack Yu
Browse files

Properly handled service temp unavailable case

The fail cause service temporarily unavailable should
not trigger handover complete event. Frameworks should
keep retrying handover.

Fix: 190231898
Test: atest DcTrackerTest
Change-Id: I286d364adb8a0575c1fecff64c31441d60cdfce0
parent 14c12e69
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -3080,7 +3080,8 @@ public class DcTracker extends Handler {
            Log.wtf(mLogTag, "bad failure mode: "
                    + DataCallResponse.failureModeToString(handoverFailureMode));
        } else if (handoverFailureMode
                != DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_HANDOVER) {
                != DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_HANDOVER
                && cause != DataFailCause.SERVICE_TEMPORARILY_UNAVAILABLE) {
            sendHandoverCompleteMessages(apnContext.getApnTypeBitmask(), success,
                    fallbackOnFailedHandover);
        }
+34 −0
Original line number Diff line number Diff line
@@ -68,7 +68,9 @@ import android.provider.Settings;
import android.provider.Telephony;
import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.Annotation;
import android.telephony.CarrierConfigManager;
import android.telephony.DataFailCause;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PreciseDataConnectionState;
import android.telephony.ServiceState;
@@ -79,6 +81,7 @@ import android.telephony.SubscriptionPlan;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
import android.telephony.data.DataProfile;
import android.telephony.data.DataService;
import android.telephony.data.TrafficDescriptor;
@@ -814,6 +817,18 @@ public class DcTrackerTest extends TelephonyTest {
        }
    }

    private void addHandoverCompleteMsg(Message onCompleteMsg,
            @Annotation.ApnType int apnType) {
        try {
            Method method = DcTracker.class.getDeclaredMethod("addHandoverCompleteMsg",
                    Message.class, int.class);
            method.setAccessible(true);
            method.invoke(mDct, onCompleteMsg, apnType);
        } catch (Exception e) {
            fail(e.toString());
        }
    }

    private void sendInitializationEvents() {
        sendCarrierConfigChanged("");

@@ -2936,4 +2951,23 @@ public class DcTrackerTest extends TelephonyTest {
            assertEquals(TelephonyManager.DATA_DISCONNECTED, state.getState());
        }
    }

    /**
     * There is a corresponding test {@link DataConnectionTest#testDataServiceTempUnavailable()} to
     * test DataConnection behavior.
     */
    @Test
    public void testDataServiceTempUnavailable() {
        Handler handler = Mockito.mock(Handler.class);
        Message handoverCompleteMessage = Message.obtain(handler);
        addHandoverCompleteMsg(handoverCompleteMessage, ApnSetting.TYPE_IMS);
        initApns(ApnSetting.TYPE_IMS_STRING, new String[]{ApnSetting.TYPE_IMS_STRING});
        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_SETUP_COMPLETE,
                DcTracker.REQUEST_TYPE_HANDOVER, DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN,
                new AsyncResult(Pair.create(mApnContext, 0),
                        DataFailCause.SERVICE_TEMPORARILY_UNAVAILABLE, new Exception())));
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());
        // Ensure handover is not completed yet
        verify(handler, never()).sendMessageDelayed(any(), anyLong());
    }
}