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

Commit 4e7f34de authored by Stuart Scott's avatar Stuart Scott
Browse files

SubscriptionController uses RAT families to control default data

bug: 18417009

Change-Id: I0c016db0c5adce6e28fc3ffb713d4a4c4d270b51
parent 0f067e2f
Loading
Loading
Loading
Loading
+0 −71
Original line number Diff line number Diff line
@@ -317,18 +317,6 @@ public class PhoneFactory {
            Rlog.e(LOG_TAG, "Settings Exception Reading Dual Sim Voice Call Values");
        }

        // FIXME can this be removed? We should not set defaults
        int phoneId = SubscriptionController.getInstance().getPhoneId(subId);
        // Set subscription to 0 if current subscription is invalid.
        // Ex: multisim.config property is TSTS and subscription is 2.
        // If user is trying to set multisim.config to DSDS and reboots
        // in this case index 2 is invalid so need to set to 0.
        if (phoneId < 0 || phoneId >= TelephonyManager.getDefault().getPhoneCount()) {
            Rlog.i(LOG_TAG, "Subscription is invalid..." + subId + " Set to 0");
            subId = 0;
            setVoiceSubscription(subId);
        }

        return subId;
    }

@@ -391,14 +379,6 @@ public class PhoneFactory {
            Rlog.e(LOG_TAG, "Settings Exception Reading Dual Sim Data Call Values");
        }

        // FIXME can this be removed? We should not set defaults
        int phoneId = SubscriptionController.getInstance().getPhoneId(subId);
        if (phoneId < 0 || phoneId >= TelephonyManager.getDefault().getPhoneCount()) {
            subId = 0;
            Rlog.i(LOG_TAG, "Subscription is invalid..." + subId + " Set to 0");
            setDataSubscription(subId);
        }

        return subId;
    }

