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

Commit c8398905 authored by Stuart Scott's avatar Stuart Scott Committed by Android (Google) Code Review
Browse files

Merge "SubscriptionController uses RAT families to control default data" into lmp-mr1-dev

parents 417798be 4e7f34de
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() {