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

Commit 071830ad authored by Xiangyu/Malcolm Chen's avatar Xiangyu/Malcolm Chen Committed by Gerrit Code Review
Browse files

Merge changes from topic "122255288"

* changes:
  Return correct preferredDataSubscription from PhoneSwitcher.
  Adding callback for setPreferredDataSubscriptionId.
parents 420dbfb6 1114813e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ class PhoneConfigurationModels {
        List<ModemInfo> logicalModemList = new ArrayList<>();
        logicalModemList.add(modemInfo1);
        logicalModemList.add(modemInfo2);
        DSDS_CAPABILITY = new PhoneCapability(1, 2, 0, logicalModemList, false);
        DSDS_CAPABILITY = new PhoneCapability(1, 2, 0, logicalModemList, true);

        logicalModemList = new ArrayList<>();
        logicalModemList.add(modemInfo1);
+87 −22
Original line number Diff line number Diff line
@@ -22,6 +22,9 @@ import static android.telephony.PhoneStateListener.LISTEN_PRECISE_CALL_STATE;
import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
import static android.telephony.SubscriptionManager.INVALID_PHONE_INDEX;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static android.telephony.TelephonyManager.SET_OPPORTUNISTIC_SUB_INVALID_PARAMETER;
import static android.telephony.TelephonyManager.SET_OPPORTUNISTIC_SUB_SUCCESS;
import static android.telephony.TelephonyManager.SET_OPPORTUNISTIC_SUB_VALIDATION_FAILED;

import android.content.BroadcastReceiver;
import android.content.Context;
@@ -42,6 +45,7 @@ import android.os.Message;
import android.os.Registrant;
import android.os.RegistrantList;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.telephony.PhoneCapability;
import android.telephony.PhoneStateListener;
import android.telephony.PreciseCallState;
@@ -113,13 +117,15 @@ public class PhoneSwitcher extends Handler {

    private int mPhoneIdInCall = SubscriptionManager.INVALID_PHONE_INDEX;

    private ISetOpportunisticDataCallback mSetOpptSubCallback;

    private static final int EVENT_DEFAULT_SUBSCRIPTION_CHANGED   = 101;
    private static final int EVENT_SUBSCRIPTION_CHANGED           = 102;
    private static final int EVENT_REQUEST_NETWORK                = 103;
    private static final int EVENT_RELEASE_NETWORK                = 104;
    private static final int EVENT_EMERGENCY_TOGGLE               = 105;
    private static final int EVENT_RADIO_CAPABILITY_CHANGED       = 106;
    private static final int EVENT_PREFERRED_SUBSCRIPTION_CHANGED = 107;
    private static final int EVENT_CHANGE_PREFERRED_SUBSCRIPTION  = 107;
    private static final int EVENT_RADIO_AVAILABLE                = 108;
    private static final int EVENT_PHONE_IN_CALL_CHANGED          = 109;
    private static final int EVENT_NETWORK_VALIDATION_DONE        = 110;
@@ -349,9 +355,16 @@ public class PhoneSwitcher extends Handler {
                resendRilCommands(msg);
                break;
            }
            case EVENT_PREFERRED_SUBSCRIPTION_CHANGED: {
                onEvaluate(REQUESTS_UNCHANGED, "preferredDataSubscriptionIdChanged");
                registerDefaultNetworkChangeCallback();
            case EVENT_CHANGE_PREFERRED_SUBSCRIPTION: {
                int subId = msg.arg1;
                boolean needValidation = (msg.arg2 == 1);
                ISetOpportunisticDataCallback callback =
                        (ISetOpportunisticDataCallback) msg.obj;
                if (SubscriptionManager.isUsableSubscriptionId(subId)) {
                    setOpportunisticDataSubscription(subId, needValidation, callback);
                } else {
                    unsetOpportunisticDataSubscription(callback);
                }
                break;
            }
            case EVENT_RADIO_AVAILABLE: {
@@ -779,20 +792,34 @@ public class PhoneSwitcher extends Handler {
     * subscription. It has to be an active subscription, and PhoneSwitcher will try to validate
     * it first if needed.
     */
    public void setOpportunisticDataSubscription(int subId) {
    private void setOpportunisticDataSubscription(int subId, boolean needValidation,
            ISetOpportunisticDataCallback callback) {
        if (!mSubscriptionController.isActiveSubId(subId)) {
            log("Can't switch data to inactive subId " + subId);
            sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_INVALID_PARAMETER);
            return;
        }

        if (mValidator.isValidating()
                && (!needValidation || subId != mValidator.getSubIdInValidation())) {
            mValidator.stopValidation();
        }

        if (subId == mPreferredDataSubId) {
            sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_SUCCESS);
            return;
        }

        logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS);
        // If validation feature is not supported, set it directly. Otherwise,
        // start validation on the subscription first.
        if (!CellularNetworkValidator.isValidationFeatureSupported()) {
            setPreferredDataSubscriptionId(subId);
        } else {
        if (CellularNetworkValidator.isValidationFeatureSupported() && needValidation) {
            logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS);
            mSetOpptSubCallback = callback;
            mValidator.validate(subId, DEFAULT_VALIDATION_EXPIRATION_TIME,
                    false, mValidationCallback);
        } else {
            setPreferredSubscription(subId);
            sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_SUCCESS);
        }
    }

@@ -800,32 +827,66 @@ public class PhoneSwitcher extends Handler {
     * Unset opportunistic data subscription. It's an indication to switch Internet data back
     * from opportunistic subscription to primary subscription.
     */
    public void unsetOpportunisticDataSubscription() {
        logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS);
        if (CellularNetworkValidator.isValidationFeatureSupported()
                && mValidator.isValidating()) {
    private void unsetOpportunisticDataSubscription(ISetOpportunisticDataCallback callback) {
        if (mValidator.isValidating()) {
            mValidator.stopValidation();
        }

        // Set mPreferredDataSubId back to DEFAULT_SUBSCRIPTION_ID. This will trigger
        // data switch to mDefaultDataSubId.
        setPreferredDataSubscriptionId(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
        setPreferredSubscription(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
        sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_SUCCESS);
    }

    private void sendSetOpptCallbackHelper(ISetOpportunisticDataCallback callback, int result) {
        if (callback == null) return;
        try {
            callback.onComplete(result);
        } catch (RemoteException exception) {
            log("RemoteException " + exception);
        }
    }

    /**
     * Set opportunistic data subscription.
     */
    private void setPreferredSubscription(int subId) {
        if (mPreferredDataSubId != subId) {
            mPreferredDataSubId = subId;
            logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS);
            onEvaluate(REQUESTS_UNCHANGED, "preferredDataSubscriptionIdChanged");
            notifyPreferredDataSubIdChanged();
            registerDefaultNetworkChangeCallback();
        }
    }

    private void onValidationDone(int subId, boolean passed) {
        log("Network validation " + (passed ? "passed" : "failed")
                + " on subId " + subId);
        mValidator.stopValidation();
        if (passed) setPreferredDataSubscriptionId(subId);
        if (passed) setPreferredSubscription(subId);

        // Trigger callback if needed
        sendSetOpptCallbackHelper(mSetOpptSubCallback, passed ? SET_OPPORTUNISTIC_SUB_SUCCESS
                : SET_OPPORTUNISTIC_SUB_VALIDATION_FAILED);
        mSetOpptSubCallback = null;
    }

    // TODO b/123598154: rename preferredDataSub to opportunisticSubId.
    private void setPreferredDataSubscriptionId(int subId) {
        if (mPreferredDataSubId != subId) {
            log("setPreferredDataSubscriptionId subId changed to " + subId);
            mPreferredDataSubId = subId;
            Message msg = PhoneSwitcher.this.obtainMessage(EVENT_PREFERRED_SUBSCRIPTION_CHANGED);
            msg.sendToTarget();
    public void trySetPreferredSubscription(int subId, boolean needValidation,
            ISetOpportunisticDataCallback callback) {
        log("Try set preferred subscription to subId " + subId
                + (needValidation ? " with " : " without ") + "validation");
        PhoneSwitcher.this.obtainMessage(EVENT_CHANGE_PREFERRED_SUBSCRIPTION,
                subId, needValidation ? 1 : 0, callback).sendToTarget();
    }

    private void notifyPreferredDataSubIdChanged() {
        ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
                "telephony.registry"));
        try {
            tr.notifyPreferredDataSubIdChanged(mPreferredDataSubId);
        } catch (RemoteException ex) {
            // Should never happen because TelephonyRegistry service should always be available.
        }
    }

@@ -843,6 +904,10 @@ public class PhoneSwitcher extends Handler {
                ? HAL_COMMAND_PREFERRED_DATA : HAL_COMMAND_ALLOW_DATA;
    }

    public int getPreferredDataSubscriptionId() {
        return mPreferredDataSubId;
    }

    private void log(String l) {
        Rlog.d(LOG_TAG, l);
        mLocalLog.log(l);
+8 −15
Original line number Diff line number Diff line
@@ -2690,16 +2690,14 @@ public class SubscriptionController extends ISub.Stub {
    }

    @Override
    public void setPreferredDataSubscriptionId(int subId) {
    public void setPreferredDataSubscriptionId(int subId, boolean needValidation,
            ISetOpportunisticDataCallback callback) {
        enforceModifyPhoneState("setPreferredDataSubscriptionId");
        final long token = Binder.clearCallingIdentity();

        try {
            if (SubscriptionManager.isUsableSubscriptionId(subId)) {
                PhoneSwitcher.getInstance().setOpportunisticDataSubscription(subId);
            } else {
                PhoneSwitcher.getInstance().unsetOpportunisticDataSubscription();
            }
            PhoneSwitcher.getInstance().trySetPreferredSubscription(
                    subId, needValidation, callback);
        } finally {
            Binder.restoreCallingIdentity(token);
        }
@@ -2708,17 +2706,12 @@ public class SubscriptionController extends ISub.Stub {
    @Override
    public int getPreferredDataSubscriptionId() {
        enforceReadPrivilegedPhoneState("getPreferredDataSubscriptionId");
        return mPreferredDataSubId;
    }
        final long token = Binder.clearCallingIdentity();

    private void notifyPreferredDataSubIdChanged() {
        ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
                "telephony.registry"));
        try {
            if (DBG) logd("notifyPreferredDataSubIdChanged:");
            tr.notifyPreferredDataSubIdChanged(mPreferredDataSubId);
        } catch (RemoteException ex) {
            // Should never happen because its always available.
            return PhoneSwitcher.getInstance().getPreferredDataSubscriptionId();
        } finally {
            Binder.restoreCallingIdentity(token);
        }
    }

+6 −4
Original line number Diff line number Diff line
@@ -386,13 +386,14 @@ public class PhoneSwitcherTest extends TelephonyTest {
        assertTrue(mDataAllowed[0]);

        // Set sub 2 as preferred sub should make phone 1 activated and phone 0 deactivated.
        mPhoneSwitcher.setOpportunisticDataSubscription(2);
        mPhoneSwitcher.trySetPreferredSubscription(2, false, null);
        waitABit();
        assertFalse(mDataAllowed[0]);
        assertTrue(mDataAllowed[1]);

        // Unset preferred sub should make default data sub (phone 0 / sub 1) activated again.
        mPhoneSwitcher.unsetOpportunisticDataSubscription();
        mPhoneSwitcher.trySetPreferredSubscription(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
                false, null);
        waitABit();
        assertTrue(mDataAllowed[0]);
        assertFalse(mDataAllowed[1]);
@@ -441,7 +442,7 @@ public class PhoneSwitcherTest extends TelephonyTest {
        assertTrue(mPhoneSwitcher.shouldApplyNetworkRequest(mmsRequest, 1));

        // Set sub 2 as preferred sub should make phone 1 preferredDataModem
        mPhoneSwitcher.setOpportunisticDataSubscription(2);
        mPhoneSwitcher.trySetPreferredSubscription(2, false, null);
        waitABit();
        verify(mMockRadioConfig).setPreferredDataModem(eq(1), any());
        verify(mActivePhoneSwitchHandler, times(2)).sendMessageAtTime(any(), anyLong());
@@ -454,7 +455,8 @@ public class PhoneSwitcherTest extends TelephonyTest {
        clearInvocations(mActivePhoneSwitchHandler);

        // Unset preferred sub should make phone0 preferredDataModem again.
        mPhoneSwitcher.unsetOpportunisticDataSubscription();
        mPhoneSwitcher.trySetPreferredSubscription(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
                false, null);
        waitABit();
        verify(mMockRadioConfig).setPreferredDataModem(eq(0), any());
        verify(mActivePhoneSwitchHandler, times(2)).sendMessageAtTime(any(), anyLong());