@@ -412,60 +392,9 @@ public class PhoneFactory {
            Rlog.e(LOG_TAG, "Settings Exception Reading Dual Sim SMS Values");
        }

        // FIXME can this be removed? We should not set defaults
        int phoneId = SubscriptionController.getInstance().getPhoneId(subId);
        if (phoneId < 0 || phoneId >= TelephonyManager.getDefault().getPhoneCount()) {
            Rlog.i(LOG_TAG, "Subscription is invalid..." + subId + " Set to 0");
            subId = 0;
            setSMSSubscription(subId);
        }

        return subId;
    }

    //FIXME can this be removed, it is only called in getVoiceSubscription
    static public void setVoiceSubscription(int subId) {
        Settings.Global.putInt(sContext.getContentResolver(),
                Settings.Global.MULTI_SIM_VOICE_CALL_SUBSCRIPTION, subId);
        Rlog.d(LOG_TAG, "setVoiceSubscription : " + subId);
    }

    //FIXME can this be removed, it is only called in getDataSubscription
    static public void setDataSubscription(int subId) {
        boolean enabled;

        Settings.Global.putInt(sContext.getContentResolver(),
                Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION, subId);
        Rlog.d(LOG_TAG, "setDataSubscription: " + subId);

        // Update the current mobile data flag
        enabled = TelephonyManager.getIntWithSubId(sContext.getContentResolver(),
                Settings.Global.MOBILE_DATA, subId, 0) != 0;
        Settings.Global.putInt(sContext.getContentResolver(),
                Settings.Global.MOBILE_DATA + subId, enabled ? 1 : 0);
        Rlog.d(LOG_TAG, "set mobile_data: " + enabled);

        // Update the current data roaming flag
        enabled = TelephonyManager.getIntWithSubId(sContext.getContentResolver(),
                Settings.Global.DATA_ROAMING, subId, 0) != 0;
        Settings.Global.putInt(sContext.getContentResolver(),
                Settings.Global.DATA_ROAMING + subId, enabled ? 1 : 0);
        Rlog.d(LOG_TAG, "set data_roaming: " + enabled);
    }

    //FIXME can this be removed, it is only called in getSMSSubscription
    static public void setSMSSubscription(int subId) {
        Settings.Global.putInt(sContext.getContentResolver(),
                Settings.Global.MULTI_SIM_SMS_SUBSCRIPTION, subId);

        Intent intent = new Intent("com.android.mms.transaction.SEND_MESSAGE");
        sContext.sendBroadcast(intent);

        // Change occured in SMS preferred sub, update the default
        // SMS interface Manager object with the new SMS preferred subscription.
        Rlog.d(LOG_TAG, "setSMSSubscription : " + subId);
    }

    /**
     * Makes a {@link ImsPhone} object.
     * @return the {@code ImsPhone} object or null if the exception occured
+35 −23
Original line number Diff line number Diff line
@@ -117,7 +117,7 @@ public class ProxyController {
        return sProxyController;
    }

    static public ProxyController getInstance() {
    public static ProxyController getInstance() {
        return sProxyController;
    }

@@ -153,7 +153,10 @@ public class ProxyController {

        // Clear to be sure we're in the initial state
        clearTransaction();

        for (int i = 0; i < mProxyPhones.length; i++) {
            mProxyPhones[i].registerForRadioCapabilityChanged(
                    mHandler, EVENT_NOTIFICATION_RC_CHANGED, null);
        }
        logd("Constructor - Exit");
    }

@@ -231,6 +234,8 @@ public class ProxyController {
        // is one as this is a programming error.
        synchronized (mSetRadioAccessFamilyStatus) {
            for (int i = 0; i < mProxyPhones.length; i++) {
                logd("setRadioCapability: mSetRadioAccessFamilyStatus[" + i + "]="
                        + mSetRadioAccessFamilyStatus[i]);
                if (mSetRadioAccessFamilyStatus[i] != SET_RC_STATUS_IDLE) {
                    throw new RuntimeException("setRadioCapability: Phone" + i + " is not idle");
                }
@@ -252,10 +257,11 @@ public class ProxyController {
        mHandler.postDelayed(mSetRadioCapabilityRunnable, SET_RC_TIMEOUT_WAITING_MSEC);

        synchronized (mSetRadioAccessFamilyStatus) {
            logd("setRadioCapability: new request session id:" + mRadioCapabilitySessionId);
            logd("setRadioCapability: new request session id=" + mRadioCapabilitySessionId);
            mRadioAccessFamilyStatusCounter = rafs.length;
            for (int i = 0; i < rafs.length; i++) {
                int phoneId = rafs[i].getPhoneId();
                logd("setRadioCapability: phoneId=" + phoneId + " status=STARTING");
                mSetRadioAccessFamilyStatus[phoneId] = SET_RC_STATUS_STARTING;
                mOldRadioAccessFamily[phoneId] = mProxyPhones[phoneId].getRadioAccessFamily();
                mNewRadioAccessFamily[phoneId] = rafs[i].getRadioAccessFamily();
@@ -278,7 +284,7 @@ public class ProxyController {
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            logd("handleMessage msg.what:" + msg.what);
            logd("handleMessage msg.what=" + msg.what);
            switch (msg.what) {
                case EVENT_START_RC_RESPONSE:
                    onStartRadioCapabilityResponse(msg);
@@ -315,26 +321,26 @@ public class ProxyController {
                return;
            }
            mRadioAccessFamilyStatusCounter--;
            int id = rc.getPhoneId();
            if (((AsyncResult) msg.obj).exception != null) {
                logd("onStartRadioCapabilityResponse: Error response session=" + rc.getSession());
                mSetRadioAccessFamilyStatus[rc.getPhoneId()] = SET_RC_STATUS_FAIL;
                logd("onStartRadioCapabilityResponse: phoneId=" + id + " status=FAIL");
                mSetRadioAccessFamilyStatus[id] = SET_RC_STATUS_FAIL;
            } else {
                mSetRadioAccessFamilyStatus[rc.getPhoneId()] = SET_RC_STATUS_STARTED;
                logd("onStartRadioCapabilityResponse: phoneId=" + id + " status=STARTED");
                mSetRadioAccessFamilyStatus[id] = SET_RC_STATUS_STARTED;
            }

            if (mRadioAccessFamilyStatusCounter == 0) {
                mHandler.removeCallbacks(mSetRadioCapabilityRunnable);
                resetRadioAccessFamilyStatusCounter();
                boolean success = checkAllRadioCapabilitySuccess();
                logd("onStartRadioCapabilityResponse: success:" + success);
                logd("onStartRadioCapabilityResponse: success=" + success);
                if (!success) {
                    issueFinish(RadioCapability.RC_STATUS_FAIL,
                            mRadioCapabilitySessionId);
                } else {
                    // All logical modem accepted the new radio access family, issue the APPLY
                    for (int i = 0; i < mProxyPhones.length; i++) {
                        mProxyPhones[i].registerForRadioCapabilityChanged(
                                        mHandler, EVENT_NOTIFICATION_RC_CHANGED, null);
                        sendRadioCapabilityRequest(
                            i,
                            mRadioCapabilitySessionId,
@@ -343,6 +349,8 @@ public class ProxyController {
                            mLogicalModemIds[i],
                            RadioCapability.RC_STATUS_NONE,
                            EVENT_APPLY_RC_RESPONSE);

                        logd("onStartRadioCapabilityResponse: phoneId=" + i + " status=APPLYING");
                        mSetRadioAccessFamilyStatus[i] = SET_RC_STATUS_APPLYING;
                    }
                }
@@ -365,8 +373,9 @@ public class ProxyController {
        if (((AsyncResult) msg.obj).exception != null) {
            synchronized (mSetRadioAccessFamilyStatus) {
                logd("onApplyRadioCapabilityResponse: Error response session=" + rc.getSession());
                mSetRadioAccessFamilyStatus[rc.getPhoneId()] = SET_RC_STATUS_FAIL;
                mProxyPhones[rc.getPhoneId()].unregisterForRadioCapabilityChanged(mHandler);
                int id = rc.getPhoneId();
                logd("onApplyRadioCapabilityResponse: phoneId=" + id + " status=FAIL");
                mSetRadioAccessFamilyStatus[id] = SET_RC_STATUS_FAIL;
            }
        } else {
            logd("onApplyRadioCapabilityResponse: Valid start expecting notification rc=" + rc);
@@ -393,17 +402,19 @@ public class ProxyController {
                return;
            }

            int id = rc.getPhoneId();
            if ((((AsyncResult) msg.obj).exception != null) ||
                    (rc.getStatus() == RadioCapability.RC_STATUS_FAIL)) {
                mSetRadioAccessFamilyStatus[rc.getPhoneId()] = SET_RC_STATUS_FAIL;
                logd("onNotificationRadioCapabilityChanged: phoneId=" + id + " status=FAIL");
                mSetRadioAccessFamilyStatus[id] = SET_RC_STATUS_FAIL;
            } else {
                mSetRadioAccessFamilyStatus[rc.getPhoneId()] = SET_RC_STATUS_SUCCESS;
                logd("onNotificationRadioCapabilityChanged: phoneId=" + id + " status=SUCCESS");
                mSetRadioAccessFamilyStatus[id] = SET_RC_STATUS_SUCCESS;
            }
            mProxyPhones[rc.getPhoneId()]
                    .unregisterForRadioCapabilityChanged(mHandler);

            mRadioAccessFamilyStatusCounter--;
            if (mRadioAccessFamilyStatusCounter == 0) {
                logd("onNotificationRadioCapabilityChanged: removing callback from handler");
                mHandler.removeCallbacks(mSetRadioCapabilityRunnable);
                resetRadioAccessFamilyStatusCounter();
                boolean success = checkAllRadioCapabilitySuccess();
@@ -431,7 +442,7 @@ public class ProxyController {
            return;
        }
        synchronized (mSetRadioAccessFamilyStatus) {
            logd(" onFinishRadioCapabilityResponse mRadioAccessFamilyStatusCounter:"
            logd(" onFinishRadioCapabilityResponse mRadioAccessFamilyStatusCounter="
                    + mRadioAccessFamilyStatusCounter);
            mRadioAccessFamilyStatusCounter--;
            if (mRadioAccessFamilyStatusCounter == 0) {
@@ -445,7 +456,7 @@ public class ProxyController {
        synchronized(mSetRadioAccessFamilyStatus) {
            for (int i = 0; i < mProxyPhones.length; i++) {
                if (mSetRadioAccessFamilyStatus[i] != SET_RC_STATUS_FAIL) {
                    logd("issueFinish: Phone" + i + " sessionId=" + sessionId
                    logd("issueFinish: phoneId=" + i + " sessionId=" + sessionId
                            + " status=" + status);
                    sendRadioCapabilityRequest(
                        i,
@@ -456,6 +467,7 @@ public class ProxyController {
                        status,
                        EVENT_FINISH_RC_RESPONSE);
                    if (status == RadioCapability.RC_STATUS_FAIL) {
                        logd("issueFinish: phoneId: " + i + " status: FAIL");
                        // At least one failed, mark them all failed.
                        mSetRadioAccessFamilyStatus[i] = SET_RC_STATUS_FAIL;
                    }
@@ -471,12 +483,12 @@ public class ProxyController {
        // Create the intent to broadcast
        Intent intent;
        boolean success = checkAllRadioCapabilitySuccess();
        logd("onFinishRadioCapabilityResponse: success:" + success);
        logd("onFinishRadioCapabilityResponse: success=" + success);
        if (success) {
            ArrayList<RadioAccessFamily> phoneRAFList = new ArrayList<RadioAccessFamily>();
            for (int i = 0; i < mProxyPhones.length; i++) {
                int raf = mProxyPhones[i].getRadioAccessFamily();
                logd("radioAccessFamily[" + i + "]:" + raf);
                logd("radioAccessFamily[" + i + "]=" + raf);
                RadioAccessFamily phoneRC = new RadioAccessFamily(i, raf);
                phoneRAFList.add(phoneRC);
            }
@@ -496,9 +508,10 @@ public class ProxyController {

    // Clear this transaction
    private void clearTransaction() {
        logd("clearTransaction:");
        logd("clearTransaction");
        synchronized(mSetRadioAccessFamilyStatus) {
            for (int i = 0; i < mProxyPhones.length; i++) {
                logd("clearTransaction: phoneId=" + i + " status=IDLE");
                mSetRadioAccessFamilyStatus[i] = SET_RC_STATUS_IDLE;
                mOldRadioAccessFamily[i] = 0;
                mNewRadioAccessFamily[i] = 0;
@@ -544,7 +557,6 @@ public class ProxyController {
    private class RadioCapabilityRunnable implements Runnable {
        private int mSessionId;
        public  RadioCapabilityRunnable() {

        }

        public void setTimeoutState(int sessionId) {
+2 −0
Original line number Diff line number Diff line
@@ -3121,6 +3121,8 @@ public final class RIL extends BaseCommands implements CommandsInterface {
                setCdmaSubscriptionSource(mCdmaSubscription, null);
                setCellInfoListRate(Integer.MAX_VALUE, null);
                notifyRegistrantsRilConnectionChanged(((int[])ret)[0]);

                getRadioCapability(null);
                break;
            }
            case RIL_UNSOL_CELL_INFO_LIST: {
+25 −3
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.provider.Settings;
import android.telephony.RadioAccessFamily;
import android.telephony.Rlog;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -1168,12 +1169,33 @@ public class SubscriptionController extends ISub.Stub {
        }
        logdl("[setDefaultDataSubId] subId=" + subId);

        Settings.Global.putInt(mContext.getContentResolver(),
                Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION, subId);
        broadcastDefaultDataSubIdChanged(subId);
        int len = sProxyPhones.length;
        logdl("[setDefaultDataSubId] num phones=" + len);

        RadioAccessFamily[] rafs = new RadioAccessFamily[len];
        for (int phoneId = 0; phoneId < len; phoneId++) {
            PhoneProxy phone = sProxyPhones[phoneId];
            int raf = phone.getRadioAccessFamily();
            int id = phone.getSubId();
            logdl("[setDefaultDataSubId] phoneId=" + phoneId + " subId=" + id + " RAF=" + raf);
            // TODO(stuartscott): Need to set 3G or 2G depending on user's preference and modem
            // supported capabilities
            if (id == subId) {
                raf |= RadioAccessFamily.RAF_UMTS;
            } else {
                raf &= ~RadioAccessFamily.RAF_UMTS;
            }
            logdl("[setDefaultDataSubId] newRAF=" + raf);
            rafs[phoneId] = new RadioAccessFamily(phoneId, raf);
        }
        ProxyController.getInstance().setRadioCapability(rafs);

        // FIXME is this still needed?
        updateAllDataConnectionTrackers();

        Settings.Global.putInt(mContext.getContentResolver(),
                Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION, subId);
        broadcastDefaultDataSubIdChanged(subId);
    }

    private void updateAllDataConnectionTrackers() {