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

Commit 49929bf7 authored by Jack Yu's avatar Jack Yu Committed by Android (Google) Code Review
Browse files

Merge changes I0219f050,I286d364a into sc-dev

* changes:
  Fixed unexpected handover failure
  Properly handled service temp unavailable case
parents 87ec67ef 66447abc
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -1646,7 +1646,9 @@ public class DcTracker extends Handler {

            if (DBG) log(str.toString());
            apnContext.requestLog(str.toString());
            if (requestType == REQUEST_TYPE_HANDOVER) {
                sendHandoverCompleteMessages(apnContext.getApnTypeBitmask(), false, false);
            }
            return;
        }

@@ -1671,8 +1673,10 @@ public class DcTracker extends Handler {
                String str = "trySetupData: X No APN found retValue=false";
                if (DBG) log(str);
                apnContext.requestLog(str);
                if (requestType == REQUEST_TYPE_HANDOVER) {
                    sendHandoverCompleteMessages(apnContext.getApnTypeBitmask(), false,
                            false);
                }
                return;
            } else {
                apnContext.setWaitingApns(waitingApns);
@@ -1683,7 +1687,8 @@ public class DcTracker extends Handler {
            }
        }

        if (!setupData(apnContext, radioTech, requestType)) {
        if (!setupData(apnContext, radioTech, requestType)
                && requestType == REQUEST_TYPE_HANDOVER) {
            sendHandoverCompleteMessages(apnContext.getApnTypeBitmask(), false, false);
        }
    }
@@ -3080,7 +3085,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);
        }
+46 −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,35 @@ 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());
    }

    @Test
    public void testNormalRequestDoesNotFailHandoverRequest() {
        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.enableApn(ApnSetting.TYPE_IMS, DcTracker.REQUEST_TYPE_NORMAL, null);
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());
        // Ensure handover is not completed yet
        verify(handler, never()).sendMessageDelayed(any(), anyLong());
    }
}