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

Commit bff8ff33 authored by SongFerng Wang's avatar SongFerng Wang Committed by Android (Google) Code Review
Browse files

Merge "Add NR advanced capable by PCO" into sc-dev

parents f84e7d42 4d607dab
Loading
Loading
Loading
Loading
+70 −16
Original line number Original line Diff line number Diff line
@@ -27,15 +27,19 @@ import android.telephony.AccessNetworkConstants;
import android.telephony.Annotation;
import android.telephony.Annotation;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierConfigManager;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PcoData;
import android.telephony.PhysicalChannelConfig;
import android.telephony.PhysicalChannelConfig;
import android.telephony.ServiceState;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.text.TextUtils;
import android.text.TextUtils;


import com.android.internal.telephony.dataconnection.DataConnection;
import com.android.internal.telephony.dataconnection.DcController;
import com.android.internal.telephony.dataconnection.DcController;
import com.android.internal.telephony.dataconnection.DcController.PhysicalLinkState;
import com.android.internal.telephony.dataconnection.DcController.PhysicalLinkState;
import com.android.internal.telephony.dataconnection.DcTracker;
import com.android.internal.telephony.util.ArrayUtils;
import com.android.internal.telephony.util.ArrayUtils;
import com.android.internal.util.IState;
import com.android.internal.util.IState;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.IndentingPrintWriter;
@@ -93,8 +97,9 @@ public class NetworkTypeController extends StateMachine {
    private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11;
    private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11;
    private static final int EVENT_INITIALIZE = 12;
    private static final int EVENT_INITIALIZE = 12;
    private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13;
    private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13;
    private static final int EVENT_PCO_DATA_CHANGED = 14;


    private static final String[] sEvents = new String[EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED + 1];
    private static final String[] sEvents = new String[EVENT_PCO_DATA_CHANGED + 1];
    static {
    static {
        sEvents[EVENT_UPDATE] = "EVENT_UPDATE";
        sEvents[EVENT_UPDATE] = "EVENT_UPDATE";
        sEvents[EVENT_QUIT] = "EVENT_QUIT";
        sEvents[EVENT_QUIT] = "EVENT_QUIT";
@@ -111,6 +116,7 @@ public class NetworkTypeController extends StateMachine {
        sEvents[EVENT_PREFERRED_NETWORK_MODE_CHANGED] = "EVENT_PREFERRED_NETWORK_MODE_CHANGED";
        sEvents[EVENT_PREFERRED_NETWORK_MODE_CHANGED] = "EVENT_PREFERRED_NETWORK_MODE_CHANGED";
        sEvents[EVENT_INITIALIZE] = "EVENT_INITIALIZE";
        sEvents[EVENT_INITIALIZE] = "EVENT_INITIALIZE";
        sEvents[EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED] = "EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED";
        sEvents[EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED] = "EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED";
        sEvents[EVENT_PCO_DATA_CHANGED] = "EVENT_PCO_DATA_CHANGED";
    }
    }


    private final Phone mPhone;
    private final Phone mPhone;
@@ -142,6 +148,8 @@ public class NetworkTypeController extends StateMachine {
    private String mPreviousState;
    private String mPreviousState;
    private @PhysicalLinkState int mPhysicalLinkState;
    private @PhysicalLinkState int mPhysicalLinkState;
    private boolean mIsPhysicalChannelConfig16Supported;
    private boolean mIsPhysicalChannelConfig16Supported;
    private Boolean mIsNrAdvancedAllowedByPco = false;
    private int mNrAdvancedCapablePcoId = 0;


    /**
    /**
     * NetworkTypeController constructor.
     * NetworkTypeController constructor.
@@ -208,6 +216,7 @@ public class NetworkTypeController extends StateMachine {
        IntentFilter filter = new IntentFilter();
        IntentFilter filter = new IntentFilter();
        filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
        mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
        mPhone.mCi.registerForPcoData(getHandler(), EVENT_PCO_DATA_CHANGED, null);
    }
    }


    private void unRegisterForAllEvents() {
    private void unRegisterForAllEvents() {
@@ -219,6 +228,7 @@ public class NetworkTypeController extends StateMachine {
        mPhone.getServiceStateTracker().unregisterForNrFrequencyChanged(getHandler());
        mPhone.getServiceStateTracker().unregisterForNrFrequencyChanged(getHandler());
        mPhone.getDeviceStateMonitor().unregisterForPhysicalChannelConfigNotifChanged(getHandler());
        mPhone.getDeviceStateMonitor().unregisterForPhysicalChannelConfigNotifChanged(getHandler());
        mPhone.getContext().unregisterReceiver(mIntentReceiver);
        mPhone.getContext().unregisterReceiver(mIntentReceiver);
        mPhone.mCi.unregisterForPcoData(getHandler());
    }
    }


    private void parseCarrierConfigs() {
    private void parseCarrierConfigs() {
@@ -267,6 +277,8 @@ public class NetworkTypeController extends StateMachine {
                        mLtePlusThresholdBandwidth);
                        mLtePlusThresholdBandwidth);
                mAdditionalNrAdvancedBandsList = b.getIntArray(
                mAdditionalNrAdvancedBandsList = b.getIntArray(
                        CarrierConfigManager.KEY_ADDITIONAL_NR_ADVANCED_BANDS_INT_ARRAY);
                        CarrierConfigManager.KEY_ADDITIONAL_NR_ADVANCED_BANDS_INT_ARRAY);
                mNrAdvancedCapablePcoId = b.getInt(
                        CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT);
            }
            }
        }
        }
        createTimerRules(nrIconConfiguration, overrideTimerRule, overrideSecondaryTimerRule);
        createTimerRules(nrIconConfiguration, overrideTimerRule, overrideSecondaryTimerRule);
@@ -486,6 +498,7 @@ public class NetworkTypeController extends StateMachine {
                case EVENT_DATA_RAT_CHANGED:
                case EVENT_DATA_RAT_CHANGED:
                case EVENT_NR_STATE_CHANGED:
                case EVENT_NR_STATE_CHANGED:
                case EVENT_NR_FREQUENCY_CHANGED:
                case EVENT_NR_FREQUENCY_CHANGED:
                case EVENT_PCO_DATA_CHANGED:
                    // ignored
                    // ignored
                    break;
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
@@ -841,24 +854,15 @@ public class NetworkTypeController extends StateMachine {
                        transitionWithTimerTo(mLegacyState);
                        transitionWithTimerTo(mLegacyState);
                    }
                    }
                    break;
                    break;
                case EVENT_PCO_DATA_CHANGED:
                    handlePcoData((AsyncResult) msg.obj);
                    break;
                case EVENT_NR_FREQUENCY_CHANGED:
                case EVENT_NR_FREQUENCY_CHANGED:
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (mIsPhysicalChannelConfig16Supported) {
                    if (mIsPhysicalChannelConfig16Supported) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                    }
                    }
                    if (!isNrConnected()) {
                    updateNrAdvancedState();
                        log("NR state changed. Sending EVENT_NR_STATE_CHANGED");
                        sendMessage(EVENT_NR_STATE_CHANGED);
                        break;
                    }
                    if (!isNrAdvanced()) {
                        // STATE_CONNECTED_NR_ADVANCED -> STATE_CONNECTED
                        transitionWithTimerTo(mNrConnectedState);
                    } else {
                        // STATE_CONNECTED -> STATE_CONNECTED_NR_ADVANCED
                        transitionTo(mNrConnectedState);
                    }
                    mIsNrAdvanced = isNrAdvanced();
                    break;
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    AsyncResult ar = (AsyncResult) msg.obj;
@@ -881,6 +885,47 @@ public class NetworkTypeController extends StateMachine {
        public String getName() {
        public String getName() {
            return mIsNrAdvanced ? STATE_CONNECTED_NR_ADVANCED : STATE_CONNECTED;
            return mIsNrAdvanced ? STATE_CONNECTED_NR_ADVANCED : STATE_CONNECTED;
        }
        }

        private void updateNrAdvancedState() {
            if (!isNrConnected()) {
                log("NR state changed. Sending EVENT_NR_STATE_CHANGED");
                sendMessage(EVENT_NR_STATE_CHANGED);
                return;
            }
            if (!isNrAdvanced()) {
                // STATE_CONNECTED_NR_ADVANCED -> STATE_CONNECTED
                transitionWithTimerTo(mNrConnectedState);
            } else {
                // STATE_CONNECTED -> STATE_CONNECTED_NR_ADVANCED
                transitionTo(mNrConnectedState);
            }
            mIsNrAdvanced = isNrAdvanced();
        }

        private void handlePcoData(AsyncResult ar) {
            if (ar.exception != null) {
                loge("PCO_DATA exception: " + ar.exception);
                return;
            }
            PcoData pcodata = (PcoData) ar.result;
            if (pcodata == null) {
                return;
            }
            log("EVENT_PCO_DATA_CHANGED: pco data: " + pcodata);
            DcTracker dcTracker = mPhone.getDcTracker(
                    AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
            DataConnection dc =
                    dcTracker != null ? dcTracker.getDataConnectionByContextId(pcodata.cid) : null;
            ApnSetting apnSettings = dc != null ? dc.getApnSetting() : null;
            if (apnSettings != null && apnSettings.canHandleType(ApnSetting.TYPE_DEFAULT)
                    && mNrAdvancedCapablePcoId > 0
                    && pcodata.pcoId == mNrAdvancedCapablePcoId
            ) {
                log("EVENT_PCO_DATA_CHANGED: Nr Advanced is allowed by PCO.");
                mIsNrAdvancedAllowedByPco = pcodata.contents[0] == 1;
                updateNrAdvancedState();
            }
        }
    }
    }


    private final NrConnectedState mNrConnectedState = new NrConnectedState();
    private final NrConnectedState mNrConnectedState = new NrConnectedState();
@@ -1084,7 +1129,7 @@ public class NetworkTypeController extends StateMachine {
    }
    }


    private boolean isNrAdvanced() {
    private boolean isNrAdvanced() {
        return isNrMmwave() || isAdditionalNrAdvancedBand();
        return isNrAdvancedCapable() && (isNrMmwave() || isAdditionalNrAdvancedBand());
    }
    }


    private boolean isNrMmwave() {
    private boolean isNrMmwave() {
@@ -1108,6 +1153,13 @@ public class NetworkTypeController extends StateMachine {
        return false;
        return false;
    }
    }


    private boolean isNrAdvancedCapable() {
        if (mNrAdvancedCapablePcoId > 0) {
            return mIsNrAdvancedAllowedByPco;
        }
        return true;
    }

    private boolean isLte(int rat) {
    private boolean isLte(int rat) {
        return rat == TelephonyManager.NETWORK_TYPE_LTE
        return rat == TelephonyManager.NETWORK_TYPE_LTE
                || rat == TelephonyManager.NETWORK_TYPE_LTE_CA;
                || rat == TelephonyManager.NETWORK_TYPE_LTE_CA;
@@ -1156,7 +1208,8 @@ public class NetworkTypeController extends StateMachine {
                + ", mIsSecondaryTimerActive=" + mIsSecondaryTimerActive
                + ", mIsSecondaryTimerActive=" + mIsSecondaryTimerActive
                + ", mPrimaryTimerState=" + mPrimaryTimerState
                + ", mPrimaryTimerState=" + mPrimaryTimerState
                + ", mSecondaryTimerState=" + mSecondaryTimerState
                + ", mSecondaryTimerState=" + mSecondaryTimerState
                + ", mPreviousState=" + mPreviousState;
                + ", mPreviousState=" + mPreviousState
                + ", misNrAdvanced=" + isNrAdvanced();
    }
    }


    @Override
    @Override
@@ -1181,6 +1234,7 @@ public class NetworkTypeController extends StateMachine {
        pw.println("mPhysicalLinkState=" + mPhysicalLinkState);
        pw.println("mPhysicalLinkState=" + mPhysicalLinkState);
        pw.println("mAdditionalNrAdvancedBandsList="
        pw.println("mAdditionalNrAdvancedBandsList="
                + Arrays.toString(mAdditionalNrAdvancedBandsList));
                + Arrays.toString(mAdditionalNrAdvancedBandsList));
        pw.println("mNrAdvancedCapablePcoId=" + mNrAdvancedCapablePcoId);
        pw.decreaseIndent();
        pw.decreaseIndent();
        pw.flush();
        pw.flush();
    }
    }
+4 −1
Original line number Original line Diff line number Diff line
@@ -537,7 +537,10 @@ public class DataConnection extends StateMachine {
        return mCid;
        return mCid;
    }
    }


    ApnSetting getApnSetting() {
    /**
     * @return DataConnection's ApnSetting.
     */
    public ApnSetting getApnSetting() {
        return mApnSetting;
        return mApnSetting;
    }
    }


+96 −0
Original line number Original line Diff line number Diff line
@@ -29,14 +29,17 @@ import android.os.Looper;
import android.os.PersistableBundle;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierConfigManager;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PcoData;
import android.telephony.PhysicalChannelConfig;
import android.telephony.PhysicalChannelConfig;
import android.telephony.RadioAccessFamily;
import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState;
import android.telephony.ServiceState;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.testing.AndroidTestingRunner;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper;


import com.android.internal.telephony.dataconnection.DataConnection;
import com.android.internal.telephony.dataconnection.DcController;
import com.android.internal.telephony.dataconnection.DcController;
import com.android.internal.util.IState;
import com.android.internal.util.IState;
import com.android.internal.util.StateMachine;
import com.android.internal.util.StateMachine;
@@ -45,6 +48,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Before;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;
import org.mockito.Mock;


import java.lang.reflect.Method;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.ArrayList;
@@ -66,9 +70,14 @@ public class NetworkTypeControllerTest extends TelephonyTest {
    private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11;
    private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11;
    private static final int EVENT_INITIALIZE = 12;
    private static final int EVENT_INITIALIZE = 12;
    private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13;
    private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13;
    private static final int EVENT_PCO_DATA_CHANGED = 14;


    private NetworkTypeController mNetworkTypeController;
    private NetworkTypeController mNetworkTypeController;
    private PersistableBundle mBundle;
    private PersistableBundle mBundle;
    @Mock
    DataConnection mDataConnection;
    @Mock
    ApnSetting mApnSetting;


    private IState getCurrentState() throws Exception {
    private IState getCurrentState() throws Exception {
        Method method = StateMachine.class.getDeclaredMethod("getCurrentState");
        Method method = StateMachine.class.getDeclaredMethod("getCurrentState");
@@ -390,6 +399,93 @@ public class NetworkTypeControllerTest extends TelephonyTest {
        assertEquals("connected", getCurrentState().getName());
        assertEquals("connected", getCurrentState().getName());
    }
    }


    @Test
    public void testTransitionToCurrentStateNrConnectedWithNrAdvancedCapable() throws Exception {
        assertEquals("DefaultState", getCurrentState().getName());
        doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
        doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
        doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
        mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0);
        broadcastCarrierConfigs();

        mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
        processAllMessages();
        assertEquals("connected_mmwave", getCurrentState().getName());
    }

    @Test
    public void testTransitionToCurrentStateNrConnectedWithPcoAndNoNrAdvancedCapable()
            throws Exception {
        assertEquals("DefaultState", getCurrentState().getName());
        doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
        doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
        doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
        mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
        broadcastCarrierConfigs();
        int cid = 1;
        byte[] contents = new byte[]{0};
        doReturn(mDataConnection).when(mDcTracker).getDataConnectionByContextId(cid);
        doReturn(mApnSetting).when(mDataConnection).getApnSetting();
        doReturn(true).when(mApnSetting).canHandleType(ApnSetting.TYPE_DEFAULT);
        mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
        broadcastCarrierConfigs();


        mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED,
                new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null));
        mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
        processAllMessages();
        assertEquals("connected", getCurrentState().getName());
    }

    @Test
    public void testTransitionToCurrentStateNrConnectedWithWrongPcoAndNoNrAdvancedCapable()
            throws Exception {
        assertEquals("DefaultState", getCurrentState().getName());
        doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
        doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
        doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
        mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
        broadcastCarrierConfigs();
        int cid = 1;
        byte[] contents = new byte[]{1};
        doReturn(mDataConnection).when(mDcTracker).getDataConnectionByContextId(cid);
        doReturn(mApnSetting).when(mDataConnection).getApnSetting();
        doReturn(true).when(mApnSetting).canHandleType(ApnSetting.TYPE_DEFAULT);
        mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF00);
        broadcastCarrierConfigs();


        mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED,
                new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null));
        mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
        processAllMessages();
        assertEquals("connected", getCurrentState().getName());
    }

    @Test
    public void testTransitionToCurrentStateNrConnectedWithNrAdvancedCapableAndPco()
            throws Exception {
        assertEquals("DefaultState", getCurrentState().getName());
        doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
        doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
        doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
        int cid = 1;
        byte[] contents = new byte[]{1};
        doReturn(mDataConnection).when(mDcTracker).getDataConnectionByContextId(cid);
        doReturn(mApnSetting).when(mDataConnection).getApnSetting();
        doReturn(true).when(mApnSetting).canHandleType(ApnSetting.TYPE_DEFAULT);
        mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
        broadcastCarrierConfigs();


        mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED,
                new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null));
        mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
        processAllMessages();
        assertEquals("connected_mmwave", getCurrentState().getName());
    }

    @Test
    @Test
    public void testEventDataRatChanged() throws Exception {
    public void testEventDataRatChanged() throws Exception {
        testTransitionToCurrentStateLegacy();
        testTransitionToCurrentStateLegacy();